Если вы просто имеете дело с wavs, вы можете использовать paplay.
Для воспроизведения mpeg вам нужно что-то еще. Вы можете повесить ручное декодирование и перекодировать обратно в paplay, но одна альтернатива mplayer - mpeg321:
mpg321 ~/Music/Aqua/Aquarium/Aqua\ -\ 03\ -\ Barbie\ Girl.mp3 &
И теперь это игра. Отлично. Мне нужно выбрать лучший пример, когда я делаю это.
На основе поиска 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])
На основе поиска 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])
На основе поиска 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])
На основе поиска 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])
Я написал этот маленький скрипт, который следует за тем, что делает 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 ]
Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до 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
Я использовал скрипт alphaloop, и он работал нормально, но он работает только для MP3, а моя музыкальная библиотека - это в основном FLAC и OGG, поэтому я написал небольшой инструмент командной строки Java, чтобы перенести все обложки, независимо от типа файла. [ ! d0]
Вы можете найти его здесь: BansheeArtworkWriter
Прошло около 11 минут в моей музыкальной библиотеке 2.7k файлов, и она перенесла все обложки, следуя инструкциям в readme GitHub, и это должно быть
Надеюсь, это поможет кому-то еще.
Я написал этот маленький скрипт, который следует за , что 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
находится там, где можно скопировать файлы, на которые были скопированы файлы (в случае, если что-то пошло не так, и вам нужно удалить все файлы обложки, которые это записывает.
Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до 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
Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до 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
Чтобы убедиться, что я нашел все альбомы, мне нужно было нормализовать строку до 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