Various scripts that I maintain

Add Lyric Fetcher script

Signed-off-by: Shiloh Fen <shiloh@shilohfen.com>

Changed files
+101
nushell
+11
README.md
··· 13 13 14 14 ## Nushell 15 15 16 + ## LyricFetch 17 + 18 + Fetches lyrics from Genius and adds them to your music library's metadata. 19 + 20 + Currently only supports FLAC files. In the future, timesynced lyrics may be 21 + supported, and auto-fetching may be more reliable. 22 + 23 + I don't recommend using this right now. It's pretty bad at searching, and most 24 + of the time can't auto-fetch the lyrics anyway. Personally, I just fetch the lyrics 25 + manually and save them using Recordbox. 26 + 16 27 ### ADB Auto Connect 17 28 Automatically find and connect to an Android device with Wireless Debugging over the local network. 18 29
+90
nushell/lyricfetch.nu
··· 1 + #!/usr/bin/nu 2 + 3 + def main [ 4 + --noconfirm (-y) 5 + ] { 6 + const library = "~/Music" | path expand 7 + print $"Library path set to (ansi blue)($library)(ansi reset)" 8 + 9 + if (which metaflac | is-empty) { 10 + error make { 11 + msg: "Could not find metaflac." 12 + help: "Install the FLAC utils." 13 + } 14 + } 15 + if (which fd | is-empty) { 16 + error make { 17 + msg: "Could not find fd" 18 + help: "Install fd-find." 19 + } 20 + } 21 + 22 + print "Indexing Library..." 23 + let tracks = fd -g '*.flac' $library | lines 24 + print $"Found (ansi green)($tracks | length)(ansi reset) supported tracks in this library." 25 + 26 + for track in $tracks { 27 + let meta = metaflac $track --show-all-tags 28 + | parse "{key}={value}" 29 + | reduce --fold {} {|it, acc| $acc | upsert ($it.key | str downcase) $it.value} 30 + 31 + if ($meta.artist? == null) or ($meta.title? == null) { 32 + print $"(ansi red)($track)(ansi yellow) doesn't contain artist and title tags, cannot search for lyrics. Skipping.(ansi reset)" 33 + continue 34 + } 35 + 36 + print $"\n<- (ansi blue)($meta.title)(ansi reset) by (ansi purple)($meta.artist)(ansi reset) ->" 37 + 38 + if ($meta.lyrics? | is-not-empty) { 39 + print $"(ansi green)Track already contains lyrics. Skipping.(ansi reset)" 40 + continue 41 + } else if ($meta.unsyncedlyrics? | is-not-empty) { 42 + print -n $"Track already contains unsynced lyrics. Would you like to copy them to the lyrics tag? [Y/n]: " 43 + match (input) { 44 + "n" | "N" => (print "Not copying unsynced lyrics, continuing.") 45 + _ => { 46 + print "Copying unsynced lyrics to lyrics tag..." 47 + metaflac $track --set-tag $"LYRICS=($meta.unsyncedlyrics)" 48 + continue 49 + } 50 + } 51 + } 52 + 53 + print $"Fetching lyrics..." 54 + let info = try { 55 + http get $"https://lyrics.astrid.sh/api/search?q=($meta.artist) ($meta.title)" 56 + } catch { 57 + print $"(ansi yellow)Could not find lyrics, skipping.(ansi reset)" 58 + continue 59 + } 60 + 61 + let lyrics = if ($info.lyrics | is-empty) { 62 + print $"(ansi yellow)Could not automatically fetch lyrics.(ansi reset)" 63 + print -n $"Please manually fetch the lyrics from (ansi default_dimmed)($info.url | ansi link)(ansi reset), then paste them here \(enter to skip\):" 64 + let input = input 65 + if ($input | is-empty) { 66 + print $"(ansi yellow)Manually skipped.(ansi reset)" 67 + continue 68 + } else { 69 + $input 70 + } 71 + } else { 72 + print "Successfully fetched lyrics." 73 + $info.lyrics 74 + } 75 + 76 + print $"(ansi green_dimmed)<========>(ansi reset)\n(ansi green)($lyrics)(ansi reset)\n(ansi green_dimmed)<========>(ansi reset)" 77 + print -n $"\nAre the above lyrics correct? [Y/n]: " 78 + match (input) { 79 + "n" | "N" => { 80 + print $"(ansi yellow)Manually skipped.(ansi reset)" 81 + continue 82 + } 83 + _ => { 84 + print "Writing lyrics to track metadata..." 85 + metaflac $track --set-tag $"LYRICS=($lyrics)" 86 + } 87 + } 88 + } 89 + } 90 +