#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试音乐链接是否可用 """ import requests from concurrent.futures import ThreadPoolExecutor, as_completed # 音乐列表 MUSIC_LIST = [ {"title": "Love", "url": "https://www.bensound.com/bensound-music/bensound-love.mp3"}, {"title": "Romantic", "url": "https://www.bensound.com/bensound-music/bensound-romantic.mp3"}, {"title": "Piano Moment", "url": "https://www.bensound.com/bensound-music/bensound-pianomoment.mp3"}, {"title": "Tenderness", "url": "https://www.bensound.com/bensound-music/bensound-tenderness.mp3"}, {"title": "Sweet", "url": "https://www.bensound.com/bensound-music/bensound-sweet.mp3"}, {"title": "A New Beginning", "url": "https://www.bensound.com/bensound-music/bensound-anewbeginning.mp3"}, {"title": "Memories", "url": "https://www.bensound.com/bensound-music/bensound-memories.mp3"}, {"title": "Once Again", "url": "https://www.bensound.com/bensound-music/bensound-onceagain.mp3"}, {"title": "Slowmotion", "url": "https://www.bensound.com/bensound-music/bensound-slowmotion.mp3"}, {"title": "Tomorrow", "url": "https://www.bensound.com/bensound-music/bensound-tomorrow.mp3"}, {"title": "Ukulele", "url": "https://www.bensound.com/bensound-music/bensound-ukulele.mp3"}, {"title": "Happy Rock", "url": "https://www.bensound.com/bensound-music/bensound-happyrock.mp3"}, {"title": "Summer", "url": "https://www.bensound.com/bensound-music/bensound-summer.mp3"}, {"title": "Sunny", "url": "https://www.bensound.com/bensound-music/bensound-sunny.mp3"}, {"title": "Little Idea", "url": "https://www.bensound.com/bensound-music/bensound-littleidea.mp3"}, {"title": "Cute", "url": "https://www.bensound.com/bensound-music/bensound-cute.mp3"}, {"title": "Funny Song", "url": "https://www.bensound.com/bensound-music/bensound-funnysong.mp3"}, {"title": "Jazzy Frenchy", "url": "https://www.bensound.com/bensound-music/bensound-jazzyfrenchy.mp3"}, {"title": "Acoustic Breeze", "url": "https://www.bensound.com/bensound-music/bensound-acousticbreeze.mp3"}, {"title": "Clear Day", "url": "https://www.bensound.com/bensound-music/bensound-clearday.mp3"}, {"title": "Relaxing", "url": "https://www.bensound.com/bensound-music/bensound-relaxing.mp3"}, {"title": "Calm", "url": "https://www.bensound.com/bensound-music/bensound-calm.mp3"}, {"title": "November", "url": "https://www.bensound.com/bensound-music/bensound-november.mp3"}, {"title": "Sad Day", "url": "https://www.bensound.com/bensound-music/bensound-sadday.mp3"}, {"title": "The Lounge", "url": "https://www.bensound.com/bensound-music/bensound-thelounge.mp3"}, {"title": "Inspire", "url": "https://www.bensound.com/bensound-music/bensound-inspire.mp3"}, {"title": "Dreams", "url": "https://www.bensound.com/bensound-music/bensound-dreams.mp3"}, {"title": "Perception", "url": "https://www.bensound.com/bensound-music/bensound-perception.mp3"}, {"title": "Moose", "url": "https://www.bensound.com/bensound-music/bensound-moose.mp3"}, {"title": "Night Owl", "url": "https://www.bensound.com/bensound-music/bensound-nightowl.mp3"}, ] def test_music_link(music): """测试单个音乐链接""" try: response = requests.head(music["url"], timeout=10, allow_redirects=True) if response.status_code == 200: size = int(response.headers.get('Content-Length', 0)) / (1024 * 1024) # MB return { "title": music["title"], "status": "✓ 可用", "size": f"{size:.2f} MB", "code": response.status_code } else: return { "title": music["title"], "status": "✗ 不可用", "size": "N/A", "code": response.status_code } except Exception as e: return { "title": music["title"], "status": "✗ 错误", "size": "N/A", "code": str(e) } def main(): print("=" * 80) print(" 测试音乐链接可用性") print("=" * 80) print() print(f"总共 {len(MUSIC_LIST)} 首音乐") print() results = [] available_count = 0 unavailable_count = 0 # 使用线程池并发测试 with ThreadPoolExecutor(max_workers=10) as executor: futures = {executor.submit(test_music_link, music): music for music in MUSIC_LIST} for idx, future in enumerate(as_completed(futures), 1): result = future.result() results.append(result) # 实时显示进度 status_icon = "✓" if result["status"] == "✓ 可用" else "✗" print(f"[{idx}/{len(MUSIC_LIST)}] {status_icon} {result['title']:<25} {result['size']:<12} (HTTP {result['code']})") if result["status"] == "✓ 可用": available_count += 1 else: unavailable_count += 1 # 统计结果 print() print("=" * 80) print(" 测试结果") print("=" * 80) print() print(f"✓ 可用: {available_count} 首") print(f"✗ 不可用: {unavailable_count} 首") print(f"成功率: {available_count / len(MUSIC_LIST) * 100:.1f}%") print() if unavailable_count > 0: print("=" * 80) print(" 不可用的音乐") print("=" * 80) print() for result in results: if result["status"] != "✓ 可用": print(f"✗ {result['title']}: {result['code']}") print() if available_count == len(MUSIC_LIST): print("🎉 所有音乐链接都可用!可以安全导入数据库。") else: print("⚠️ 部分音乐链接不可用,请检查后再导入。") print() if __name__ == "__main__": main()