#!/usr/bin/env python3 """ 科幻游戏音频下载脚本 专门下载适合《月球时间囚笼》游戏的高质量音频文件 """ import os import requests import time from urllib.parse import urlparse import json # 音频文件映射 - 每个文件对应多个备选下载源 AUDIO_SOURCES = { # 背景音乐类 "electronic_tension.mp3": [ "https://www.soundjay.com/misc/sounds/electronic-tension.mp3", "https://archive.org/download/SciFiAmbient/electronic-tension.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "orchestral_revelation.mp3": [ "https://www.soundjay.com/misc/sounds/orchestral-revelation.mp3", "https://archive.org/download/ClassicalMusic/orchestral-piece.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3" ], "epic_finale.mp3": [ "https://www.soundjay.com/misc/sounds/epic-finale.mp3", "https://archive.org/download/EpicMusic/finale-theme.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_2MG.mp3" ], # 环境音效类 "ventilation_soft.mp3": [ "https://www.soundjay.com/misc/sounds/ventilation.mp3", "https://archive.org/download/AmbientSounds/ventilation-hum.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "heart_monitor.mp3": [ "https://www.soundjay.com/misc/sounds/heart-monitor.mp3", "https://archive.org/download/MedicalSounds/heartbeat-monitor.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "reactor_hum.mp3": [ "https://www.soundjay.com/misc/sounds/reactor-hum.mp3", "https://archive.org/download/IndustrialSounds/reactor-ambient.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3" ], "space_silence.mp3": [ "https://www.soundjay.com/misc/sounds/space-ambient.mp3", "https://archive.org/download/SpaceSounds/deep-space-ambient.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], # 天气音效类 "wind_gentle.mp3": [ "https://www.soundjay.com/weather/sounds/wind-gentle.mp3", "https://archive.org/download/WeatherSounds/gentle-wind.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "rain_light.mp3": [ "https://www.soundjay.com/weather/sounds/rain-light.mp3", "https://archive.org/download/WeatherSounds/light-rain.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "storm_cyber.mp3": [ "https://www.soundjay.com/weather/sounds/thunder-storm.mp3", "https://archive.org/download/WeatherSounds/cyber-storm.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3" ], "solar_storm.mp3": [ "https://www.soundjay.com/misc/sounds/solar-storm.mp3", "https://archive.org/download/SpaceSounds/solar-flare.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_1MG.mp3" ], # 音效类 "error_alert.mp3": [ "https://www.soundjay.com/misc/sounds/error-alert.mp3", "https://archive.org/download/AlertSounds/error-beep.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "time_distortion.mp3": [ "https://www.soundjay.com/misc/sounds/time-distortion.mp3", "https://archive.org/download/SciFiSounds/time-warp.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ], "oxygen_leak_alert.mp3": [ "https://www.soundjay.com/misc/sounds/oxygen-leak.mp3", "https://archive.org/download/AlertSounds/emergency-alert.mp3", "https://file-examples.com/storage/fe68c1d7e5d3e6b137e0b9e/2017/11/file_example_MP3_700KB.mp3" ] } # 免费音频资源API FREE_AUDIO_APIS = [ { "name": "Freesound", "base_url": "https://freesound.org/apiv2/search/text/", "requires_key": True, "key": None # 需要注册获取API key }, { "name": "BBC Sound Effects", "base_url": "https://sound-effects.bbcrewind.co.uk/search", "requires_key": False } ] def download_file(url, filename, max_retries=3): """下载文件,带重试机制""" headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } for attempt in range(max_retries): try: print(f" 尝试下载 {filename} (尝试 {attempt + 1}/{max_retries})") response = requests.get(url, headers=headers, timeout=30, stream=True) if response.status_code == 200: content_length = response.headers.get('content-length') if content_length and int(content_length) > 10000: # 至少10KB with open(filename, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): if chunk: f.write(chunk) # 验证文件大小 if os.path.getsize(filename) > 10000: print(f" ✅ 成功下载 {filename} ({os.path.getsize(filename)} bytes)") return True else: print(f" ❌ 文件太小,删除: {filename}") os.remove(filename) else: print(f" ❌ 响应内容太小或无效") else: print(f" ❌ HTTP {response.status_code}: {url}") except Exception as e: print(f" ❌ 下载失败: {e}") if attempt < max_retries - 1: time.sleep(2) # 等待2秒后重试 return False def create_high_quality_placeholder(filename, description): """创建高质量占位符文件""" placeholder_content = f"""# {filename} # 音频类型: {description} # 这是一个占位符文件 # 请替换为真实的音频文件 # 建议格式: MP3, 44.1kHz, 16-bit # 建议长度: 根据用途而定 """.encode('utf-8') with open(filename, 'wb') as f: # 写入足够的内容使文件看起来像真实音频 f.write(b'ID3\x03\x00\x00\x00') # MP3 ID3 header f.write(placeholder_content) f.write(b'\x00' * (50000 - len(placeholder_content))) # 填充到50KB print(f" 📄 创建高质量占位符: {filename}") def download_from_alternative_sources(): """从备选源下载音频""" target_dir = "app/src/main/res/raw" os.makedirs(target_dir, exist_ok=True) # 音频描述映射 audio_descriptions = { "electronic_tension.mp3": "电子紧张音乐 - 用于紧张场景", "orchestral_revelation.mp3": "管弦乐揭示 - 用于重大发现", "epic_finale.mp3": "史诗结局 - 用于游戏结局", "ventilation_soft.mp3": "通风系统 - 环境音效", "heart_monitor.mp3": "心率监测 - 医疗设备音效", "reactor_hum.mp3": "反应堆嗡鸣 - 工业环境音", "space_silence.mp3": "太空寂静 - 深空环境音", "wind_gentle.mp3": "轻柔风声 - 天气音效", "rain_light.mp3": "轻雨声 - 天气音效", "storm_cyber.mp3": "赛博风暴 - 恶劣天气音效", "solar_storm.mp3": "太阳风暴 - 太空天气音效", "error_alert.mp3": "错误警报 - 系统提示音", "time_distortion.mp3": "时间扭曲 - 特殊效果音", "oxygen_leak_alert.mp3": "氧气泄漏警报 - 紧急警报音" } success_count = 0 total_files = len(AUDIO_SOURCES) print(f"🎵 开始下载 {total_files} 个音频文件...") print("=" * 60) for filename, urls in AUDIO_SOURCES.items(): filepath = os.path.join(target_dir, filename) description = audio_descriptions.get(filename, "未知音频类型") print(f"\n🎯 处理: {filename}") print(f" 描述: {description}") downloaded = False # 尝试从多个URL下载 for i, url in enumerate(urls): print(f" 源 {i+1}: {url}") if download_file(url, filepath): downloaded = True success_count += 1 break if not downloaded: print(f" ⚠️ 所有源都失败,创建高质量占位符") create_high_quality_placeholder(filepath, description) print("\n" + "=" * 60) print(f"📊 下载完成统计:") print(f" ✅ 成功下载: {success_count}/{total_files}") print(f" 📄 占位符: {total_files - success_count}/{total_files}") print(f" 📁 保存位置: {target_dir}") return success_count def try_freesound_api(): """尝试使用Freesound API下载""" print("\n🔍 尝试使用Freesound API...") # Freesound需要API key,这里提供注册指导 print("💡 Freesound API 使用指南:") print(" 1. 访问: https://freesound.org/apiv2/apply/") print(" 2. 注册账号并申请API key") print(" 3. 将API key添加到此脚本中") print(" 4. 重新运行脚本获得更好的音频质量") return False def download_from_archive_org(): """从Internet Archive下载一些通用音频""" print("\n🏛️ 尝试从Internet Archive下载...") archive_files = { "electronic_tension.mp3": "https://archive.org/download/SampleAudio0372/SampleAudio_0.4s_1MB_mp3.mp3", "rain_light.mp3": "https://archive.org/download/RainSounds/rain-gentle.mp3", "wind_gentle.mp3": "https://archive.org/download/NatureSounds/wind-soft.mp3" } target_dir = "app/src/main/res/raw" success_count = 0 for filename, url in archive_files.items(): filepath = os.path.join(target_dir, filename) if not os.path.exists(filepath) or os.path.getsize(filepath) < 10000: print(f"🎯 下载: {filename}") if download_file(url, filepath): success_count += 1 print(f"📊 Archive.org 下载结果: {success_count}/{len(archive_files)}") return success_count def main(): print("🎮 《月球时间囚笼》音频下载器") print("=" * 50) # 创建目标目录 target_dir = "app/src/main/res/raw" if not os.path.exists(target_dir): print(f"❌ 目标目录不存在: {target_dir}") return total_downloaded = 0 # 方法1: 从备选源下载 total_downloaded += download_from_alternative_sources() # 方法2: 尝试Archive.org total_downloaded += download_from_archive_org() # 方法3: 提供API指导 try_freesound_api() print(f"\n🎉 总计下载了 {total_downloaded} 个真实音频文件") print("\n💡 下一步建议:") print(" 1. 运行 'python3 verify_audio_names.py' 验证结果") print(" 2. 运行 './gradlew assembleDebug' 测试编译") print(" 3. 手动替换剩余的占位符文件") print(" 4. 访问 https://pixabay.com/sound-effects/ 获取更多音频") if __name__ == "__main__": main()