Banshee에 앨범 아트 대량 내보내기/포함

Banshee에 앨범 아트 대량 내보내기/포함

저는 Banshee에 잘 구성된 음악 라이브러리를 가지고 있습니다. 저는 수년 동안 폴더만 사용해왔기 때문에 항상 엄격한 파일링 시스템을 유지하는 데 꽤 능숙했습니다. 나는 이것을 자랑하기 위해 말하는 것이 아니라(결국 내 시간을 많이 낭비했다) 나의 최종 게임이 가능해야 한다는 것을 설명하기 위해 말한다.

Banshee까지는 앨범 아트를 전혀 사용하지 않았기 때문에 사용하기 시작했을 때 앨범 아트 파인더를 사용하여 (고심하게) 8000여 개의 앨범을 모두 살펴보았습니다. 내가 이해한 바에 따르면 Banshee는 이러한 파일을 의미 없는 이름이 첨부된 캐시 디렉토리 어딘가에 보관해 두었습니다.

저는 최근 Squeezebox의 세계에 빠져들었습니다. 그것은 훌륭하지만 Banshee가 그것을 "올바른" 위치에 두는 대신 자체 디렉토리에 가둬두기 때문에 기존 앨범 아트를 보는 데 문제가 있습니다.

그래서 저는 Banshee의 데이터베이스를 다음과 같이 구문 분석하는 두 가지 솔루션 중 하나를 찾고 있습니다.

  1. 우선의:아트 파일을 다음과 같이 복사합니다 /artist/album/cover.jpg(Squeezebox 서버가 이를 이해합니다).
  2. 각 MP3/FLAC/OGG/등에 아트를 삽입합니다(BLOB 메타데이터를 지원하려면 모든 형식이 필요함).

편집: 내가 의심했던 것과 ~/.cache/media-art같은 이름 의 모든 예술 작품을 찾았습니다 .album-f952aa94b80de0b31b8979d70d5605e2.jpg

f952aa94b80de0b31b8979d70d5605e2" "를 아티스트와 연관시키는 좋은 방법이 있다면 그것이 바로 제가 추구하는 것입니다.

답변1

Oli 스크립트의 MD5 조회를 기반으로(감사합니다!) 저는 다음을 사용하는 Python 스크립트를 작성했습니다.눈D3MP3를 찾고, Banshee의 캐시에서 앨범 아트워크를 찾고, MP3 안에 아트워크를 삽입하는 모듈입니다. 이미 아트워크가 포함된 파일은 건너뜁니다.

완벽하지는 않지만 내 MP3의 약 90%에서 작동했으며 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])

답변2

나는 다음과 같은 작은 스크립트를 작성했습니다밴시가 하는 일(이것은 약간 다릅니다적절한 사양).

간단히 말해서, 이것은 내 음악 디렉터리를 반복하고 아티스트와 앨범(디렉터리 이름에서)을 기반으로 해시를 형성하고 해당 해시가 포함된 파일을 찾아 해당 파일이 있으면 앨범 디렉터리에 복사합니다. 단순한.

#!/bin/bash

TPATH="/home/oli/.cache/media-art/"

cd /media/ned/music/

for f in *; do 
        cd "$f"
        for al in *; do
                THUMB="${TPATH}album-$(echo -ne "$f\t$al" | md5sum | cut -b1-32).jpg"
                if [ -e $THUMB ]; then
                        cp $THUMB ./cover.jpg
                        echo "/media/ned/music/$f/$al/cover.jpg" >> ~/coverlog
                fi
        done
        cd ..        
done

echo to는 ~/coverlog파일이 복사된 위치를 파악하기 위해 존재합니다(무언가 잘못되어 작성된 모든 표지 파일을 삭제해야 하는 경우).

답변3

모든 앨범을 찾았는지 확인하려면 해싱하기 전에 문자열을 NFKD로 정규화해야 했습니다. 나는 다음과 같이 파이썬으로 해결했습니다.

def strip_accents(s):
    return unicodedata.normalize('NFKD', s)

내 전체 스크립트는 alphaloop의 솔루션을 기반으로 하지만 flac 및 m4a도 처리하기 위해 mutagen으로 전환했습니다.

def getArtistAlbum(musicfile):
     """ return artist and album strings of a music file """
     import mutagen

     # key of stored information per file extension
     keys={'flac': ('artist','album'),
           'mp3': ('TPE2','TALB'),
           'm4a': ('\xa9ART','\xa9alb')}

     # read the tag
     tag = mutagen.File(musicfile)
     # get extension of musicfile
     ext = os.path.splitext(musicfile)[1][1:]

    try:
        return tag[keys[ext][0]][0], tag[keys[ext][1]][0]
    except KeyError:
        return None,None

답변4

나는 alphaloop의 스크립트를 사용했는데 잘 작동했지만 MP3에서만 작동하고 내 음악 라이브러리는 대부분 FLAC 및 OGG이므로 파일 유형에 관계없이 모든 표지를 마이그레이션하는 작은 Java 명령줄 도구를 작성했습니다.

여기에서 찾을 수 있습니다:Banshee작품작가

내 2.7k 파일 음악 라이브러리에서 약 11분이 걸렸으며 모든 표지를 마이그레이션했습니다. GitHub의 추가 정보에 있는 지침을 따르면 누구나 쉽게 실행할 수 있습니다.

다른 사람에게 도움이 되기를 바랍니다.

관련 정보