1 背景
最近朋友說有個問題比較苦惱,手里有一批歌曲文件要整理歸檔,但是很多歌曲文件的屬性信息不全,手動點(diǎn)開文件屬性一個個進(jìn)行修改太折磨人了。有沒什么辦法可以批量進(jìn)行修改?
朋友有難,自然是要赴湯蹈火的,當(dāng)時就夸下了???,放心包在我身上,一定幫你找到解決辦法。
2 思路分析
既然可以手動修改,那么必然肯定有辦法通過腳本的方式進(jìn)行批量修改,這里是不是可以通過Python來批量修改文件的屬性呢?
2.1 如何修改歌曲屬性信息
2.1.1 可以用于修改歌曲的屬性信息的庫
Mutagen: Mutagen是Python的一個音頻元數(shù)據(jù)處理庫,可以讀取、編輯、寫入常見的音頻格式(如MP3、FLAC、OGG、WAV等)的元數(shù)據(jù)。可以使用它來修改歌曲的屬性信息,如標(biāo)題、藝術(shù)家、專輯、曲目號等等。
EyeD3: EyeD3是一個用于讀取和編輯ID3標(biāo)簽的Python庫,支持MP3和OGG格式的音頻文件。使用它可以讀取和編輯歌曲的標(biāo)題、藝術(shù)家、專輯、流派、年份、曲目號等元數(shù)據(jù)信息。
pydub: pydub是一個用于處理音頻文件的Python庫,支持多種格式,包括MP3、WAV、FLAC、AIFF等等??梢允褂胮ydub讀取歌曲的元數(shù)據(jù),同時也可以使用它來剪輯、混音、降噪等。
audioread: audioread是一個用于讀取音頻文件的Python庫,支持多種格式,包括MP3、WAV、FLAC等等。它可以用來讀取歌曲的元數(shù)據(jù)信息,但不支持寫入元數(shù)據(jù)。
2.1.2 使用EyeD3修改歌曲屬性
這里選擇使用EyeD3修改歌舞的屬性信息,常用的屬性參數(shù)修改方法如下:
# 修改標(biāo)題
audio_file.tag.title = "New Title"
# 修改藝術(shù)家
audio_file.tag.artist = "New Artist"
# 修改專輯
audio_file.tag.album = "New Album"
# 修改流派
audio_file.tag.genre = "New Genre"
# 修改年份
audio_file.tag.year = "2022"
2.2 歌曲屬性信息獲取
2.1.1 使用CSV文件維護(hù)歌曲信息
需要更新歌取屬性信息那么得有一個載體記錄需要更新的屬性信息,這里選擇使用CSV文件進(jìn)行歌曲信息的維護(hù)。
新建一個music.csv文件,將需要維護(hù)的信息錄入進(jìn)去。表頭如下:
文件名 | 標(biāo)題 | 藝術(shù)家 | 專輯 | 流派 | 年份 |
---|---|---|---|---|---|
2.3 整體流程
首先,手動創(chuàng)建CSV文件,錄入需要更新的歌曲屬性,再通過Python讀取CSV文件獲取歌曲屬性,批量寫入到歌曲中。
3 EyeD3庫的安裝
要使用EyeD3庫來修改歌曲的屬性信息,需要先安裝該庫。可以使用以下命令在終端或命令行中安裝EyeD3::
pip install eyeD3
4 代碼實(shí)現(xiàn)
4.1 導(dǎo)入模塊
導(dǎo)入需要使用的模塊:
import os
import csv
import tkinter as tk
from datetime import datetime
import eyed3
4.2 讀取csv文件獲取需要修改的信息:
with open("music.csv", "r", encoding="gbk") as f:
reader = csv.reader(f)
next(reader) # skip header row
for row in reader:
filename, title, artist, album, genre, year = row
4.3 修改歌曲屬性信息:
讀取本地歌曲文件,與filename列進(jìn)行匹配,如果匹配上了則修改歌曲屬性信息:
# 獲取當(dāng)前路徑下歌曲文件信息
filepath = os.path.join(".", filename)
if os.path.exists(filepath):
try:
# 使用 eyed3 庫讀取 MP3 文件
audio_file = eyed3.load(filepath)
# 如果 MP3 文件有標(biāo)簽
if audio_file.tag:
# 如果 music.csv 文件中的某個屬性有值,則將該屬性值更新到 MP3 文件標(biāo)簽中
if title:
audio_file.tag.title = title
if artist:
audio_file.tag.artist = artist
if album:
audio_file.tag.album = album
if genre:
audio_file.tag.genre = genre
if year:
audio_file.tag.year = year
# 保存修改后的 MP3 文件
audio_file.tag.save()
4.4 增加打印提示
以上代碼實(shí)現(xiàn)了需求的功能,但是沒有任何輸出,也不知道修改成功了沒。于是增加了一些信息的輸出,并加上條件判斷統(tǒng)計(jì)修改成功與失敗的數(shù)量:
print("正在更新歌曲屬性信息……")
updated_count = 0
failed_count = 0
with open("music.csv", "r", encoding="gbk") as f:
reader = csv.reader(f)
next(reader) # skip header row
for row in reader:
filename, title, artist, album, genre, year = row
# 獲取當(dāng)前路徑下歌曲文件信息
filepath = os.path.join(".", filename)
if os.path.exists(filepath):
try:
# 使用 eyed3 庫讀取 MP3 文件
audio_file = eyed3.load(filepath)
# 如果 MP3 文件有標(biāo)簽
if audio_file.tag:
# 如果 music.csv 文件中的某個屬性有值,則將該屬性值更新到 MP3 文件標(biāo)簽中
if title:
audio_file.tag.title = title
if artist:
audio_file.tag.artist = artist
if album:
audio_file.tag.album = album
if album_artist:
audio_file.tag.album_artist = album_artist
if genre:
audio_file.tag.genre = genre
if year:
audio_file.tag.year = year
# 保存修改后的 MP3 文件
audio_file.tag.save()
updated_count += 1
print(f"成功更新歌曲{filename}的屬性信息")
else:
failed_count += 1
print(f"歌曲{filename}沒有標(biāo)簽信息,無法更新屬性")
except:
failed_count += 1
print(f"歌曲{filename}沒有標(biāo)簽信息,無法更新屬性")
else:
failed_count += 1
print(f"文件{filename}不存在,無法更新屬性")
print(f"成功更新{updated_count}首歌曲屬性,失敗{failed_count}首。")
5 進(jìn)一步完善
考慮的要修改的歌曲數(shù)量較大,而且有些歌曲已經(jīng)存在了部分信息,這里增加一步讀取本地的歌曲信息,并寫入到csv文件中,根據(jù)獲取到的信息進(jìn)行更新,減少工作量。
5.1 遍歷當(dāng)前路徑下的歌曲文件,并獲取歌曲信息
music_files = []
for file in os.listdir():
if file.endswith(".mp3"):
file_path = os.path.abspath(file)
title, artist, album, genre, year = "", "", "", "", ""
try:
audio = eyed3.load(file_path)
if audio.tag:
title = audio.tag.title
artist = audio.tag.artist
album = audio.tag.album
genre = audio.tag.genre
year = audio.tag.getBestDate().year
except Exception as e:
print(f"獲取{file}信息失?。?/span>{str(e)}")
music_files.append([file, title, artist, album, genre, year])
5.2 把獲取到的歌曲信息寫入的到music.csv中
with open("music.csv", "w", newline="", encoding="gbk") as f:
writer = csv.writer(f)
writer.writerow(["文件名", "標(biāo)題", "藝術(shù)家", "專輯", "音樂類型", "年份" ])
writer.writerows(music_files)
獲取到歌曲信息后就可以去修改music.csv文件的信息,再執(zhí)行歌曲屬性的信息操作了。
未完待續(xù):
以上代碼基本實(shí)現(xiàn)了批量修改歌曲屬性信息的需求,但依然還有可以進(jìn)一步完善的地方:文章來源:http://www.zghlxwxcb.cn/news/detail-488796.html
- EyeD3庫只適用于修改mp3文件,如有其它類型的音頻文件時無法修改;
- 以上純代碼操作,對于不懂編程的朋友來說操作運(yùn)行也還有難度,后續(xù)可以通過tkinter等實(shí)現(xiàn)圖形化的操作界面。
更多的優(yōu)化待有空繼續(xù)……文章來源地址http://www.zghlxwxcb.cn/news/detail-488796.html
到了這里,關(guān)于【Python實(shí)用技巧】如何批量修改歌曲信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!