音樂檔案一鍵整理分類指令碼(按照歌手-專輯進行分類)--基於python

-繁尘-發表於2024-06-16

閒來無事,準備搭建一個個人音樂伺服器,但是發現一個比較大的問題是,音樂檔案下載下來是很亂的,沒有進行分類,這樣傳到群暉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()

相關文章