Merge branch 'master' into toys
This commit is contained in:
commit
c5d35386b5
23
README
23
README
@ -52,3 +52,26 @@ AtOM requires a database to function. Now that we have a database containing
|
||||
various information about our media files, why not use it?
|
||||
AtOM comes with a small set of tools in the toys/ directory. These are
|
||||
documented in toys/README.
|
||||
|
||||
========================
|
||||
Shameless Self Promotion
|
||||
------------------------
|
||||
I am the author of free (Creative Commons CC-By-SA) music which you can stream
|
||||
for free, or buy to get high quality and bonuses from Bandcamp
|
||||
(http://djblackred.bandcamp.com). If you like electronic music taking its
|
||||
inspiration from Trance, Drum & Bass, Ambient and (rarely) Free Jazz, please
|
||||
check it out!
|
||||
Downloads are available in FLAC, Ogg, MP3, and more, and includes the "source
|
||||
code" (sequencer files and the likes) for most tracks.
|
||||
I am receiving 85% of the money you'll spend, so you won't be feeding some
|
||||
greedy BigCorp producer or distributor.
|
||||
And if you don't like it, you can still spread the word to friends who may like.
|
||||
You can see this as a way to thank me for this piece of code.
|
||||
|
||||
=====
|
||||
Legal
|
||||
-----
|
||||
Some of the format and/or tool names cited above are trademarks belonging to
|
||||
their rightful owners. AtOM and its authors are not linked in any way to
|
||||
those companies or individuals. Said companies do not endorse nor support
|
||||
AtOM in any way.
|
||||
|
||||
246
atom
246
atom
@ -144,8 +144,8 @@ removed=0
|
||||
read -u4 line
|
||||
until [[ $line == AtOM:NoMoreFiles ]]
|
||||
do
|
||||
id=${line%|*}
|
||||
filename=${line#*|}
|
||||
id=${line%::AtOM:SQL:Sep::*}
|
||||
filename=${line#*::AtOM:SQL:Sep::}
|
||||
if [ -n "$filename" ]
|
||||
then
|
||||
if rm -f "$filename"
|
||||
@ -161,115 +161,7 @@ do
|
||||
done
|
||||
echo "Suppressed $deleted files, $removed removed from database"
|
||||
|
||||
# get files
|
||||
for reader in "${tagreaders[@]}"
|
||||
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
|
||||
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;
|
||||
|
||||
SELECT "AtOM:NoMoreFiles";' >&3
|
||||
read -u4 line
|
||||
while ! [[ $line = AtOM:NoMoreFiles ]]
|
||||
do
|
||||
tagfiles+=("$line")
|
||||
read -u4 line
|
||||
done
|
||||
echo 'BEGIN TRANSACTION;' >&3
|
||||
for line in "${tagfiles[@]}"
|
||||
do
|
||||
sourcefileid=${line%%|*}
|
||||
rest=${line#*|}
|
||||
lastchange=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
mimetype=${rest%%|*}
|
||||
filename=${rest#*|}
|
||||
echo -en "\rTags: $((++count*100/filecount))%"
|
||||
if (( count % 1000 == 0 ))
|
||||
then
|
||||
echo 'COMMIT;BEGIN TRANSACTION;' >&3
|
||||
(( debug )) \
|
||||
&& echo -n " $count files read, committing..."
|
||||
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" \
|
||||
>/dev/null <<<"source_file = $sourcefileid"
|
||||
unset genre \
|
||||
albumartist \
|
||||
year \
|
||||
album \
|
||||
disc \
|
||||
artist \
|
||||
tracknum \
|
||||
title \
|
||||
composer \
|
||||
performer \
|
||||
rate \
|
||||
bitrate \
|
||||
channels
|
||||
fi
|
||||
done
|
||||
echo 'COMMIT;' >&3
|
||||
echo -e "\rRead tags from ${count:-0} files.\033[K"
|
||||
unset count tagfiles
|
||||
updateTags
|
||||
|
||||
echo '
|
||||
CREATE TEMPORARY TABLE tasks(
|
||||
@ -376,7 +268,7 @@ echo '
|
||||
read -u4 line
|
||||
while ! [[ $line = AtOM:NoMoreFiles ]]
|
||||
do
|
||||
decodefiles+=("$line|")
|
||||
decodefiles+=("$line::AtOM:SQL:Sep::")
|
||||
read -u4 line
|
||||
done
|
||||
echo -n 'Creating tasks... '
|
||||
@ -384,41 +276,41 @@ echo -n 'Creating tasks... '
|
||||
echo 'BEGIN TRANSACTION;' >&3
|
||||
for line in "${decodefiles[@]}"
|
||||
do
|
||||
fileid=${line%%|*}
|
||||
rest=${line#*|}
|
||||
filename=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
mimetype=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destination=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
rate=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
channels=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
bitrate=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
genre=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
albumartist=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
year=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
album=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
disc=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
artist=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
track=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
title=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
composer=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
performer=${rest%%|*}
|
||||
fileid=${line%%::AtOM:SQL:Sep::*}
|
||||
rest=${line#*::AtOM:SQL:Sep::}
|
||||
filename=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
mimetype=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destination=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destfileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
rate=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
channels=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
bitrate=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
genre=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
albumartist=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
year=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
album=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
disc=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
artist=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
track=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
title=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
composer=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
performer=${rest%%::AtOM:SQL:Sep::*}
|
||||
unset rest
|
||||
decodeFile
|
||||
getDestDir
|
||||
@ -647,32 +539,32 @@ do
|
||||
echo -n "$destination: rename pattern changed, renaming files... "
|
||||
while [[ $line != AtOM:NoMoreFiles ]]
|
||||
do
|
||||
oldfilename=${line%%|*}
|
||||
rest=${line#*|}'|'
|
||||
destfileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
filename=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
album=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
albumartist=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
artist=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
composer=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
disc=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
genre=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
performer=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
title=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
track=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
year=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
oldfilename=${line%%::AtOM:SQL:Sep::*}
|
||||
rest=${line#*::AtOM:SQL:Sep::}'::AtOM:SQL:Sep::'
|
||||
destfileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
filename=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
album=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
albumartist=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
artist=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
composer=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
disc=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
genre=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
performer=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
title=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
track=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
year=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
if [ -n "$oldfilename" -a -f "$oldfilename" ]
|
||||
then
|
||||
getDestDir
|
||||
@ -720,10 +612,10 @@ done
|
||||
echo 'BEGIN TRANSACTION;' >&3
|
||||
for line in "${lines[@]}"
|
||||
do
|
||||
id=${line%%|*}
|
||||
rest=${line#*|}
|
||||
filename=${rest%%|*}
|
||||
oldfilename=${rest#*|}
|
||||
id=${line%%::AtOM:SQL:Sep::*}
|
||||
rest=${line#*::AtOM:SQL:Sep::}
|
||||
filename=${rest%%::AtOM:SQL:Sep::*}
|
||||
oldfilename=${rest#*::AtOM:SQL:Sep::}
|
||||
if [[ $oldfilename != $filename ]] && [ -f "$oldfilename" ]
|
||||
then
|
||||
rm -f "$oldfilename"
|
||||
|
||||
@ -6,6 +6,7 @@ copyFiles_action() {
|
||||
source_files.filename,
|
||||
source_files.last_change,
|
||||
destinations.id,
|
||||
destinations.name,
|
||||
destination_files.id
|
||||
FROM source_files
|
||||
INNER JOIN destination_files
|
||||
@ -31,15 +32,17 @@ copyFiles_action() {
|
||||
echo 'BEGIN TRANSACTION;' >&3
|
||||
for copyfile in "${copyfiles[@]}"
|
||||
do
|
||||
sourcefilename=${copyfile%%|*}
|
||||
sourcefilename=${copyfile%%::AtOM:SQL:Sep::*}
|
||||
sourcedir=${sourcefilename%/*}
|
||||
rest="${copyfile#*|}|"
|
||||
lastchange=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destinationid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
rest="${copyfile#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::"
|
||||
lastchange=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destinationid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destination=${rest%%::AtOM:SQL:Sep::*}
|
||||
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
|
||||
|
||||
@ -24,5 +24,6 @@ openDatabase() {
|
||||
exec 3> >(tee -a $tempdir/debug.log >&5)
|
||||
fi
|
||||
cat $schema >&3
|
||||
echo '.separator ::AtOM:SQL:Sep::' >&3
|
||||
echo 'PRAGMA foreign_keys = ON;' >&3
|
||||
}
|
||||
|
||||
@ -3,7 +3,17 @@ decodeFile() {
|
||||
case "$mimetype" in
|
||||
'video/'*)
|
||||
extractAudio
|
||||
if (( ${destinationnormalize["$destination"]}))\
|
||||
|| (
|
||||
[ -n "${destinationfrequency["$destination"]}" ]\
|
||||
&& (( ${rate:-0} != ${destinationfrequency["$destination"]}))\
|
||||
) || (
|
||||
[ -n "${destinationchannels["$destination"]}" ]\
|
||||
&& (( ${channels:-0} != ${destinationchannels["$destination"]} ))
|
||||
)
|
||||
then
|
||||
sox_needed=1
|
||||
fi
|
||||
;;
|
||||
'audio/mpeg')
|
||||
if [[ ${destinationformat[$destination]} = mp3 ]] \
|
||||
|
||||
@ -1,7 +1,34 @@
|
||||
#!/bin/bash
|
||||
getDestDir() {
|
||||
destdir="${destinationpath[$destination]}/"
|
||||
if [ -n "${destinationrenamepath[$destination]}" ]
|
||||
if [ -n "${destinationrenamepath[$destination]}" ] \
|
||||
&& (
|
||||
(
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{album\} ]] \
|
||||
|| [ -n "$album" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{albumartist\} ]] \
|
||||
|| [ -n "$albumartist" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{artist\} ]] \
|
||||
|| [ -n "$artist" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{genre\} ]] \
|
||||
|| [ -n "$genre" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{title\} ]] \
|
||||
|| [ -n "$title" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{track\} ]] \
|
||||
|| [ -n "$track" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{year\} ]] \
|
||||
|| [ -n "$year" ]
|
||||
) && (
|
||||
! [[ ${destinationrenamepath[$destination]} =~ %\{disc\} ]] \
|
||||
|| [ -n "$disc" ]
|
||||
)
|
||||
)
|
||||
then
|
||||
replace=$(sanitizeFile "$album" dir)
|
||||
destdir+="${destinationrenamepath[$destination]//%\{album\}/$replace}"
|
||||
|
||||
@ -1,6 +1,33 @@
|
||||
#!/bin/bash
|
||||
getDestFile() {
|
||||
if [ -n "${destinationrename[$destination]}" ]
|
||||
if [ -n "${destinationrename[$destination]}" ] \
|
||||
&& (
|
||||
(
|
||||
! [[ ${destinationrename[$destination]} =~ %\{album\} ]] \
|
||||
|| [ -n "$album" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{albumartist\} ]] \
|
||||
|| [ -n "$albumartist" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{artist\} ]] \
|
||||
|| [ -n "$artist" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{genre\} ]] \
|
||||
|| [ -n "$genre" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{title\} ]] \
|
||||
|| [ -n "$title" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{track\} ]] \
|
||||
|| [ -n "$track" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{year\} ]] \
|
||||
|| [ -n "$year" ]
|
||||
) && (
|
||||
! [[ ${destinationrename[$destination]} =~ %\{disc\} ]] \
|
||||
|| [ -n "$disc" ]
|
||||
)
|
||||
)
|
||||
then
|
||||
destfile="${destinationrename[$destination]//%\{album\}/$album}"
|
||||
destfile="${destfile//%\{albumartist\}/$albumartist}"
|
||||
|
||||
@ -27,5 +27,12 @@ sanitizeFile() {
|
||||
string=${string/%+(.)/}
|
||||
fi
|
||||
fi
|
||||
# Not exactly filename sanitity, but these will make the script fail in
|
||||
# a decorative way..
|
||||
string="${string//&/\\&}"
|
||||
strint="${string//;/\\;}"
|
||||
# And these would exhibit strange behaviors
|
||||
string="${string//\[/\\\[}"
|
||||
string="${string//\]/\\\]}"
|
||||
echo "$string"
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
getInfosffmpeg_version='ffmpeg-1'
|
||||
getInfosffmpeg_version='ffmpeg-2'
|
||||
tagreaders+=( "$getInfosffmpeg_version" )
|
||||
getInfos::ffmpeg() {
|
||||
tagreader="$getInfosffmpeg_version"
|
||||
@ -31,8 +31,8 @@ getInfos::ffmpeg() {
|
||||
genre=$(gettag genre)
|
||||
performer=$(gettag TOPE)
|
||||
title=$(gettag title)
|
||||
tracknum=$(gettag tracknumber)
|
||||
year=$(gettag year)
|
||||
tracknum=$(gettag track)
|
||||
year=$(gettag date)
|
||||
expr='^[0-9]*$'
|
||||
if [ -n "$genre" ] && [[ $genre =~ $expr ]]
|
||||
then
|
||||
|
||||
111
lib/tags/updateTags
Normal file
111
lib/tags/updateTags
Normal file
@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
updateTags() {
|
||||
for reader in "${tagreaders[@]}"
|
||||
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
|
||||
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;
|
||||
|
||||
SELECT "AtOM:NoMoreFiles";' >&3
|
||||
read -u4 line
|
||||
while ! [[ $line = AtOM:NoMoreFiles ]]
|
||||
do
|
||||
tagfiles+=("$line")
|
||||
read -u4 line
|
||||
done
|
||||
echo 'BEGIN TRANSACTION;' >&3
|
||||
for line in "${tagfiles[@]}"
|
||||
do
|
||||
sourcefileid=${line%%::AtOM:SQL:Sep::*}
|
||||
rest=${line#*::AtOM:SQL:Sep::}
|
||||
lastchange=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
mimetype=${rest%%::AtOM:SQL:Sep::*}
|
||||
filename=${rest#*::AtOM:SQL:Sep::}
|
||||
echo -en "\rTags: $((++count*100/filecount))%"
|
||||
if (( count % 1000 == 0 ))
|
||||
then
|
||||
echo 'COMMIT;BEGIN TRANSACTION;' >&3
|
||||
(( debug )) \
|
||||
&& echo -n " $count files read, committing..."
|
||||
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" \
|
||||
>/dev/null <<<"source_file = $sourcefileid"
|
||||
unset genre \
|
||||
albumartist \
|
||||
year \
|
||||
album \
|
||||
disc \
|
||||
artist \
|
||||
tracknum \
|
||||
title \
|
||||
composer \
|
||||
performer \
|
||||
rate \
|
||||
bitrate \
|
||||
channels
|
||||
fi
|
||||
done
|
||||
echo 'COMMIT;' >&3
|
||||
echo -e "\rRead tags from ${count:-0} files.\033[K"
|
||||
unset count tagfiles
|
||||
}
|
||||
@ -12,16 +12,16 @@ gettaskinfos() {
|
||||
WHERE id='$1';
|
||||
' >&3
|
||||
read -u4 line
|
||||
taskid=${line%%|*}
|
||||
rest="${line#*|}|"
|
||||
sourcefileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
required=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
cleanup=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfilename=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
taskid=${line%%::AtOM:SQL:Sep::*}
|
||||
rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::"
|
||||
sourcefileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
required=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cleanup=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destfileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destfilename=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
}
|
||||
|
||||
@ -69,78 +69,78 @@ master() {
|
||||
else
|
||||
(( ++active ))
|
||||
read -u4 line
|
||||
taskid=${line%%|*}
|
||||
rest="${line#*|}|"
|
||||
sourcefileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
required=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
cmd_arg=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cmd_arg+=("${rest%%|*}")
|
||||
rest=${rest#*|}
|
||||
cleanup=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfileid=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
destfilename=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
taskid=${line%%::AtOM:SQL:Sep::*}
|
||||
rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::"
|
||||
sourcefileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
required=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}")
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
cleanup=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destfileid=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
destfilename=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
for key in ${!cmd_arg[@]}
|
||||
do
|
||||
[ -z "${cmd_arg[key]}" ] && unset cmd_arg[key]
|
||||
|
||||
@ -112,8 +112,8 @@ getdstfiles() {
|
||||
done
|
||||
for line in "${lines[@]}"
|
||||
do
|
||||
fileid=${line%|*}
|
||||
filename=${line#*|}
|
||||
fileid=${line%::AtOM:SQL:Sep::*}
|
||||
filename=${line#*::AtOM:SQL:Sep::}
|
||||
echo $'\t'"$filename"
|
||||
(( rename )) && echo -n $'\t'
|
||||
(( rename )) && renameFile
|
||||
@ -149,12 +149,12 @@ do
|
||||
done
|
||||
for line in "${lines[@]}"
|
||||
do
|
||||
fileid=${line%%|*}
|
||||
rest="${line#*|}|"
|
||||
filename=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
mimetype=${rest%%|*}
|
||||
rest=${rest#*|}
|
||||
fileid=${line%%::AtOM:SQL:Sep::*}
|
||||
rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::"
|
||||
filename=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
mimetype=${rest%%::AtOM:SQL:Sep::*}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
dest=$sourcepath
|
||||
case "$mimetype" in
|
||||
'audio/mpeg')
|
||||
|
||||
@ -61,7 +61,7 @@ checkwanted() {
|
||||
for destination in "${!destinationpath[@]}"
|
||||
do
|
||||
echo -ne "\rScanning destination $destination... \033[K"
|
||||
while read filename
|
||||
while read -r filename
|
||||
do
|
||||
if ! Select destination_files id \
|
||||
>/dev/null \
|
||||
|
||||
@ -93,16 +93,17 @@ if (( update ))
|
||||
then
|
||||
getFiles
|
||||
updateMimes
|
||||
updateTags
|
||||
fi
|
||||
|
||||
for check in ${!checks[@]}
|
||||
do
|
||||
case $check in
|
||||
tracktotal)
|
||||
whereclause+="${whereclause+ OR }NOT tags.track LIKE \"%/%\""
|
||||
whereclause+="${whereclause+OR }NOT tags.track LIKE \"%/%\""
|
||||
;;
|
||||
*)
|
||||
whereclause+="${whereclause+ OR }tags.$check IS NULL"
|
||||
whereclause+="${whereclause+OR }tags.$check IS NULL"
|
||||
;;
|
||||
esac
|
||||
whereclause+='
|
||||
@ -124,8 +125,15 @@ cat >&3 <<-EOSelect
|
||||
FROM tags
|
||||
INNER JOIN source_files
|
||||
ON tags.source_file=source_files.id
|
||||
WHERE $whereclause
|
||||
AND NOT tags.tagreader LIKE "unknown-%";
|
||||
INNER JOIN mime_types
|
||||
ON source_files.mime_type=mime_types.id
|
||||
WHERE (
|
||||
$whereclause
|
||||
)
|
||||
AND NOT tags.tagreader LIKE "unknown-%"
|
||||
AND NOT mime_types.mime_text LIKE "text/%"
|
||||
AND NOT mime_types.mime_text LIKE "image/%"
|
||||
;
|
||||
|
||||
SELECT "AtOM:NoMoreFiles";
|
||||
EOSelect
|
||||
@ -140,33 +148,33 @@ done
|
||||
for line in "${lines[@]}"
|
||||
do
|
||||
missing=()
|
||||
filename=${line%%|*}
|
||||
rest="${line#*|}|"
|
||||
(( ${checks[genre]} )) && [ -z "${rest%%|*}" ] && missing+=( "Genre" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[albumartist]} )) && [ -z "${rest%%|*}" ] && missing+=( "AlbumArtist" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[year]} )) && [ -z "${rest%%|*}" ] && missing+=( "Year" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[album]} )) && [ -z "${rest%%|*}" ] && missing+=( "Album" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[disc]} )) && [ -z "${rest%%|*}" ] && missing+=( "Disc" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[artist]} )) && [ -z "${rest%%|*}" ] && missing+=( "Artist" )
|
||||
rest=${rest#*|}
|
||||
track=${rest%%|*}
|
||||
filename=${line%%::AtOM:SQL:Sep::*}
|
||||
rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::"
|
||||
(( ${checks[genre]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Genre" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[albumartist]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "AlbumArtist" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[year]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Year" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[album]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Album" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[disc]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Disc" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[artist]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Artist" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
track=${rest%%::AtOM:SQL:Sep::*}
|
||||
(( ${checks[track]} )) && [ -z "$track" ] && missing+=( "Track" )
|
||||
if (( ${checks[tracktotal]} )) && ! [[ $track =~ / ]]
|
||||
then
|
||||
missing+=( TrackTotal )
|
||||
fi
|
||||
rest=${rest#*|}
|
||||
(( ${checks[title]} )) && [ -z "${rest%%|*}" ] && missing+=( "Title" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[composer]} )) && [ -z "${rest%%|*}" ] && missing+=( "Composer" )
|
||||
rest=${rest#*|}
|
||||
(( ${checks[performer]} )) && [ -z "${rest%%|*}" ] && missing+=( "Performer" )
|
||||
rest=${rest#*|}
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[title]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Title" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[composer]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Composer" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
(( ${checks[performer]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Performer" )
|
||||
rest=${rest#*::AtOM:SQL:Sep::}
|
||||
echo "$filename: ${missing[@]}"
|
||||
done
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user