aboutsummaryrefslogtreecommitdiff
path: root/blog/flac-to-opus/index.org
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-03-04 22:34:28 -0600
committerChristian Cleberg <hello@cleberg.net>2024-03-04 22:34:28 -0600
commit797a1404213173791a5f4126a77ad383ceb00064 (patch)
treefcbb56dc023c1e490df70478e696041c566e58b4 /blog/flac-to-opus/index.org
parent3db79e7bb6a34ee94935c22d7f0e18cf227c7813 (diff)
downloadcleberg.net-797a1404213173791a5f4126a77ad383ceb00064.tar.gz
cleberg.net-797a1404213173791a5f4126a77ad383ceb00064.tar.bz2
cleberg.net-797a1404213173791a5f4126a77ad383ceb00064.zip
initial migration to test org-mode
Diffstat (limited to 'blog/flac-to-opus/index.org')
-rw-r--r--blog/flac-to-opus/index.org169
1 files changed, 169 insertions, 0 deletions
diff --git a/blog/flac-to-opus/index.org b/blog/flac-to-opus/index.org
new file mode 100644
index 0000000..adb7763
--- /dev/null
+++ b/blog/flac-to-opus/index.org
@@ -0,0 +1,169 @@
+#+title: Recursive Command-Line FLAC to Opus Conversion
+#+date: 2022-07-30
+#+description: Learn how to convert all FLAC files to Opus, including recursive files in subdirectories.
+#+filetags: :linux:
+
+* Converting FLAC to OPUS
+I am currently rebuilding my music library from scratch so that I can
+effectively archive all the music I own in the
+[[https://en.wikipedia.org/wiki/FLAC][FLAC file format]], a lossless
+audio codec.
+
+However, streaming FLAC files outside the home can be difficult due to
+the size of the files, especially if you're using a weak connection.
+
+So, in order to archive the music in a lossless format and still be able
+to stream it easily, I opted to create a copy of my FLAC files in the
+[[https://en.wikipedia.org/wiki/Opus_(audio_format)][Opus audio codec]].
+This allows me to archive a quality, lossless version of the music and
+then point my streaming service to the smaller, stream-ready version.
+
+** Dependencies
+The process I follow utilizes the =opus-tools= package in Ubuntu. Before
+proceeding, install the package:
+
+#+begin_src sh
+sudo apt install opus-tools
+#+end_src
+
+If you want to use a different conversion method, such as =ffmpeg= or
+=avconv=, simply install that package instead.
+
+** Conversion Process
+The script I'm using is stored in my home directory, but feel free to
+create it wherever you want. It does not need to be in the same
+directory as your music files.
+
+#+begin_src sh
+cd ~ && nano transform.sh
+#+end_src
+
+Once you have your new bash script opened in an editor, go ahead and
+paste the following logic into the script.
+
+You *MUST* edit the following variables in order for it to work:
+
+- =source=: The source directory where your FLAC files are stored.
+- =dest=: The destination directory where you want the resulting Opus
+ files to be stored.
+
+You *MAY* want to edit the following variables to suit your needs:
+
+- =filename=: If you are converting to a file format other than Opus,
+ you'll need to edit this so that your resulting files have the correct
+ filename extension.
+- =reldir=: This variable can be edited to strip out more leading
+ directories in the file path. As you'll see later, I ignore this for
+ now and simply clean it up afterward.
+- =opusenc=: This is the actual conversion process. You may want to edit
+ the bitrate to suit your needs. I set mine at 128 but some prefer 160
+ or higher.
+
+#+begin_src sh
+#!/bin/bash
+## - The IFS takes care of spaces in file and dirnames
+## - your folders may vary
+## - what you mount to the folders does not matter
+## - in RELDIR, the f5 most likely MUST be edited,
+## since its responsible, how many leading directories
+## will be removed from the directory structure in order
+## to append that exact path to the outfile
+## - the commented echos are still in place in order to give
+## you the variables for testing, before running.
+
+IFS=$'\n'
+
+## the paths given here contain the directory structure that I want to keep
+## source=/mnt/music/archives/ARTIST/ALBUM/FLACFILE.flac
+## local=/mnt/music/library/ARTIST/ALBUM/OPUSFILE.opus
+
+source=/mnt/music/archives
+dest=/mnt/music/library
+
+for i in $(find $source -type f -iname '*.flac' );
+do
+## SET VARIABLES for PATHS and FILENAMES
+ fullfile=$i
+ filename="${i##*/}"
+ filename="${filename%.*}.opus"
+ fulldir=$(dirname "${i}")
+ reldir="$(echo $fulldir | cut -d'/' -f5-)"
+ reldir=${reldir//flac}
+ outdir="$dest/$reldir"
+ outfile="$outdir/$filename"
+
+# is that working?
+# outfile='$local/""$(echo $(dirname "${i}") | cut -d'/' -f5-)"//flac"/"${i##*/}"'
+# echo 'output file: ' "$outfile"
+
+## SHOW ME THE CONTENTS of the VARIABLES
+# echo 'File found:' "$i"
+# echo 'Relative dir: ' "$reldir"
+# echo 'directory will be created: ' "$outdir"
+# echo 'Filename: ' "$filename"
+# echo 'FileExt: ' "$extension"
+# echo 'output file: ' "$outfile"
+
+echo "\n\n"
+
+## CREATE Output Folders
+ mkdir -p "$outdir"
+
+## RUN
+# ffmpeg and avconv are alternative options if opusenc isn't adequate
+opusenc --vbr --bitrate 128 --date "$DATE" \
+--title "$TITLE" --artist "$ARTIST" --album "$ALBUM" --genre "$GENRE" \
+--comment "ALBUMARTIST=$ALBUMARTIST" --comment "DISCNUMBER=$DISCNUMBER" \
+--comment "TRACKNUMBER=$TRACKNUMBER" --comment "TRACKTOTAL=$TRACKTOTAL" \
+--comment "LYRICS=$LYRICS" "$fullfile" "$outfile"
+
+
+## just for testing
+# sleep 1
+done
+#+end_src
+
+Once you're done, simply save the file and exit your editor. Don't
+forget to enable execution of the script:
+
+#+begin_src sh
+chmod +x transform.sh
+#+end_src
+
+Finally, you may now run the script:
+
+#+begin_src sh
+./transform.sh
+#+end_src
+
+If you used =opusenc=, you'll see the conversions happen within the
+terminal as it progresses. You will also see variables printed if you
+uncommented any of the bash script's comments.
+
+** Cleanup
+As I noted above, I didn't customize my =reldir= variable in the script,
+which caused my output directory to be =/mnt/music/library/archives=
+instead of =/mnt/music/library=. So, I moved the output up one level and
+deleted the accidental directory.
+
+#+begin_src sh
+cd /mnt/music/library
+mv archives/** .
+rm -rf archives
+#+end_src
+
+** Check the Resulting Size
+If you want to see what kind of file size savings you've gained, you can
+always use the =du= command to check:
+
+#+begin_src sh
+cd /mnt/music
+du -h --max-depth=1 .
+#+end_src
+
+In my case, my small library went from 78GB to 6.3GB!
+
+#+begin_src txt
+78G ./archives
+6.3G ./library
+#+end_src