# -*- coding: utf-8 -*- """命令行入口(python -m music_downloader)。""" from __future__ import annotations from .downloader import ( MusicDownloader, ) from .models import ( DownloadException, ) # ============ CLI 入口 ============ if __name__ == "__main__": import sys from dataclasses import asdict downloader = MusicDownloader() # 无参数:打印模块信息 if len(sys.argv) < 2: print("网易云音乐下载器") print(f"ffmpeg 路径: {downloader.ffmpeg_path or '未找到'}") print("支持的音质: standard / exhigh / lossless / hires / sky / jyeffect / jymaster / dolby") print("支持的功能: 同步/批量下载、ffmpeg 元数据写入") print() print("用法:") print(" python music_downloader.py [quality] # 仅打印信息") print(" python music_downloader.py [quality] --download # 打印并下载") print() print("示例:") print(" python music_downloader.py 123456") print(" python music_downloader.py 123456 lossless") print(" python music_downloader.py 123456 hires --download") sys.exit(0) # 解析参数 try: music_id = int(sys.argv[1]) except ValueError: print(f"错误: music_id 必须是整数,收到: {sys.argv[1]!r}") sys.exit(1) quality = sys.argv[2] if len(sys.argv) > 2 and not sys.argv[2].startswith("--") else "lossless" do_download = "--download" in sys.argv # 打印音乐信息 try: info = downloader.get_music_info(music_id, quality) except DownloadException as e: print(f"获取音乐信息失败: {e}") sys.exit(1) print() print("=" * 70) print(f"音乐信息 (ID={info.id}, quality={info.quality})") print("=" * 70) info_dict = asdict(info) for key, value in info_dict.items(): # 歌词太长,只显示行数 if key in ("lyric", "tlyric"): lines = [ln for ln in (value or "").splitlines() if ln.strip()] preview = " | ".join(lines[:2])[:80] if lines else "(空)" print(f" {key:<14}: {len(lines)} 行 预览: {preview}{'...' if len(lines) > 2 else ''}") continue # URL 类字段:完整展示(如果终端窄可换行) if key in ("download_url", "pic_url"): print(f" {key:<14}: {value}") continue print(f" {key:<14}: {value}") print("=" * 70) # 可选:触发下载 if do_download: print() print("开始下载...") result = downloader.download_music_file(music_id, quality) if result.success: print(f"下载完成: {result.file_path} ({result.file_size} 字节)") else: print(f"下载失败: {result.error_message}") sys.exit(1)