mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-13 18:57:18 +03:00
98 lines
3.0 KiB
Bash
Executable File
98 lines
3.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Script to transfort .itc files into images (JPG or PNG)
|
|
#
|
|
# .itc files are located in ~/Music/iTunes/Album Artwork
|
|
#
|
|
# This script uses (/!\ needs ) ImageMagick's convert, hexdump, printf and dd.
|
|
#
|
|
# This script might be a little slow, You might want to look at Simon Kennedy's work at http://www.sffjunkie.co.uk/python-itc.html
|
|
#
|
|
# ~/{Library Path}/Album Artwork/Cache/D989408F65D05F99/04/13/04/D989408F65D05F99-EB5B7A9086F4B4D4.itc
|
|
#
|
|
# The filenames are an amalgam of the library ID (D989408F65D05F99) and the track's ID (EB5B7A9086F4B4D4).
|
|
# The directory structure comes from the library ID and the last three digits of the track's ID converted to decimal,
|
|
# ie 4D4 becomes 04, 13, 04.
|
|
#
|
|
|
|
AlbumArtwork="${HOME}/Music/iTunes 1/Album Artwork"
|
|
DestinationDir="Artwork"
|
|
IFS=$'\n'
|
|
|
|
|
|
if [ ! -d "$DestinationDir" ]; then
|
|
mkdir "$DestinationDir"
|
|
echo "new Images dir"
|
|
fi
|
|
|
|
for file in `find "$AlbumArtwork" -name '*.itc'`; do
|
|
start=0x11C
|
|
exit=0;
|
|
i=1;
|
|
echo $file
|
|
while [ 1 ]; do
|
|
|
|
typeOffset=$(($start+0x30))
|
|
imageType=$(hexdump -n 4 -s $typeOffset -e '"0x"4/1 "%02x" "\n"' $file)
|
|
|
|
#If there is no next byte, jump to the next itc file.
|
|
if [[ -z $imageType ]]; then
|
|
break
|
|
fi
|
|
|
|
imageOffsetOffset=$(($start+8))
|
|
|
|
itemSize=$(hexdump -n 4 -s $start -e '"0x"4/1 "%02x" "\n"' $file)
|
|
imageOffset=$(hexdump -n 4 -s $imageOffsetOffset -e '"0x"4/1 "%02x" "\n"' $file)
|
|
|
|
imageStart=$(($start+$imageOffset))
|
|
imageSize=$(($itemSize-imageOffset))
|
|
|
|
imageWidth=$(hexdump -n 4 -s $(($start+56)) -e '"0x"4/1 "%02x" "\n"' $file)
|
|
imageWidth=$(printf "%d" $imageWidth)
|
|
imageHeight=$(hexdump -n 4 -s $(($start+60)) -e '"0x"4/1 "%02x" "\n"' $file)
|
|
imageHeight=$(printf "%d" $imageHeight)
|
|
|
|
dir=$(dirname "$file")
|
|
xbase=${file##*/} #file.etc
|
|
xpref=${xbase%.*} #file prefix
|
|
|
|
#echo $file
|
|
#echo itemsize $itemSize
|
|
#echo start $start
|
|
#echo imageOffset $imageOffset
|
|
#echo imageStart $imageStart
|
|
#echo imageSize $imageSize
|
|
#echo imageWidth $imageWidth
|
|
#echo imageHeight $imageHeight
|
|
|
|
if [[ $imageType -eq 0x504E4766 ]] || [[ $imageType -eq 0x0000000E ]] ; then
|
|
targetFile="$DestinationDir/$xpref-$i.png"
|
|
if [ ! -f "$targetFile" ]; then
|
|
echo PNG
|
|
dd skip=$imageStart count=$imageSize if="$file" of="$targetFile" bs=1 &> /dev/null
|
|
fi
|
|
elif [[ $imageType -eq 0x41524762 ]] ; then
|
|
targetFile="$DestinationDir/$xpref-$i.png"
|
|
if [ ! -f "$targetFile" ]; then
|
|
echo ARGB
|
|
dd skip=$imageStart count=$imageSize if="$file" of="$TMPDIR/test$i" bs=1 &> /dev/null
|
|
|
|
#Using a matrix to convert ARGB to RGBA since imagemagick does only support rgba input
|
|
convert -size $imageWidth"x"$imageHeight -depth 8 -color-matrix '0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0' rgba:"$TMPDIR/test$i" "$targetFile"
|
|
fi
|
|
elif [[ $imageType -eq 0x0000000D ]] ; then
|
|
targetFile="$DestinationDir/$xpref-$i.jpg"
|
|
if [ ! -f "$targetFile" ]; then
|
|
echo JPG
|
|
dd skip=$imageStart count=$imageSize if="$file" of="$targetFile" bs=1 &> /dev/null
|
|
fi
|
|
else
|
|
echo $imageType
|
|
exit=1
|
|
break;
|
|
fi
|
|
|
|
start=$(($start+$itemSize))
|
|
i=$(($i+1))
|
|
done
|
|
done |