Estoy desarrollando un script en Bash que:
1.Baje la musica de Youtube con YT-DLP
2.le de metadatos a todas la canciones que baje automaticamente (Nombre, Artista, Album, Año y Portada) con FFmpeg
Entonces la idea mia es usar un formato lossy como lo es OGG Vorbis, a funcionado relativamente bien, excepto con la portada, que por alguna razon no se renderiza apropiadamente en software como VLC, Kid3 y VLC para Android, este es el script:
#! /bin/bash
#Leer el Album, Artista, Portada y Año
read -p "ENTER ALBUM:" Album
read -p "ENTER ARTIST:" Artist
read -p "ENTER COVER:" Cover
read -p "ENTER YEAR:" Year
#Leer las URL
read -p "ENTER URLs: " URL
#Descargar el Archivo Temporal
for Song in "${URL[@]}"; do
yt-dlp --extract-audio --audio-format mp3 -o "%(title)s.temp.%(ext)s" $URL
done
#Crear a vorbis.head, necesario para la portada
echo -en "\0\0\0\x03\0\0\0\x0aimage/jpeg\0\0\0\x08test.jpg\0\0\0\x08\0\0\0\x0e\0\0\0\x20\0\0\0\0\0\0\x05\xad" > vorbis.head
echo "HEXDUMP vorbis.head:"
hexdump -C vorbis.head
#conversion recursiva de todos los .temp.ogg a .ogg con los metadatos
for filename in *temp.ogg; do
ffmpeg -i "$filename" \
-metadata title="${filename%.temp.ogg}" \
-metadata artist="$Artist" \
-metadata album="$Album" \
-metadata year="$Year" \
-map 0:a -metadata:s:a METADATA_BLOCK_PICTURE="$(cat vorbis.head "$Cover" | base 64 --wrap 0)" "${filename%.temp.ogg}.ogg"
done
#Eliminar la Portada (si se quiere) y a los .temp.ogg y a vorbis.head
echo "CONVERSION DONE!"
rm -i $Cover
rm *.temp.ogg
rm vorbis.head
El codigo es algo ineficiente en estos momentos, sobre todo por que he tenido problemas con la portada, esta es inyectada al ogg mediante el metodo de vorbis.head (de aqui saque el metodo: https://superuser.com/questions/1708793/how-to-add-an-art-cover-in-ogg-audio-file), pero este no es infalible! asi que, estoy pidiendo ayuda para mejorar la “inyeccion” de la portada en el ogg, ademas de pequeñas mejoras necesarias como el manejo de excepciones y extraer de Youtube el orden de las canciones.
Este es mi primer script de bash serio, asi que si no he hecho algo como se deberia porfavor diganmelo para corregirlo.
Gracias.