Massenexport/Einbettung von Albumcovern in Banshee

Massenexport/Einbettung von Albumcovern in Banshee

Ich habe eine gut strukturierte Musikbibliothek in Banshee. Ich habe jahrelang nur Ordner verwendet, daher war ich schon immer ziemlich gut darin, ein striktes Ablagesystem beizubehalten. Ich sage das nicht, um anzugeben (schließlich hat es viel Zeit verschwendet), sondern um zu erklären, dass mein Endspiel möglich sein sollte.

Bis zu Banshee hatte ich nie wirklich etwas mit Albumcovern zu tun, also habe ich, als ich anfing, es zu verwenden, den Album Art Finder verwendet, um (mühselig) alle 8000 Alben durchzugehen. Meines Wissens hat Banshee diese Dateien irgendwo in einem Cache-Verzeichnis versteckt und ihnen einen bedeutungslosen Namen gegeben.

Ich bin vor Kurzem in die Welt der Squeezebox eingestiegen. Sie ist fantastisch, aber ich habe Probleme, die vorhandenen Albumcover anzuzeigen, weil Banshee sie in seinen eigenen Verzeichnissen wegschließt, anstatt sie an die „richtige“ Stelle zu setzen.

Daher suche ich nach einer von zwei Lösungen, die beide die Banshee-Datenbank wie folgt analysieren:

  1. Bevorzugt:Kopieren Sie die Art-Datei als /artist/album/cover.jpg(der Squeezebox-Server versteht dies).
  2. Betten Sie die Grafik in jede MP3/FLAC/OGG/usw. ein (dazu müssen alle Formate Blob-Metadaten unterstützen).

Bearbeiten: Habe gerade alle Bilder ~/.cache/media-artmit den Namen gefunden album-f952aa94b80de0b31b8979d70d5605e2.jpg, die ich vermutet hatte.

f952aa94b80de0b31b8979d70d5605e2Wenn es eine gute Möglichkeit gibt, " " einem Künstler zuzuordnen , dann ist das genau das, wonach ich suche.

Antwort1

Basierend auf der MD5-Suche in Olis Skript (danke!) habe ich ein Python-Skript geschrieben, das dieAugeD3Modul zum Suchen von MP3s, Suchen des Albumcovers aus Banshees Cache und Einbetten des Covers in die MP3s. Es überspringt alle Dateien, in die bereits Cover eingebettet sind.

Es ist nicht perfekt, aber es hat bei etwa 90 % meiner MP3s funktioniert, und Sie können Ausnahmen manuell mit EasyTag behandeln. Derzeit erwartet das Skript, dass die MP3s zwei Verzeichnisebenen tiefer liegen als das Zielverzeichnis (Musikstammverzeichnis/Künstler/Album). Das Skript druckt einen Bericht aus, sobald es fertig ist, und hebt alle Dateien hervor, die es nicht verarbeiten konnte oder für die es kein Cover finden konnte.

Natürlich müssen Sie Python installieren und dieeyeD3 Modulum es zu benutzen:

#! /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])

Antwort2

Ich habe das folgende kleine Skript geschriebenwas Banshee macht(was etwas anders ist alsdie richtigen Spezifikationen).

Kurz gesagt, dies durchläuft meine Musikverzeichnisse in einer Schleife, bildet einen Hash basierend auf dem Künstler und dem Album (aus den Verzeichnisnamen), sucht nach einer Datei mit diesem Hash und kopiert sie, wenn sie existiert, in das Verzeichnis des Albums. Ganz einfach.

#!/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

Das „Echo“ ~/coverlogdient lediglich dazu, festzustellen, wohin die Dateien kopiert wurden (falls etwas schief geht und Sie alle hiermit geschriebenen Cover-Dateien löschen müssen).

Antwort3

Um sicherzustellen, dass ich alle Alben gefunden habe, musste ich den String vor dem Hashen in NFKD normalisieren. Ich habe es in Python folgendermaßen gelöst:

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

Mein gesamtes Skript basiert auf der Lösung von Alphaloop, ich bin jedoch auf Mutagen umgestiegen, um auch mit FLAC und M4A umgehen zu können:

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

Antwort4

Ich habe das Skript von Alphaloop verwendet und es hat gut funktioniert, aber es funktioniert nur für MP3s und meine Musikbibliothek besteht hauptsächlich aus FLAC und OGG. Deshalb habe ich ein kleines Java-Befehlszeilentool geschrieben, um alle Cover unabhängig vom Dateityp zu migrieren.

Sie finden es hier:BansheeArtworkAutor

Es hat ungefähr 11 Minuten gedauert und alle Cover in meiner Musikbibliothek mit 2,7 KB Dateien migriert. Befolgen Sie die Anweisungen in der Readme-Datei von GitHub, dann sollte es für jeden problemlos ausführbar sein.

Hoffe, es hilft jemand anderem.

verwandte Informationen