From 3d35ee02bc656fdc743b52136c9bc078c404e02d Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 03:13:10 +0200 Subject: [PATCH 1/6] checkextensions --- toys/README | 3 ++ toys/checkextensions | 103 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 toys/README create mode 100755 toys/checkextensions diff --git a/toys/README b/toys/README new file mode 100644 index 0000000..df08137 --- /dev/null +++ b/toys/README @@ -0,0 +1,3 @@ +checkextensions +=============== +Reports files whose extension does not match the (detected) mime-type. diff --git a/toys/checkextensions b/toys/checkextensions new file mode 100755 index 0000000..5ee9167 --- /dev/null +++ b/toys/checkextensions @@ -0,0 +1,103 @@ +#!/bin/bash + +# config structures +declare -A \ + destinationchannels \ + destinationfat32compat \ + destinationcopymime \ + destinationformat \ + destinationfrequency \ + destinationid \ + destinationloss \ + destinationmaxbps \ + destinationnormalize \ + destinationpath \ + destinationquality \ + destinationrename \ + destinationnoresample \ + destinationrenamepath \ + destinationskipmime \ +|| { + echo "Check your Bash version. You need >= 4.0" >&2 + exit $EBASHVERS +} + +declare -r \ + DOCDIR=./doc \ + LIBDIR=./lib \ + SHAREDIR=./share +declare -r \ + exampleconf=$DOCDIR/example.cfg \ + schema=$SHAREDIR/schema.sql \ + \ + oldIFS="$IFS" + +LC_ALL=C + +shopt -s extglob + +for function in "$LIBDIR"/*/* +do + source "$function" +done + +getConfig + +openDatabase + +getFiles + +echo ' + SELECT + source_files.id, + source_files.filename, + mime_types.mime_text + FROM + source_files + INNER JOIN mime_types + ON source_files.mime_type = mime_types.id + ; + SELECT "AtOM:NoMoreFiles"; +' >&3 + +while read -u4 line +do + if [[ $line == AtOM:NoMoreFiles ]] + then + break + fi + fileid=${line%%|*} + rest="${line#*|}|" + filename=${rest%%|*} + rest=${rest#*|} + mimetype=${rest%%|*} + rest=${rest#*|} + case "$mimetype" in + 'audio/mpeg') + if [[ ${filename##*.} != mp3 ]] + then + echo "$filename: MP3 (.mp3)" + fi + ;; + 'application/ogg vorbis') + if [[ ${filename##*.} != ogg ]] + then + echo "$filename: Ogg Vorbis (.ogg)" + fi + ;; + 'application/ogg opus') + if [[ ${filename##*.} != opus ]] + then + echo "$filename: Opus (.opus)" + fi + ;; + 'audio/x-flac') + if [[ ${filename##*.} != flac ]] + then + echo "$filename: FLAC (.flac)" + fi + ;; + esac +done + +closeDatabase From e09fefb42998a8550a1ae6a91da48f9f29f833e3 Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 03:48:39 +0200 Subject: [PATCH 2/6] rename files --- toys/README | 5 +++++ toys/checkextensions | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/toys/README b/toys/README index df08137..e518275 100644 --- a/toys/README +++ b/toys/README @@ -1,3 +1,8 @@ checkextensions =============== Reports files whose extension does not match the (detected) mime-type. + +Options: + -u: update source directory + -r: rename files + -n: (with -r): show what would be done. diff --git a/toys/checkextensions b/toys/checkextensions index 5ee9167..585d48c 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -41,11 +41,20 @@ do source "$function" done +while getopts 'urn' opt +do + case $opt in + u) update=1 ;; + r) rename=1 ;; + n) pretend=1 ;; + esac +done + getConfig openDatabase -getFiles +(( update )) && getFiles echo ' SELECT @@ -59,6 +68,14 @@ echo ' ; SELECT "AtOM:NoMoreFiles"; ' >&3 +renameFile() { + echo $'\t'"${filename%.*}$extension" + if ! (( pretend )) + then + mv "$sourcepath/$filename" "$sourcepath/${filename%.*}$extension" + Update source_files filename "${filename%.*}$extension" + fi +} while read -u4 line do @@ -76,25 +93,33 @@ do 'audio/mpeg') if [[ ${filename##*.} != mp3 ]] then - echo "$filename: MP3 (.mp3)" + extension=.mp3 + echo "$filename: MP3 ($extension)" + (( rename )) && renameFile fi ;; 'application/ogg vorbis') if [[ ${filename##*.} != ogg ]] then - echo "$filename: Ogg Vorbis (.ogg)" + extension=.ogg + echo "$filename: Ogg Vorbis ($extension)" + (( rename )) && renameFile fi ;; 'application/ogg opus') if [[ ${filename##*.} != opus ]] then - echo "$filename: Opus (.opus)" + extension=.opus + echo "$filename: Opus ($extension)" + (( rename )) && renameFile fi ;; 'audio/x-flac') if [[ ${filename##*.} != flac ]] then - echo "$filename: FLAC (.flac)" + extension=.flac + echo "$filename: FLAC ($extension)" + (( rename )) && renameFile fi ;; esac From 2c507a4181415877d2612095918b9dff25d0d74b Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 04:16:41 +0200 Subject: [PATCH 3/6] small fixes --- toys/checkextensions | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/toys/checkextensions b/toys/checkextensions index 585d48c..21994ef 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -41,12 +41,13 @@ do source "$function" done -while getopts 'urn' opt +while getopts 'urnD' opt do case $opt in u) update=1 ;; r) rename=1 ;; n) pretend=1 ;; + D) (( debug++ )) ;; esac done @@ -72,8 +73,12 @@ renameFile() { echo $'\t'"${filename%.*}$extension" if ! (( pretend )) then - mv "$sourcepath/$filename" "$sourcepath/${filename%.*}$extension" - Update source_files filename "${filename%.*}$extension" + mv \ + "$sourcepath/$filename" \ + "$sourcepath/${filename%.*}$extension" \ + && Update source_files filename "${filename%.*}$extension"<<-EOW + id = $fileid + EOW fi } @@ -83,6 +88,10 @@ do then break fi + lines+=("$line") +done +for line in "${lines[@]}" +do fileid=${line%%|*} rest="${line#*|}|" filename=${rest%%|*} From 496c48d04d11567c388c35b733444aa8f9d8c51a Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 17:01:22 +0200 Subject: [PATCH 4/6] scan destination_files --- toys/checkextensions | 83 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/toys/checkextensions b/toys/checkextensions index 21994ef..39aa2cf 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -69,14 +69,70 @@ echo ' ; SELECT "AtOM:NoMoreFiles"; ' >&3 + +getdstfiles() { + local \ + line \ + lines + unset dest + for destination in "${!destinationformat[@]}" + do + if [[ ${destinationformat["$destination"]} != $format ]] + then + continue + fi + echo ' + SELECT + destination_files.id, + destination_files.filename + FROM destination_files + INNER JOIN source_files + ON + destination_files.source_file_id=source_files.id + INNER JOIN destinations + ON + destinations.id=destination_files.destination_id + WHERE source_files.id='$fileid' + AND destinations.name="'"$destination"'" + AND destination_files.filename IS NOT NULL + AND destination_files.filename NOT LIKE + "%'$extension'" + ; + SELECT "AtOM:NoMoreFiles"; + '>&3 + while read -u4 line + do + if [[ $line == AtOM:NoMoreFiles ]] + then + break + fi + lines+=("$line") + done + done + for line in "${lines[@]}" + do + fileid=${line%|*} + filename=${line#*|} + echo $'\t'"$filename" + (( rename )) && echo -n $'\t' + (( rename )) && renameFile + done +} + renameFile() { - echo $'\t'"${filename%.*}$extension" + echo " -> ${filename%.*}$extension" if ! (( pretend )) then mv \ - "$sourcepath/$filename" \ - "$sourcepath/${filename%.*}$extension" \ - && Update source_files filename "${filename%.*}$extension"<<-EOW + "${dest:+$dest/}$filename" \ + "${dest:+$dest/}${filename%.*}$extension" \ + if [[ $dest == '' ]] + then + table=destination_files + else + table=source_files + fi + && Update $table filename "${filename%.*}$extension"<<-EOW id = $fileid EOW fi @@ -98,39 +154,58 @@ do rest=${rest#*|} mimetype=${rest%%|*} rest=${rest#*|} + dest=$sourcepath case "$mimetype" in 'audio/mpeg') if [[ ${filename##*.} != mp3 ]] then + format=mp3 extension=.mp3 echo "$filename: MP3 ($extension)" (( rename )) && renameFile + getdstfiles fi ;; 'application/ogg vorbis') if [[ ${filename##*.} != ogg ]] then + format=vorbis extension=.ogg echo "$filename: Ogg Vorbis ($extension)" (( rename )) && renameFile + getdstfiles fi ;; 'application/ogg opus') if [[ ${filename##*.} != opus ]] then + format=opus extension=.opus echo "$filename: Opus ($extension)" (( rename )) && renameFile + getdstfiles fi ;; 'audio/x-flac') if [[ ${filename##*.} != flac ]] then + format=flac extension=.flac echo "$filename: FLAC ($extension)" (( rename )) && renameFile fi ;; + 'application/data') + extendedtype=$(file -b "$sourcepath/$filename") + [[ $extendedtype =~ Mmeusepack ]] || continue + if [[ ${filename##*.} != flac ]] + then + format=mpc + extension=.mpc + echo "$filename: Musepack ($extension)" + (( rename )) && renameFile + fi + ;; esac done From 38d2bd3e735545ceeb5e38387cd0de1bd3eeef5e Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 17:23:22 +0200 Subject: [PATCH 5/6] typo --- toys/checkextensions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toys/checkextensions b/toys/checkextensions index 39aa2cf..2d33d7a 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -197,7 +197,7 @@ do ;; 'application/data') extendedtype=$(file -b "$sourcepath/$filename") - [[ $extendedtype =~ Mmeusepack ]] || continue + [[ $extendedtype =~ Musepack ]] || continue if [[ ${filename##*.} != flac ]] then format=mpc From b147aedd94085a2518fa2e1617ed4b8565271137 Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Sun, 7 Apr 2013 17:32:53 +0200 Subject: [PATCH 6/6] syntax --- toys/checkextensions | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/toys/checkextensions b/toys/checkextensions index 2d33d7a..e68949c 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -123,15 +123,15 @@ renameFile() { echo " -> ${filename%.*}$extension" if ! (( pretend )) then - mv \ - "${dest:+$dest/}$filename" \ - "${dest:+$dest/}${filename%.*}$extension" \ if [[ $dest == '' ]] then table=destination_files else table=source_files fi + mv \ + "${dest:+$dest/}$filename" \ + "${dest:+$dest/}${filename%.*}$extension" \ && Update $table filename "${filename%.*}$extension"<<-EOW id = $fileid EOW