在Banshee批量出口/嵌入专辑封面

Modified on: Sat, 09 Jun 2018 14:41:23 +0800

我在Banshee有一个结构合理的音乐库。我以前只使用文件夹多年,所以我一直很擅长维护严格的文件系统。我说这不是为了吹嘘(毕竟这确实浪费了我很多时间)但是要解释我的最终游戏应该是可能的。

直到Banshee,我从来没有真正使用过专辑封面,所以当我开始使用它时,我用它的Album Art Finder(辛苦地)浏览了所有8000多张专辑。我的理解是,Banshee将这些文件放在缓存目录中,并附加了无意义的名称。

我最近搬进了Squeezebox的世界。它真棒,但是我在查看现有的专辑封面时遇到了问题,因为Banshee将它锁定在自己的目录中,而不是把它放在“正确”的位置。

所以我正在寻找两种解决方案中的一种,将Banshee的数据库解析为:

  1. 首选:将艺术品文件复制为/artist/album/cover.jpg(Squeezebox服务器会理解这一点。)
  2. 将艺术品嵌入到每个MP3 / FLAC / OGG /等中(这需要所有格式支持blob元数据)
  3. 醇>

    编辑:刚刚找到~/.cache/media-art中的所有艺术品,其名称如album-f952aa94b80de0b31b8979d70d5605e2.jpg,我怀疑。

    如果有一种很好的方式将“f952aa94b80de0b31b8979d70d5605e2”与艺术家联系起来,那就是我真正想要的。

作者:,Oli

最佳答案

基于Oli脚本中的MD5查找(谢谢!),我编写了一个使用eyeD3模块的Python脚本找到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])

作者:alphaloop

相关问答

添加新评论