首页 > 编程语言 >音乐文件一键整理分类脚本(按照歌手-专辑进行分类)--基于python

音乐文件一键整理分类脚本(按照歌手-专辑进行分类)--基于python

时间:2024-06-16 20:54:18浏览次数:20  
标签:album 音乐文件 artist -- 专辑 分类 music 目录 dir

闲来无事,准备搭建一个个人音乐服务器,但是发现一个比较大的问题是,音乐文件下载下来是很乱的,没有进行分类,这样传到群晖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()

 

标签:album,音乐文件,artist,--,专辑,分类,music,目录,dir
From: https://www.cnblogs.com/xiaoliu1012/p/18251214

相关文章

  • SCCPC 2024 游记
    省流:都是uuz的问题比赛前晚5.2h幽默睡眠。9点开考,然后uuz签到失败,byd这都要吃一发罚时。然后开考前1hnit给出了3个假做法,看错了两个题/strongzhicheng稳定发挥,屠杀了剩下的签到和模拟题。期间跟uuz讨论G,发现怎么写都是\(\log^3\)的逆天复杂度,讨论了半个......
  • 6.14博客
    周五了太棒了学习内容:安卓packagecom.example.app_02;importorg.junit.Rule;importorg.junit.Test;importstaticorg.junit.Assert.*;importcom.example.app_02.entity.Record;importcom.example.app_02.utils.RecordDao;importjava.util.ArrayList;/** *......
  • 《王川宝典》
    赚钱与工作生活平衡赚钱的策略与心态赚钱不仅是实现个人价值的手段,更是一种生活的艺术。理想的赚钱状态应具备机械增益和自锁功能,即在个人休息或离开时,所从事的事务仍能自动运行甚至增值。赚钱的非线性发展:赚钱是一个非线性过程,受多种内外部因素影响。盲目透支体力去追求短期......
  • 『手写Mybatis』创建简单的映射器代理工厂
    前言在阅读本文之前,我相信你已经是一个MybatisORM框架工具使用的熟练工了,那你是否清楚这个ORM框架是怎么屏蔽我们对数据库操作的细节的?比如我们使用JDBC的时候,需要手动建立数据库链接、编码SQL语句、执行数据库操作、自己封装返回结果等。但在使用ORM框架后,只需要......
  • Linux 内核定时器实验
    Linux内核定时器实验内核时间管理简介Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频......
  • sd3 的使用
    1文件下载下载sd3相关模型下载comfyui下载语言包,下载管理器,等内容comfyui下载下载sd3(可能下载失败,用哔站上嫖来的网盘链接比较快)https://hf-mirror.com/stabilityai/stable-diffusion-3-medium下载语言包(在ComfyUI\custom_nodes)gitclonehttps://github.com/A......
  • Q33 LeetCode18 四数之和
    1.与三数之和类似2.定前两个数,后面使用双指针移动3.注意109需要用long接,int就超出界限了4.while(left<right&&nums[left]==nums[++left]);一个循环去除重复 1classSolution{2publicList<List<Integer>>fourSum(int[]nums,inttarget){3if(nu......
  • who命令
    命令详解:Linuxwho命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU使用量、动作等等。使用权限:所有使用者都可使用。语法:who[OPTION]...[FILE|ARG1ARG2]参数说明:-a,--all......
  • 东周列国志 - 第二回 褒人赎罪献美女 幽王烽火戏诸侯
    话说宣王自东郊游猎,遇了杜伯、左儒阴魂索命,得疾回宫,合眼便见杜伯、左儒,自知不起,不肯服药。三日之后,病势愈甚。其时周公久已告老,仲山甫已卒。乃召老臣尹吉甫、召虎托孤。二臣直至榻前,稽首问安。宣王命内侍扶起,靠于绣褥之上,谓二臣曰:“朕赖诸卿之力,在位四十六年,南征北伐,四海安宁。不......
  • Linux的Terminal调用不出来,一直转圈圈
    后来发现是环境变量的问题[oracle@ora19rac01~]$cat.bash_profile#.bash_profile#Getthealiasesandfunctionsif[-f~/.bashrc];then.~/.bashrcfi#Userspecificenvironmentandstartupprograms#aliassqlplus="rlwrapsqlplus"#aliasrman......