From 979280c3302d4548b1e1d0fd53320e3d6088c27e Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Mon, 10 Feb 2025 00:52:00 +0000 Subject: [PATCH] Resolve "FEAT: support for releasecountry tag" Resolve "Opus (and maybe vorbis?) tags aren't actually read!" --- doc/example.cfg | 2 +- lib/database/checkVersion | 2 +- lib/database/upgradedatabase_3_4 | 9 +++++++++ lib/encode/mp3 | 2 ++ lib/encode/opus | 2 ++ lib/encode/vorbis | 2 ++ lib/files/getDestDir | 8 ++++++++ lib/files/getDestFile | 5 +++++ lib/tags/ffmpeg | 12 +++++++++++- lib/tags/flac | 28 +++++++++++++++------------- lib/tags/gettags | 6 +++++- lib/tags/opus | 5 ++++- lib/tags/soxi | 3 ++- lib/tags/tryAPE | 6 ------ lib/tags/update | 7 +++++++ share/schema.sql | 1 + toys/createindex | 24 +++++++++++++++++++----- 17 files changed, 94 insertions(+), 30 deletions(-) create mode 100644 lib/database/upgradedatabase_3_4 delete mode 100644 lib/tags/tryAPE diff --git a/doc/example.cfg b/doc/example.cfg index 19b2b14..71bea61 100644 --- a/doc/example.cfg +++ b/doc/example.cfg @@ -45,7 +45,7 @@ higher-than 128 # rename file, path unchanged rename %{track}--%{artist}-%{title} # change the whole filepath -#rename %{genre}/%{albumartist}/%{year}-%{album}/%{track}--%{artist}-%{title} +#rename %{genre}/%{albumartist}/%{year}-%{album}-%{releasecountry}/%{track}--%{artist}-%{title} skip_mime-type image/* skip_mime-type text/* diff --git a/lib/database/checkVersion b/lib/database/checkVersion index dcef357..c9c27ee 100644 --- a/lib/database/checkVersion +++ b/lib/database/checkVersion @@ -1,5 +1,5 @@ #!/bin/bash -currentdbversion=3 +currentdbversion=4 checkDatabaseVersion() { local dbversion if dbversion=$(Select atom version <<<"\"1\" = 1") diff --git a/lib/database/upgradedatabase_3_4 b/lib/database/upgradedatabase_3_4 new file mode 100644 index 0000000..d236a3c --- /dev/null +++ b/lib/database/upgradedatabase_3_4 @@ -0,0 +1,9 @@ +#!/bin/bash + +upgradedatabase_3_4() { + echo "Upgrading database to version 4... (backup is $database.bak_v3)" + cp "$database" "$database.bak_v3" + echo 'ALTER TABLE tags ADD COLUMN releasecountry TEXT;' >&3 + + Update atom version 4 <<<"1 = 1" +} \ No newline at end of file diff --git a/lib/encode/mp3 b/lib/encode/mp3 index 4bb1845..3a2556f 100644 --- a/lib/encode/mp3 +++ b/lib/encode/mp3 @@ -11,6 +11,8 @@ encodeFile::mp3() { [ -n "$albumartist" ] && lameopts+=(--tv TPE2="$albumartist") [ -n "$composer" ] && lameopts+=(--tv TCOM="$composer") [ -n "$performer" ] && lameopts+=(--tv TOPE="$performer") + [ -n "$releasecountry" ] \ + && lameopts+=(--tv TXXX="MusicBrainz Album Release Country=$releasecountry") [ -n "$disc" ] && lameopts+=(--tv TPOS="$disc") if (( ${destinationnoresample[$destination]:-0} == 1 )) then diff --git a/lib/encode/opus b/lib/encode/opus index 06f2df8..ce78f84 100644 --- a/lib/encode/opus +++ b/lib/encode/opus @@ -11,6 +11,8 @@ encodeFile::opus() { [ -n "$disc" ] && opusencopts+=(--comment "DISCNUMBER=$disc") [ -n "$genre" ] && opusencopts+=(--comment "GENRE=$genre") [ -n "$performer" ] && opusencopts+=(--comment "PERFORMER=$performer") + [ -n "$releasecountry" ] \ + && opusencopts+=(--comment "RELEASECOUNTRY=$releasecountry") [ -n "$title" ] && opusencopts+=(--title "$title") [ -n "$track" ] && opusencopts+=(--comment "TRACKNUMBER=${track%/*}") [ -n "${track#*/}" ] && opusencopts+=(--comment "TRACKTOTAL=${track#*/}") diff --git a/lib/encode/vorbis b/lib/encode/vorbis index e99cc0d..e16b3da 100644 --- a/lib/encode/vorbis +++ b/lib/encode/vorbis @@ -8,6 +8,8 @@ encodeFile::vorbis() { [ -n "$disc" ] && oggencopts+=(-c "DISCNUMBER=$disc") [ -n "$genre" ] && oggencopts+=(-G "$genre") [ -n "$performer" ] && oggencopts+=(-c "PERFORMER=$performer") + [ -n "$releasecountry" ] \ + && oggencopts+=(--comment "RELEASECOUNTRY=$releasecountry") [ -n "$title" ] && oggencopts+=(-t "$title") [ -n "$track" ] && oggencopts+=(-N "$track") [ -n "$year" ] && oggencopts+=(-d "$year") diff --git a/lib/files/getDestDir b/lib/files/getDestDir index fd031b0..2bf0073 100644 --- a/lib/files/getDestDir +++ b/lib/files/getDestDir @@ -10,6 +10,10 @@ getDestDir() { [[ ${destinationrenamepath[$destination]} == \ *?([^[])%\{albumartist\}?([^\]])* ]] \ && [ -n "$albumartist" ] + ) || ( + [[ ${destinationrenamepath[$destination]} == \ + *?([^[])%\{releasecountry\}?([^\]])* ]] \ + && [ -n "$releasecountry" ] ) || ( [[ ${destinationrenamepath[$destination]} == \ *?([^[])%\{artist\}?([^\]])* ]] \ @@ -44,6 +48,8 @@ getDestDir() { read -r -u${toascii[0]} album echo "$albumartist" >&${toascii[1]} read -r -u${toascii[0]} albumartist + echo "$releasecountry" >&${toascii[1]} + read -r -u${toascii[0]} releasecountry echo "$artist" >&${toascii[1]} read -r -u${toascii[0]} artist echo "$genre" >&${toascii[1]} @@ -61,6 +67,8 @@ getDestDir() { destdir+="${destinationrenamepath[$destination]//?(\[)%\{album\}?(\])/$replace}" replace=$(sanitizeFile "$albumartist" dir) destdir="${destdir//?(\[)%\{albumartist\}?(\])/$replace}" + replace=$(sanitizeFile "$releasecountry" dir) + destdir="${destdir//?(\[)%\{releasecountry\}?(\])/$releasecountry}" replace=$(sanitizeFile "$artist" dir) destdir="${destdir//?(\[)%\{artist\}?(\])/$replace}" replace=$(sanitizeFile "$genre" dir) diff --git a/lib/files/getDestFile b/lib/files/getDestFile index aae78b8..03f4e53 100644 --- a/lib/files/getDestFile +++ b/lib/files/getDestFile @@ -10,6 +10,10 @@ getDestFile() { [[ ${destinationrename[$destination]} == \ *?([^[])%\{albumartist\}?([^\]])* ]] \ && [ -n "$albumartist" ] + ) || ( + [[ ${destinationrenamepath[$destination]} == \ + *?([^[])%\{releasecountry\}?([^\]])* ]] \ + && [ -n "$releasecountry" ] ) || ( [[ ${destinationrename[$destination]} == \ *?([^[])%\{artist\}?([^\]])* ]] \ @@ -39,6 +43,7 @@ getDestFile() { then destfile="${destinationrename[$destination]//?(\[)%\{album\}?(\])/$album}" destfile="${destfile//?(\[)%\{albumartist\}?(\])/$albumartist}" + destfile="${destfile//?(\[)%\{releasecountry\}?(\])/$releasecountry}" destfile="${destfile//?(\[)%\{artist\}?(\])/$artist}" destfile="${destfile//?(\[)%\{genre\}?(\])/$genre}" destfile="${destfile//?(\[)%\{title\}?(\])/$title}" diff --git a/lib/tags/ffmpeg b/lib/tags/ffmpeg index 0e75477..e8a37c3 100644 --- a/lib/tags/ffmpeg +++ b/lib/tags/ffmpeg @@ -1,5 +1,5 @@ #!/bin/bash -getInfosffmpeg_version='ffmpeg-6' +getInfosffmpeg_version='ffmpeg-7' tagreaders+=( "$getInfosffmpeg_version" ) getInfos::ffmpeg() { tagreader="$getInfosffmpeg_version" @@ -32,6 +32,8 @@ getInfos::ffmpeg() { disc=$(gettag disc) genre=$(gettag genre) performer=$(gettag TOPE) + releasecountry=$(gettag releasecountry) + [[ -z "$releasecountry" ]] && releasecountry=$(gettag "MusicBrainz Album Release Country") title=$(gettag title) tracknum=$(gettag track) year=$(gettag date) @@ -43,6 +45,14 @@ getInfos::ffmpeg() { infos="$fmt_infos" channels=$(gettag channels) rate=$(gettag 'sample_rate') + case $rate in + 96) rate=96000;; + 48) rate=48000;; + 441) rate=44100;; + 32) rate=32000;; + 24) rate=24000;; + 225) rate=22500;; + esac bitrate=$(gettag 'bit_rate') bitdepth=$(gettag 'sample_fmt') bitdepth=${bitdepth//[A-z]/} diff --git a/lib/tags/flac b/lib/tags/flac index 32a37be..1a41a4a 100644 --- a/lib/tags/flac +++ b/lib/tags/flac @@ -1,21 +1,22 @@ #!/bin/bash -getInfosFLAC_version='FLAC-3' +getInfosFLAC_version='FLAC-4' tagreaders+=( "$getInfosFLAC_version" ) getInfos::FLAC() { tagreader="$getInfosFLAC_version" infos=$( - metaflac \ - --show-tag=ALBUM \ - --show-tag=ALBUMARTIST \ - --show-tag=ARTIST \ - --show-tag=COMPOSER \ - --show-tag=DATE \ - --show-tag=DISCNUMBER \ - --show-tag=GENRE \ - --show-tag=PERFORMER \ - --show-tag=TITLE \ - --show-tag=TRACKNUMBER \ - --show-tag=TRACKTOTAL \ + metaflac \ + --show-tag=ALBUM \ + --show-tag=ALBUMARTIST \ + --show-tag=ARTIST \ + --show-tag=COMPOSER \ + --show-tag=DATE \ + --show-tag=DISCNUMBER \ + --show-tag=GENRE \ + --show-tag=PERFORMER \ + --show-tag=RELEASECOUNTRY \ + --show-tag=TITLE \ + --show-tag=TRACKNUMBER \ + --show-tag=TRACKTOTAL \ "$sourcepath/$filename" ) albumartist=$(gettag albumartist) @@ -25,6 +26,7 @@ getInfos::FLAC() { disc=$(gettag discnumber) genre=$(gettag genre) performer=$(gettag performer) + releasecountry=$(gettag releasecountry) title=$(gettag title) tracknum=$(gettag tracknumber) tracktotal=$(gettag tracktotal) diff --git a/lib/tags/gettags b/lib/tags/gettags index 8afae86..f541b7d 100644 --- a/lib/tags/gettags +++ b/lib/tags/gettags @@ -11,11 +11,15 @@ getTags() { type=Opus (( disableopusinfo )) && unset type ;; + 'audio/ogg opus') + type=Opus + (( disableopusinfo )) && unset type + ;; application/ogg*) type=soxi (( disablesoxi )) && unset type ;; - audio/ogg) + audio/ogg*) type=soxi (( disablesoxi )) && unset type ;; diff --git a/lib/tags/opus b/lib/tags/opus index bed6242..3f0e735 100644 --- a/lib/tags/opus +++ b/lib/tags/opus @@ -1,5 +1,5 @@ #!/bin/bash -getInfosOpus_version='Opus-2' +getInfosOpus_version='Opus-3' tagreaders+=( "$getInfosOpus_version" ) getInfos::Opus() { tagreader="$getInfosOpus_version" @@ -14,6 +14,7 @@ getInfos::Opus() { disc=$(gettag discnumber) genre=$(gettag genre) performer=$(gettag performer) + releasecountry=$(gettag releasecountry) title=$(gettag title) tracknum=$(gettag tracknumber) tracktotal=$(gettag tracktotal) @@ -24,7 +25,9 @@ getInfos::Opus() { year=$(gettag date) infos="${infos//: /=}" rate=$(gettag 'original sample rate'|head -n1) + rate=${rate% Hz} channels=$(gettag channels|head -n1) bitrate=$(gettag 'average bitrate') + bitrate=${bitrate%% kbit*} bitrate=${bitrate%%.*} } diff --git a/lib/tags/soxi b/lib/tags/soxi index ccd60fd..fa3aeb5 100644 --- a/lib/tags/soxi +++ b/lib/tags/soxi @@ -1,5 +1,5 @@ #!/bin/bash -getInfosSoxi_version='soxi-1' +getInfosSoxi_version='soxi-2' tagreaders+=( "$getInfosSoxi_version" ) getInfos::soxi() { tagreader="$getInfosSoxi_version" @@ -13,6 +13,7 @@ getInfos::soxi() { disc=$(gettag discnumber) genre=$(gettag genre) performer=$(gettag performer) + releasecountry=$(gettag releasecountry) title=$(gettag title) tracknum=$(gettag tracknumber) tracktotal=$(gettag tracktotal) diff --git a/lib/tags/tryAPE b/lib/tags/tryAPE deleted file mode 100644 index 53f963e..0000000 --- a/lib/tags/tryAPE +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -tryAPE() { - grep -q 'APETAGEX' \ - "$sourcepath/$filename" \ - && type=APE -} diff --git a/lib/tags/update b/lib/tags/update index dad68c4..789c5a8 100644 --- a/lib/tags/update +++ b/lib/tags/update @@ -18,6 +18,7 @@ updateTags() { tags.disc, tags.genre, tags.performer, + tags.releasecountry, tags.title, tags.track, tags.year, @@ -81,6 +82,8 @@ echo ' rest=${rest#*::AtOM:SQL:Sep::} oldperformer=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} + oldreleasecountry=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} oldtitle=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} oldtrack=${rest%%::AtOM:SQL:Sep::*} @@ -110,6 +113,7 @@ echo ' [[ $olddisc != "$disc" ]]&& udi=1 [[ $oldgenre != "$genre" ]]&& uge=1 [[ $oldperformer != "$performer" ]]&& upe=1 + [[ $oldreleasecountry != "$releasecountry" ]]&& urc=1 [[ $oldtitle != "$title" ]]&& uti=1 [[ $oldtrack != "$tracknum" ]]&& utr=1 [[ $oldyear != "$year" ]]&& uye=1 @@ -125,6 +129,7 @@ echo ' ${udi:+disc "${disc:-NULL}"} \ ${uge:+genre "${genre:-NULL}"} \ ${upe:+performer "${performer:+::AtOM:FT::}${performer:-NULL}"}\ + ${urc:+releasecountry "${releasecountry:+::AtOM:FT::}${releasecountry:-NULL}"}\ ${uti:+title "${title:+::AtOM:FT::}${title:-NULL}"}\ ${utr:+track "${track:+::AtOM:FT::}${tracknum:-NULL}"}\ ${uye:+year "${year:-NULL}"} \ @@ -144,6 +149,7 @@ echo ' title \ composer \ performer \ + releasecountry \ rate \ bitdepth \ bitrate \ @@ -156,6 +162,7 @@ echo ' udi \ uge \ upe \ + urc \ uti \ utr \ uye \ diff --git a/share/schema.sql b/share/schema.sql index 62fa9d1..3cc1580 100644 --- a/share/schema.sql +++ b/share/schema.sql @@ -58,6 +58,7 @@ CREATE TABLE IF NOT EXISTS tags ( title TEXT, composer TEXT, performer TEXT, + releasecountry TEXT, depth INTEGER, rate INTEGER, channels INTEGER, diff --git a/toys/createindex b/toys/createindex index b69d8c6..3f9a3d5 100755 --- a/toys/createindex +++ b/toys/createindex @@ -73,6 +73,7 @@ do '-M') show+=(types) ;; '-N') show+=(tracktotals) ;; '-p') show+=(performers) ;; + '-r') show+=(releasecountries) ;; '-s') show+=(rates) ;; '-S') show+=(size) length[count]=5 ;; @@ -121,6 +122,7 @@ done -d Disc -g Genre -p Performer + -r Release Country -N Track total -t Title -y Year @@ -280,8 +282,8 @@ fi cat <<-EOBrag # Generated by AtOM's createindex toy. - # https://gitorious.org/atom - # (C) 2012-2013 Vincent Riquer (GPL-3) + # https://framagit.org/atom/AtOM/ + # (C) 2012-2025 Vincent Riquer (GPL-3) # # $0 $args # @@ -312,6 +314,7 @@ do oldtimestamp) info='Last modified' ;; types) info='Format' ;; performers) info='Performer' ;; + releasecountries) info='Country' ;; rates) info='Sample rate' ;; titles) info='Title' ;; tracktotals) info='Track total' ;; @@ -345,6 +348,7 @@ SELECT tags.disc, tags.genre, tags.performer, + tags.releasecountry, tags.title, tags.track, tags.year, @@ -403,6 +407,8 @@ do rest="${rest#*::AtOM:SQL:Sep::}" performer="${rest%%::AtOM:SQL:Sep::*}" rest="${rest#*::AtOM:SQL:Sep::}" + releasecountry="${rest%%::AtOM:SQL:Sep::*}" + rest="${rest#*::AtOM:SQL:Sep::}" title="${rest%%::AtOM:SQL:Sep::*}" rest="${rest#*::AtOM:SQL:Sep::}" track="${rest%%::AtOM:SQL:Sep::*}" @@ -530,6 +536,13 @@ do [ -n "$performer" ] \ && performers+="${performers+,}$performer" fi + if ! [[ $releasecountries =~ $expr1"$releasecountry"$expr2 ]] + then + [ -z "$releasecountries" ] \ + && unset releasecountries + [ -n "$releasecountry" ] \ + && releasecountries+="${releasecountries+,}$releasecountry" + fi if ! [[ $titles =~ $expr1"$title"$expr2 ]] then [ -z "$titles" ] \ @@ -556,10 +569,10 @@ do then printline fi - unset bitrates + unset bitrates depths rates channelss="$channels" - rates="$rate" - depths="$depth" + (( rate )) && rates="$rate" + (( depth )) && depths="$depth" types="$type" albumartists="$albumartist" albums="$album" @@ -568,6 +581,7 @@ do discs="$disc" genres="$genre" performers="$performer" + releasecountries="$releasecountry" titles="$title" tracktotals="$tracktotal" years="$year"