Объемный экспорт встраиваемых альбомов в Банши

Если вы просто имеете дело с wavs, вы можете использовать paplay.

Для воспроизведения mpeg вам нужно что-то еще. Вы можете повесить ручное декодирование и перекодировать обратно в paplay, но одна альтернатива mplayer - mpeg321:

mpg321 ~/Music/Aqua/Aquarium/Aqua\ -\ 03\ -\ Barbie\ Girl.mp3 &

И теперь это игра. Отлично. Мне нужно выбрать лучший пример, когда я делаю это.

6
задан 11 October 2011 в 23:43

11 ответов

На основе поиска MD5 в сценарии Oli (спасибо!) я написал сценарий 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])
5
ответ дан 25 May 2018 в 18:20

На основе поиска MD5 в сценарии Oli (спасибо!) я написал скрипт 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])
5
ответ дан 31 July 2018 в 12:20

На основе поиска MD5 в сценарии Oli (спасибо!) я написал сценарий 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])
5
ответ дан 6 August 2018 в 03:05

На основе поиска MD5 в сценарии Oli (спасибо!) я написал скрипт 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])
5
ответ дан 7 August 2018 в 20:47

Я написал этот маленький скрипт, который следует за тем, что делает Banshee (что немного отличается от соответствующих спецификаций).

Короче говоря, это пеет мои музыкальные каталоги и, образует хэш на основе исполнителя и альбома (из имен каталогов), ищет файл с этим хешем и, если он существует, копирует его в каталог альбома. Простой.

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

Эхо в ~/coverlog находится здесь, чтобы поймать, куда были скопированы файлы (в случае, если что-то пошло не так, и вам нужно удалить все файлы обложки, которые это записывает. [!d4 ]

2
ответ дан 25 May 2018 в 18:20

Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до NFKD перед хэшированием. Я решил это в python:

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

Весь мой скрипт основан на решении alphaloop, но я переключился на мутаген, чтобы иметь дело с flac и m4a:

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
1
ответ дан 25 May 2018 в 18:20

Я использовал скрипт alphaloop, и он работал нормально, но он работает только для MP3, а моя музыкальная библиотека - это в основном FLAC и OGG, поэтому я написал небольшой инструмент командной строки Java, чтобы перенести все обложки, независимо от типа файла. [ ! d0]

Вы можете найти его здесь: BansheeArtworkWriter

Прошло около 11 минут в моей музыкальной библиотеке 2.7k файлов, и она перенесла все обложки, следуя инструкциям в readme GitHub, и это должно быть

Надеюсь, это поможет кому-то еще.

0
ответ дан 25 May 2018 в 18:20

Я написал этот маленький скрипт, который следует за , что Banshee делает (что немного отличается от правильных спецификаций ).

Короче говоря, эти циклы мои музыкальные каталоги и, создавая хэш на основе исполнителя и альбома (из имен каталогов), ищет файл с этим хешем и, если он существует, копирует его в каталог альбома. Простой.

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

Эхо в ~/coverlog находится там, где можно скопировать файлы, на которые были скопированы файлы (в случае, если что-то пошло не так, и вам нужно удалить все файлы обложки, которые это записывает.

2
ответ дан 31 July 2018 в 11:20

Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до NFKD перед хешированием. Я решил это в python:

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

Весь мой скрипт основан на решении alphaloop, но я переключился на мутаген, чтобы иметь дело с flac и m4a:

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
1
ответ дан 6 August 2018 в 03:05

Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до NFKD перед хешированием. Я решил это в python:

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

Весь мой скрипт основан на решении alphaloop, но я переключился на мутаген, чтобы иметь дело с flac и m4a:

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
1
ответ дан 7 August 2018 в 20:47

Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до NFKD перед хешированием. Я решил это в python:

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

Весь мой скрипт основан на решении alphaloop, но я переключился на мутаген, чтобы иметь дело с flac и m4a:

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
1
ответ дан 13 August 2018 в 12:32

Другие вопросы по тегам:

Похожие вопросы: