閒來無事,準備搭建一個個人音樂伺服器,但是發現一個比較大的問題是,音樂檔案下載下來是很亂的,沒有進行分類,這樣傳到群暉NAS上不方便後續管理
網上搜了一圈,沒一個好用的工具或者指令碼,想了想還是自己寫了一個
先用百度的AI生成了一個大概的雛形,然後自己進行了修改
目前只測試了mp3檔案和flac檔案,其他的不知道會不會有問題
指令碼會遍歷需要整理的目錄,然後根據歌曲的藝術家(歌手),唱片集(專輯)資訊進行分類整理,會在輸出資料夾建立對應的目錄結構,然後把檔案移動過去,
這裡注意一下,檔案是移動過去的,不是複製,需要複製的話自己修改一下,因為移動速度會很快,對於未識別的檔案,會放進未知歌手-未知專輯裡面去
如果輸出資料夾已經有這個檔案會報檔案已存在錯誤,不過不用理會
具體不明白的可以去看B站對應影片,稍後會製作出來放上影片連結
同時做了一個打包好的exe檔案,可以直接執行,但是防毒軟體會報毒,記得新增信任
百度雲連結:
連結:https://pan.baidu.com/s/1LRBhFKdUk-W7hB1pB6o0qw?pwd=2gi6
提取碼:2gi6
1 import os 2 import shutil 3 from mutagen import File 4 from pathlib import Path 5 import re 6 from multiprocessing import Event 7 8 def classify_music(music_dir, output_dir): 9 # 建立輸出目錄 10 Path(output_dir).mkdir(parents=True, exist_ok=True) 11 12 # 遍歷音樂目錄 13 for subdir, _, files in os.walk(music_dir): 14 for filename in os.listdir(subdir): 15 filepath = os.path.join(subdir, filename) 16 #print(filepath) 17 # 檢查是否為音樂檔案 18 if os.path.isfile(filepath) and File(filepath): 19 music_file = File(filepath) 20 21 # 獲取音樂資訊 22 artist = music_file.get('TPE1', ['未知歌手'])[0] 23 album = music_file.get('TALB', ['未知專輯'])[0] 24 if artist == "未知歌手" and album == "未知專輯": #有些歌曲會識別出錯,換另一個識別符號 25 artist = music_file.get('artist', ['未知歌手'])[0] 26 album = music_file.get('album', ['未知專輯'])[0] 27 #如果希望未知的不處理開啟下面兩句 28 #if artist == "未知歌手" and album == "未知專輯":#換了還沒找到則不處理 29 # continue 30 #去除非法字元 31 illegal_chars_pattern = re.compile(r'[^\w_ -]') # 定義非法字元的正規表示式 32 safe_artist = illegal_chars_pattern.sub('', artist) # 去除非法字元 33 safe_album = illegal_chars_pattern.sub('', album) # 去除非法字元 34 print(safe_artist,safe_album) 35 36 # 建立藝術家和標題的子目錄 37 artist_dir = os.path.join(output_dir, safe_artist) 38 album_dir = os.path.join(artist_dir, safe_album) 39 40 Path(album_dir).mkdir(parents=True, exist_ok=True) 41 42 # 移動檔案到相應子目錄 43 try: 44 shutil.move(filepath, album_dir) 45 except (FileNotFoundError, shutil.Error) as e: 46 print(f"出現一個錯誤: {e}") 47 except Exception as e: 48 print(f"意外錯誤: {e}") 49 50 print("已完成") 51 52 # 使用示例 53 if __name__ == "__main__": 54 print("音樂檔案一鍵分類整理指令碼\n\ 55 說明:指令碼會根據歌曲的藝術家(歌手),唱片集(專輯)自動進行建立目錄,然後進行檔案移動\n\ 56 未知的歌手和專輯檔案會放在未知目錄,若檔案已存在則會報檔案已存在錯誤,不用理會\n\ 57 使用方法:\n\ 58 1.先輸入需要整理的音樂檔案路徑,建議使用絕對路徑,然後按回車,例:E:\音樂\n\ 59 2.然後輸入檔案輸出目錄,輸出目錄不能與輸入目錄相同,輸入完畢按回車,例:E:\音樂整理輸出\n\ 60 作者:liuzhiying 日期:20240616 \n\ 61 目前只測試了MP3和flac檔案,若遇到問題可留言") 62 while True: 63 path1 = input("請輸入需要整理的目錄路徑:") 64 path2 = input("請輸入輸出檔案的目錄路徑:") 65 66 if path1 == path2: 67 print("輸入目錄與輸出目錄相同,請重試") 68 continue 69 else: 70 break 71 72 music_dir = path1 # 音樂檔案所在目錄 73 output_dir = path2 # 輸出目錄 74 print("開始整理,請等待\"已完成\"出現再關閉程式") 75 classify_music(music_dir, output_dir) 76 77 event = Event() 78 event.wait()