首页 > 编程语言 >python 自动将歌曲按照歌手分类创建软链接

python 自动将歌曲按照歌手分类创建软链接

时间:2024-10-31 15:13:31浏览次数:4  
标签:artist python 歌手 track music mp3 file path 链接

要使用Python获取MP3文件的信息,可以使用pymediainfo包。
首先,你需要安装pymediainfo。

下面是获取一首歌曲信息的例子

"""
Module to demonstrate how to use `pymediainfo` to read metadata from a media file.

In this module, we read the metadata of a given MP3 file and display the artist's name and
other general information.

In order to use this module, you need to have `pymediainfo` installed.
"""


def read_mp3_metadata(base_dir, mp3_file):
    """
    Reads metadata of the given MP3 file.

    Args:
        base_dir (str): The base directory where the MP3 file is located.
        mp3_file (str): The name of the MP3 file.

    Returns:
        None
    """

    # Join the base directory and the file name to form the full path.
    mp3_file_path = os.path.join(base_dir, mp3_file)

    # Parse the media file using `pymediainfo`.
    media_info = MediaInfo.parse(mp3_file_path)

    # Print the artist's name.
    performer = media_info.tracks[0].to_data()['performer']
    print(f"Artist: {performer}")

    # Print the metadata of each track.
    for track in media_info.tracks:
         if track.track_type == "Audio":
            print(f"{'-' * 20} Audio Track {'-' * 20}")
            for key, value in track.to_data().items():
                print(f"{key}: {value}")
        if track.track_type == "General":
            for key, value in track.to_data().items():
              print(f"{key}: {value}")


# Example usage of the function.
read_mp3_metadata(r'C:\Users\user\Desktop\LX-Music', '2002年的第一场雪 - 刀郎.mp3')

注意, 简单的解析歌曲之后,基本信息在media_info.tracks[0]里面, 其实是 track.track_type == "General"里面
所以对歌曲分类的思路就是:
遍历指定目录的歌曲
获取每首歌曲的信息,这里指的是歌手的名字
同一个歌手的放一起
对同一个歌手创建文件夹,并将其对应个歌曲创建软链接放进去


import os
from pymediainfo import MediaInfo

def traverse_music(music_path):
    """
    Traverse the files in directory 'music_path'
    and read the music file's info with pymediainfo,
    create soft link for each file,
    and put soft link into a same new folder when have same artist

    Args:
        music_path (str): The path of the music directory

    Returns:
        None
    """

    # Dictionary to store the mapping between artist and files
    artist_dict = {}

    # Traverse the files in the directory
    try:
        for root, dirs, files in os.walk(music_path):
            for file in files:

                # Skip the file if it is not a mp3 file
                if not file.endswith('.mp3'):
                    continue

                # Get the full path of the file
                file_path = os.path.join(root, file)

                try:
                    # Read the music info of the file
                    music_info = MediaInfo.parse(file_path)

                    # Get the artist of the music
                    artist = music_info.tracks[0].to_data()['performer']

                    # If the artist is new, create a new key in the dictionary
                    if artist not in artist_dict:
                        artist_dict[artist] = []

                    # Append the file to the list of files of the artist
                    artist_dict[artist].append(file_path)
                except Exception as e:
                    print(f"Exception occured while processing {file_path}: {e}")
    except Exception as e:
        print(f"Exception occured while traversing {music_path}: {e}")

    # Print the dictionary
    print(artist_dict)

    # For each artist, create a new folder and create soft links to files
    for artist, files in artist_dict.items():

        # Get the path of the artist's folder
        artist_path = os.path.join(music_path, artist)

        try:
            # Create the folder and ignore if it already exists
            print('start to create new folder: ', artist_path)
            os.makedirs(artist_path, exist_ok=True)

            # For each file, create a soft link in the artist's folder
            for file in files:
                os.symlink(file, os.path.join(artist_path, os.path.basename(file)))
        except Exception as e:
            print(f"Exception occured while processing {artist_path}: {e}")
traverse_music(r'C:\Users\emijnae\Desktop\LX-Music')

标签:artist,python,歌手,track,music,mp3,file,path,链接
From: https://www.cnblogs.com/aifengqi/p/18517862

相关文章

  • 西安短期驻场:python+flask/django 1.5万/月可谈
    驻场周期:2个月,不包食宿。地点:西安高新区费用:1.5万/月。可谈python后台开发岗位要求:-本科及以上学历,计算机相关专业,3年以上开发经验。-熟悉Python及其主流框架flask或django。-熟悉数据库设计与优化,如MySQL、Mango等,具备数据库性能调优经验。-熟练使用Git等版本控制工具,具备......
  • Leetcode刷题Python之3165.不包含相邻元素的子序列的最大和
    提示:利用线段树解决不包含相邻元素的子序列最大和问题。文章目录一、题目描述示例二、解题思路1.思路分析2.线段树的状态设计3.线段树的操作三、代码实现代码详细解释四、总结时间复杂度分析一、题目描述给定一个整数数组nums和一个二维数组queries,其中q......
  • Python+Django框架淘宝家用电器销售数据可视化系统作品截图和开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • python安装
    系统:win11安装版本:3.13.0一、检查检查电脑内是否已存在python,打开cmd,指令python或者python-V如果已存在旧版本的python,先删除旧版本二、下载安装程序官网地址下载地址默认下载window环境下的最新版本,可自行选择其他系统和其他版本。三、开始安装1.选择addtoPATH......
  • Python中list列表的所有方法
    Python中list列表的所有方法方法描述返回值list.append()在列表末尾添加指定元素,如果增加的是序列会形成嵌套。无返回,直接修改。list.extend()在列表末尾逐个添加指定序列中的所有元素。无返回,直接修改。list.insert()将对象插入列表指定位置,如果增加的是序列会形成嵌套。无返......
  • Python中str字符串的所有方法
    Python中str字符串的所有方法方法描述返回值str.capitalize()将字符串的第一个字符转换为大写,其余字符转换为小写。返回一个新字符串str.casefold()将字符串转换为小写,并移除所有音调标记。识别的内容比str.lower()多返回一个新字符串str.center()返回指定宽度的新字符串,原字......
  • Python+Django框架山西太原二手房数据可视化大屏系统开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • Linux安装Python 3.11
    Linux安装python在Linux上安装Python3.11,你可以按照以下步骤进行。这些步骤以CentOS为例,但其他Linux发行版的过程大同小异,可能只需稍作调整。1.检查Python版本首先,打开终端,检查系统上是否已安装Python3.11:python3.11--version#或者python3--version如果系统返回的是......
  • 【20241030】【Python基础教程】第二章 列表和元组 I
    第二章列表和元组I2.1序列概述数据结构是以某种方式(如通过编号)组合起来的数据元素(如数、字符乃至其他数据结构)集合元组是特殊的序列,列表和元组的主要不同在于,列表是可以修改的,而元组不可以。几乎在所有情况下都可使用列表来代替元组。一种例外情况是将元组用作字典键。序......
  • python 备份文件,从 D盘 到Z盘。并且保留15天的文件
    备份文件,从D盘到Z盘。并且保留15天的文件importosimportshutilfromdatetimeimportdatetime,timedeltadefmove_and_clean_folders(a_folder,b_folder,keep_count=15):try:#获取前两天的日期yesterday=datetime.now()-timedelta(days=......