我在 Banshee 有一个结构良好的音乐库。多年来我一直只使用文件夹,所以我一直很擅长维护严格的归档系统。我说这不是吹嘘(毕竟它确实浪费了我很多时间),而是解释我的最终游戏应该是可能的。
在 Banshee 之前,我从来没有真正使用过专辑封面,所以当我开始使用它时,我使用它的专辑封面查找器(煞费苦心地)浏览了所有 8000 多张专辑。我的理解是,Banshee 将这些文件存储在缓存目录中的某个地方,并附加了一个毫无意义的名称。
我最近进入了 Squeezebox 的世界。这很棒,但我在让它看到现有专辑封面时遇到了问题,因为 Banshee 将它锁定在自己的目录中,而不是将其放在“正确”的位置。
所以我正在寻找两种解决方案之一,都将 Banshee 的数据库解析为:
/artist/album/cover.jpg
(Squeezebox 服务器会理解这一点)。编辑:刚刚发现所有艺术作品都~/.cache/media-art
带有album-f952aa94b80de0b31b8979d70d5605e2.jpg
我怀疑的名字。
如果有一种将“ f952aa94b80de0b31b8979d70d5605e2
”与艺术家相关联的好方法,那就是我真正想要的。
小智 5
基于 Oli 脚本中的 MD5 查找(谢谢!),我编写了一个 Python 脚本,该脚本使用eyeD3模块查找 MP3,从 Banshee 的缓存中查找专辑插图,并将插图嵌入到 MP3 中。它会跳过任何已经嵌入了图稿的文件。
它并不完美,但它适用于我大约 90% 的 MP3,您可以使用 EasyTag 手动处理任何异常。就目前而言,该脚本期望 MP3 位于距目标目录(音乐根目录/艺术家/专辑)深两个目录级别。脚本完成后会打印一份报告,突出显示它无法处理的任何文件或无法找到艺术品的文件。
显然你需要安装 Python 和eyeD3 模块才能使用它:
#! /usr/bin/env python
import os, sys, glob, eyeD3, hashlib
CACHE_FILE_PREFIX = os.getenv("HOME") + "/.cache/media-art/album-"
def embedAlbumArt(dir = "."):
artworkNotFoundFiles = []
errorEmbeddingFiles = []
noMetadataFiles = []
mp3s = findMP3Files(dir)
for mp3 in mp3s:
print "Processing %s" % mp3
tag = eyeD3.Tag()
hasMetadata = tag.link(mp3)
if not hasMetadata:
print "No Metadata - skipping."
noMetadataFiles.append(mp3)
continue
if hasEmbeddedArtwork(tag):
print "Artwork already embedded - skipping."
continue
artworkFilename = findAlbumArtworkFile(tag)
if not artworkFilename:
print "Couldn't find artwork file - skipping."
artworkNotFoundFiles.append(mp3)
continue
print "Found artwork file: %s" % (artworkFilename)
wasEmbedded = embedArtwork(tag, artworkFilename)
if wasEmbedded:
print "Done.\n"
else:
print "Failed to embed.\n"
errorEmbeddingFiles.append(mp3)
if artworkNotFoundFiles:
print "\nArtwork not found for:\n"
print "\n".join(artworkNotFoundFiles)
if errorEmbeddingFiles:
print "\nError embedding artwork in:\n"
print "\n".join(errorEmbeddingFiles)
if noMetadataFiles:
print "\nNo Metadata found for files:\n"
print "\n".join(noMetadataFiles)
def findMP3Files(dir = "."):
pattern = "/".join([dir, "*/*", "*.mp3"])
mp3s = glob.glob(pattern)
mp3s.sort()
return mp3s
def hasEmbeddedArtwork(tag):
return len(tag.getImages())
def findAlbumArtworkFile(tag):
key = "%s\t%s" % (tag.getArtist(), tag.getAlbum())
md5 = getMD5Hash(key)
filename = CACHE_FILE_PREFIX + md5 + ".jpg"
if os.path.exists(filename):
return filename
else:
return 0
def getMD5Hash(string):
string = string.encode("utf-8")
md5 = hashlib.md5()
md5.update(string)
return md5.hexdigest()
def embedArtwork(tag, artworkFilename):
tag.addImage(eyeD3.ImageFrame.FRONT_COVER, artworkFilename)
success = 0
try:
success = tag.update()
except:
success = 0
return success
if __name__ == "__main__":
if len(sys.argv) == 1:
print "Usage: %s path" % (sys.argv[0])
else:
embedAlbumArt(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)