diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21963fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.ex +*.EX +trace.log diff --git a/lib/copy/copyFiles_action b/lib/copy/copyFiles_action index a944ef8..0134eb5 100644 --- a/lib/copy/copyFiles_action +++ b/lib/copy/copyFiles_action @@ -43,42 +43,37 @@ copyFiles_action() { rest=${rest#*::AtOM:SQL:Sep::} destfileid=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} - echo 'SELECT IFNULL( ( - SELECT destination_files.filename - FROM destination_files - INNER JOIN source_files - ON destination_files.source_file_id=source_files.id - INNER JOIN mime_type_actions - ON - mime_type_actions.id=source_files.mime_type - INNER JOIN destinations - ON destinations.id=destination_files.destination_id - WHERE destinations.id = '$destinationid' - AND source_files.filename LIKE - "'"${sourcedir//\"/\"\"}"'/%" - AND mime_type_actions.action = 1 - LIMIT 1 - ),"AtOM:NotFound"); - '>&3 - read -u4 filename - if [[ $filename != AtOM:NotFound ]] - then - destdir=${filename%/*} - if cp -al "$sourcepath/$sourcefilename" "$destdir" 2>/dev/null\ - || cp -a "$sourcepath/$sourcefilename" "$destdir" - then - Update destination_files \ - filename "$destdir/${sourcefilename##*/}"\ - rename_pattern "${destinationrenamepath[$destination]}/${destinationrename[$destination]}:${destinationfat32compat["$destination"]}"\ - last_change $lastchange \ - <<-EOWhere - id = $destfileid - EOWhere - (( done++ )) - fi - fi (( count++ )) printf '\b\b\b\b%3i%%' $(( (count * 100) / ${#copyfiles[@]} )) + if [ -n "${renamepath["$destination"]}" ] + then + destdir="$(guessPath)" || continue + else + destdir="${destinationpath["$destination"]}/" + destdir+=$(sanitizeFile "${sourcefilename%%/*}" dir) + part=${sourcefilename#*/} + while [[ $part =~ / ]] + do + destdir+="/$(sanitizeFile "${part%%/*}" dir)" + part=${part#*/} + done + if ! [ -d "$destdir" ] + then + mkdir -p "$destdir" + fi + fi + if cp -al "$sourcepath/$sourcefilename" "$destdir" 2>/dev/null\ + || cp -a "$sourcepath/$sourcefilename" "$destdir" + then + Update destination_files \ + filename "$destdir/${sourcefilename##*/}"\ + rename_pattern "${destinationrenamepath[$destination]}/${destinationrename[$destination]}:${destinationfat32compat["$destination"]}"\ + last_change $lastchange \ + <<-EOWhere + id = $destfileid + EOWhere + (( done++ )) + fi done echo 'COMMIT;' >&3 echo -e "\rCopied ${done:-0} of $count files.\033[K" diff --git a/lib/copy/guessPath b/lib/copy/guessPath new file mode 100644 index 0000000..ccb0e4b --- /dev/null +++ b/lib/copy/guessPath @@ -0,0 +1,28 @@ +#!/bin/bash + +guessPath() { + echo 'SELECT IFNULL( ( + SELECT destination_files.filename + FROM destination_files + INNER JOIN source_files + ON destination_files.source_file_id=source_files.id + INNER JOIN mime_type_actions + ON + mime_type_actions.id=source_files.mime_type + INNER JOIN destinations + ON destinations.id=destination_files.destination_id + WHERE destinations.id = '$destinationid' + AND source_files.filename LIKE + "'"${sourcedir//\"/\"\"}"'/%" + AND mime_type_actions.action = 1 + LIMIT 1 + ),"AtOM:NotFound"); + '>&3 + read -u4 filename + if [[ $filename != AtOM:NotFound ]] + then + echo "${filename%/*}" + else + return 1 + fi +} diff --git a/lib/database/Insert b/lib/database/Insert index 77f7ec2..32d09be 100644 --- a/lib/database/Insert +++ b/lib/database/Insert @@ -15,6 +15,10 @@ Insert() { insert_keys+='`'"$key"'`' (( ${#insert_values} )) && insert_values+="," case $value in + '::AtOM:FT::'*) + value="${value//::AtOM:FT::/}" + insert_values+='"'"${value//\"/\"\"}"'"' + ;; 'NULL') insert_values+="NULL" ;; diff --git a/lib/database/InsertIfUnset b/lib/database/InsertIfUnset index 4277a62..5f53e7a 100644 --- a/lib/database/InsertIfUnset +++ b/lib/database/InsertIfUnset @@ -25,7 +25,8 @@ InsertIfUnset() { Select "$table" "$column" < <( for key in ${!keys[@]} do - echo "${keys[$key]}" = "${values[$key]}" + echo "${keys[$key]}" = \ + "${values[$key]//::AtOM:FT::}" done ) ) diff --git a/lib/database/Update b/lib/database/Update index 0fe5db5..015eac6 100644 --- a/lib/database/Update +++ b/lib/database/Update @@ -26,6 +26,10 @@ Update() { ;; value) case $argument in + '::AtOM:FT::'*) + argument="${argument//::AtOM:FT::/}" + set_statement+=" = "'"'"${argument//\"/\"\"}"'"' + ;; 'NULL') set_statement+=" = NULL" ;; diff --git a/lib/tags/updateTags b/lib/tags/updateTags index d317c1a..9881843 100644 --- a/lib/tags/updateTags +++ b/lib/tags/updateTags @@ -4,32 +4,25 @@ updateTags() { do tagreaderclause+="${tagreaderclause:+ AND }NOT tags.tagreader = \"$reader\"" done - echo ' - SELECT COUNT(DISTINCT source_files.filename) - FROM source_files - INNER JOIN destination_files - ON destination_files.source_file_id=source_files.id - INNER JOIN destinations - ON destination_files.destination_id=destinations.id - INNER JOIN mime_type_actions - ON destinations.id=mime_type_actions.destination_id - INNER JOIN tags - ON source_files.id=tags.source_file - WHERE mime_type_actions.id = source_files.mime_type - AND ( - CAST(tags.last_change AS TEXT) - <> - CAST(source_files.last_change AS TEXT) - OR ('"$tagreaderclause"') - ) - AND mime_type_actions.action = 1;' >&3 - read -u4 filecount echo ' SELECT DISTINCT source_files.id, source_files.last_change, mime_type_actions.mime_text, - source_files.filename + source_files.filename, + tags.album, + tags.albumartist, + tags.artist, + tags.composer, + tags.disc, + tags.genre, + tags.performer, + tags.title, + tags.track, + tags.year, + tags.rate, + tags.channels, + tags.bitrate FROM source_files INNER JOIN destination_files ON destination_files.source_file_id=source_files.id @@ -53,6 +46,7 @@ updateTags() { while ! [[ $line = AtOM:NoMoreFiles ]] do tagfiles+=("$line") + (( filecount++ )) read -u4 line done echo 'BEGIN TRANSACTION;' >&3 @@ -63,7 +57,34 @@ updateTags() { lastchange=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} mimetype=${rest%%::AtOM:SQL:Sep::*} - filename=${rest#*::AtOM:SQL:Sep::} + rest=${rest#*::AtOM:SQL:Sep::} + filename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldalbum=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldalbumartist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldartist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldcomposer=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + olddisc=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldgenre=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldperformer=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldtitle=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldtrack=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldyear=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldrate=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldchannels=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + oldbitrate=${rest%%::AtOM:SQL:Sep::*} echo -en "\rTags: $((++count*100/filecount))%" if (( count % 1000 == 0 )) then @@ -73,22 +94,35 @@ updateTags() { fi if getTags then - Update tags \ - album "${album:-NULL}" \ - albumartist "${albumartist:-NULL}" \ - artist "${artist:-NULL}" \ - composer "${composer:-NULL}" \ - disc "${disc:-NULL}" \ - genre "${genre:-NULL}" \ - performer "${performer:-NULL}" \ - title "${title:-NULL}" \ - track "${tracknum:-NULL}" \ - year "${year:-NULL}" \ - last_change "$lastchange" \ - rate "${rate:-NULL}" \ - channels "${channels:-NULL}" \ - bitrate "${bitrate:-NULL}" \ - tagreader "$tagreader" \ + [[ $oldalbum != "$album" ]]&& ual=1 + [[ $oldalbumartist != "$albumartist" ]]&&uaa=1 + [[ $oldartist != "$artist" ]]&& uar=1 + [[ $oldcomposer != "$composer" ]]&& uco=1 + [[ $olddisc != "$disc" ]]&& udi=1 + [[ $oldgenre != "$genre" ]]&& uge=1 + [[ $oldperformer != "$performer" ]]&& upe=1 + [[ $oldtitle != "$title" ]]&& uti=1 + [[ $oldtrack != "$tracknum" ]]&& utr=1 + [[ $oldyear != "$year" ]]&& uye=1 + [[ $oldrate != "$rate" ]]&& ura=1 + [[ $oldchannels != "$channels" ]]&& uch=1 + [[ $oldbitrate != "$bitrate" ]]&& ubi=1 + Update tags \ + ${ual:+album "::AtOM:FT::${album:-NULL}"}\ + ${uaa:+albumartist "::AtOM:FT::${albumartist:-NULL}"}\ + ${uar:+artist "::AtOM:FT::${artist:-NULL}"}\ + ${uco:+composer "::AtOM:FT::${composer:-NULL}"}\ + ${udi:+disc "${disc:-NULL}"} \ + ${uge:+genre "${genre:-NULL}"} \ + ${upe:+performer "::AtOM:FT::${performer:-NULL}"}\ + ${uti:+title "::AtOM:FT::${title:-NULL}"}\ + ${utr:+track "::AtOM:FT::${tracknum:-NULL}"}\ + ${uye:+year "${year:-NULL}"} \ + last_change "$lastchange" \ + ${ura:+rate "${rate:-NULL}"} \ + ${uch:+channels "${channels:-NULL}"} \ + ${ubi:+bitrate "${bitrate:-NULL}"} \ + tagreader "$tagreader" \ >/dev/null <<<"source_file = $sourcefileid" unset genre \ albumartist \ @@ -102,7 +136,20 @@ updateTags() { performer \ rate \ bitrate \ - channels + channels \ + ual \ + uaa \ + uar \ + uco \ + udi \ + uge \ + upe \ + uti \ + utr \ + uye \ + ura \ + uch \ + ubi fi done echo 'COMMIT;' >&3 diff --git a/share/schema.sql b/share/schema.sql index 2a915e4..1859f55 100644 --- a/share/schema.sql +++ b/share/schema.sql @@ -110,8 +110,23 @@ CREATE TRIGGER IF NOT EXISTS create_tags AFTER INSERT ON source_files BEGIN INSERT INTO tags (source_file,last_change) VALUES (new.id,0); END; -CREATE TRIGGER IF NOT EXISTS force_destination_update_on_tag_update - AFTER UPDATE ON tags +DROP TRIGGER IF EXISTS force_destination_update_on_tag_update; +CREATE TRIGGER force_destination_update_on_tag_update + AFTER UPDATE OF + genre, + albumartist, + year, + album, + disc, + artist, + track, + title, + composer, + performer, + rate, + channels, + bitrate + ON tags BEGIN UPDATE destination_files SET last_change=0 WHERE source_file_id=old.source_file;