mirror of
https://github.com/linuxserver/docker-mods.git
synced 2026-03-23 00:05:28 +08:00
Lidarr: flac2mp3 release 1.3
- Added advanced -a and -e options - Can now convert to any ffmpeg supported format - Added included script for Opus format
This commit is contained in:
parent
9254a11694
commit
8568b31bb1
40
README.md
40
README.md
@ -1,5 +1,6 @@
|
||||
# About
|
||||
A [Docker Mod](https://github.com/linuxserver/docker-mods) for the LinuxServer.io Lidarr Docker container that uses ffmpeg and a script to automatically convert downloaded FLAC files to MP3s. Default output quality is 320Kbps constant bit rate.
|
||||
Advanced options act as a light wrapper to ffmpeg, allowing conversion to any supported audio format, including AAC, AC3, and Opus.
|
||||
|
||||
>**NOTE:** This mod supports Linux OSes only.
|
||||
|
||||
@ -59,22 +60,42 @@ If you've configured Lidarr's **Recycle Bin** path correctly, the original audio
|
||||
>**Note:** The **Arguments** field for Custom Scripts was removed in Lidarr release [v0.7.0.1347](https://github.com/lidarr/Lidarr/commit/b9d240924f8965ebb2c5e307e36b810ae076101e "Lidarr commit notes") due to security concerns.
|
||||
To support options with this version and later, a wrapper script can be manually created that will call *flac2mp3.sh* with the required arguments.
|
||||
|
||||
The script accepts three command line options:
|
||||
The script accepts five command line options:
|
||||
|
||||
`[-d] [-b <bitrate> | -v <quality>]`
|
||||
`[-d] [-b <bitrate> | -v <quality> | -a "<options>" -e <extension>]`
|
||||
|
||||
The `-b bitrate` option sets the output quality in constant bits per second (CBR).
|
||||
|
||||
The `-b bitrate` option sets the output quality in constant bits per second (CBR).
|
||||
The `-v quality` option sets the output quality using a variable bit rate (VBR) where `quality` is a value between 0 and 9, with 0 being the highest quality.
|
||||
See the [FFmpeg MP3 Encoding Guide](https://trac.ffmpeg.org/wiki/Encode/MP3) for more details.
|
||||
If neither `-b` nor `-v` options are specified, the script will default to constant 320Kbps.
|
||||
|
||||
The `-a "options"` setting is used in conjunction with `-e` to set advanced ffmpeg options. The specified command line options replace all script defaults and are sent directly to ffmpeg. The `options` value must be enclosed in quotes.
|
||||
![danger] **WARNING:** When using `-a`, you must specify an audio codec (via `-c:a`) or the resulting file will contain no audio.
|
||||
![danger] **WARNING:** Invalid `options` could result in script failure!
|
||||
See [FFmpeg Options](https://ffmpeg.org/ffmpeg.html#Options) for details on valid options.
|
||||
See [Guidelines for high quality audio encoding](https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio) for more information.
|
||||
|
||||
The `-e extension` option sets the output file extension, and must be used in conjunction with `-a`. The `extension` may be prefixed by a dot (".") or not.
|
||||
|
||||
If neither `-b`, `-v`, `-a`, or `-e` options are specified, the script will default to a constant 320Kbps MP3.
|
||||
|
||||
The `-d` option enables debug logging.
|
||||
|
||||
#### Technical notes on `-a` advanced options
|
||||
The `-a` option effectively makes the script a somewhat generic wrapper for ffmpeg. FFmpeg is executed once per track with only the loglevel, input filename, and output filename being set. All other options are passed unparsed to the command line.
|
||||
|
||||
The exact format of the executed ffmpeg command is:
|
||||
```
|
||||
ffmpeg -loglevel error -i "Original.flac" ${Options} "NewTrack${Extension}"
|
||||
```
|
||||
|
||||
### Examples
|
||||
```
|
||||
-b 320k # Output 320 kbit/s MP3 (non VBR; same as default behavior)
|
||||
-v 0 # Output variable bitrate, VBR 220-260 kbit/s
|
||||
-d -b 160k # Enable debugging, and output 160 kbit/s MP3
|
||||
-v 0 # Output variable bitrate MP3, VBR 220-260 kbit/s
|
||||
-d -b 160k # Enable debugging, and output a 160 kbit/s MP3
|
||||
-a "-vn -c:a libopus -b:a 192K" -e .opus # Convert to Opus format, VBR 192 kbit/s, no cover art
|
||||
-a "-y -map 0 -c:a aac -b:a 240K -c:v copy" -e mp4 # Convert to MP4 format, using AAC 240 kbit/s audio, cover art, overwrite file
|
||||
```
|
||||
|
||||
### Included Wrapper Scripts
|
||||
@ -83,11 +104,12 @@ You may use any of these scripts in place of the `flac2mp3.sh` mentioned in the
|
||||
|
||||
```
|
||||
flac2mp3-debug.sh # Enable debugging
|
||||
flac2mp3-vbr.sh # Use variable bit rate, quality 0
|
||||
flac2mp3-vbr.sh # Use variable bit rate MP3, quality 0
|
||||
flac2opus.sh # Convert to Opus format using .opus extension
|
||||
```
|
||||
|
||||
### Example Wrapper Script
|
||||
To configure the last entry from the [Examples](./README.md#examples) section above, create and save a file called `flac2mp3-custom.sh` to `/config` containing the following text:
|
||||
To configure the middle entry from the [Examples](./README.md#examples) section above, create and save a file called `flac2mp3-custom.sh` to `/config` containing the following text:
|
||||
```shell
|
||||
#!/bin/bash
|
||||
|
||||
@ -121,7 +143,7 @@ This would not be possible without the following:
|
||||
[Lidarr](https://lidarr.audio/ "Lidarr homepage")
|
||||
[LinuxServer.io Lidarr](https://hub.docker.com/r/linuxserver/lidarr "Lidarr Docker container") container
|
||||
[LinuxServer.io Docker Mods](https://hub.docker.com/r/linuxserver/mods "Docker Mods containers") project
|
||||
[ffmpeg](https://ffmpeg.org/ "FFMpeg homepage")
|
||||
[ffmpeg](https://ffmpeg.org/ "FFmpeg homepage")
|
||||
Icons made by [Freepik](https://www.freepik.com) from [Flaticon](https://www.flaticon.com/)
|
||||
|
||||
[warning]: .assets/warning.png "Warning"
|
||||
|
||||
@ -38,11 +38,12 @@ fi
|
||||
# Change ownership
|
||||
if [ $(stat -c '%G' /usr/local/bin/flac2mp3.sh) != "abc" ]; then
|
||||
echo "Changing ownership on scripts."
|
||||
chown abc:abc /usr/local/bin/flac2mp3*.sh
|
||||
chown abc:abc /usr/local/bin/flac2*.sh
|
||||
fi
|
||||
|
||||
# Make executable
|
||||
if [ ! -x /usr/local/bin/flac2mp3.sh ]; then
|
||||
echo "Making scripts executable."
|
||||
chmod +x /usr/local/bin/flac2mp3*.sh
|
||||
chmod +x /usr/local/bin/flac2*.sh
|
||||
fi
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to convert FLAC files to MP3 using FFMpeg
|
||||
# Script to convert FLAC files to MP3 using FFmpeg
|
||||
# Dev/test: https://github.com/TheCaptain989/lidarr-flac2mp3
|
||||
# Prod: https://github.com/linuxserver/docker-mods/tree/lidarr-flac2mp3
|
||||
# Resultant MP3s are fully tagged and retain same permissions as original file
|
||||
@ -39,20 +39,32 @@ Audio conversion script designed for use with Lidarr
|
||||
Source: https://github.com/TheCaptain989/lidarr-flac2mp3
|
||||
|
||||
Usage:
|
||||
$0 [-d] [-b <bitrate> | -v <quality>]
|
||||
$0 [-d] [-b <bitrate> | -v <quality> | -a \"<options>\" -e <extension>]
|
||||
|
||||
Options:
|
||||
-d enable debug logging
|
||||
-b <bitrate> set output quality in constant bits per second [default: 320k]
|
||||
Ex: 160k, 240k, 300000
|
||||
-v <quality> set variable bitrate; quality between 0-9
|
||||
0 is highest quality, 9 is lowest
|
||||
See https://trac.ffmpeg.org/wiki/Encode/MP3 for more details
|
||||
-d enable debug logging
|
||||
-b <bitrate> set output quality in constant bits per second [default: 320k]
|
||||
Ex: 160k, 240k, 300000
|
||||
-v <quality> set variable bitrate; quality between 0-9
|
||||
0 is highest quality, 9 is lowest
|
||||
See https://trac.ffmpeg.org/wiki/Encode/MP3 for more details
|
||||
-a \"<options>\" advanced ffmpeg options enclosed in quotes
|
||||
Specified options replace all script defaults and are sent as
|
||||
entered to ffmpeg for processing.
|
||||
See https://ffmpeg.org/ffmpeg.html#Options for details on valid options.
|
||||
WARNING: You must specify an audio codec!
|
||||
WARNING: Invalid options could result in script failure!
|
||||
Requires -e option to also be specified
|
||||
See https://github.com/TheCaptain989/lidarr-flac2mp3 for more details
|
||||
-e <extension> file extension for output file, with or without dot
|
||||
Required when -a is specified!
|
||||
|
||||
Examples:
|
||||
$flac2mp3_script -b 320k # Output 320 kbit/s MP3 (non VBR; same as default behavior)
|
||||
$flac2mp3_script -v 0 # Output variable bitrate, VBR 220-260 kbit/s
|
||||
$flac2mp3_script -d -b 160k # Enable debugging and set output to 160 kbit/s
|
||||
$flac2mp3_script -b 320k # Output 320 kbit/s MP3 (non VBR; same as default behavior)
|
||||
$flac2mp3_script -v 0 # Output variable bitrate MP3, VBR 220-260 kbit/s
|
||||
$flac2mp3_script -d -b 160k # Enable debugging and set output a 160 kbit/s MP3
|
||||
$flac2mp3_script -a \"-vn -c:a libopus -b:a 192K\" -e .opus # Convert to Opus format, VBR 192 kbit/s, no cover art
|
||||
$flac2mp3_script -a \"-y -map 0 -c:a aac -b:a 240K -c:v copy\" -e mp4 # Convert to MP4 format, using AAC 240 kbit/s audio, cover art, overwrite file
|
||||
"
|
||||
echo "$usage" >&2
|
||||
}
|
||||
@ -122,7 +134,7 @@ function check_rescan {
|
||||
}
|
||||
|
||||
# Process options
|
||||
while getopts ":db:v:" opt; do
|
||||
while getopts ":db:v:a:e:" opt; do
|
||||
case ${opt} in
|
||||
d ) # For debug purposes only
|
||||
flac2mp3_message="Debug|Enabling debug logging."
|
||||
@ -138,6 +150,12 @@ while getopts ":db:v:" opt; do
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
elif [ -n "$flac2mp3_ffmpegadv" -o -n "$flac2mp3_extension" ]; then
|
||||
flac2mp3_message="Error|The -a and -e options cannot be set at the same time as either -v or -b options."
|
||||
echo "$flac2mp3_message" | log
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
else
|
||||
flac2mp3_bitrate="$OPTARG"
|
||||
fi
|
||||
@ -149,10 +167,40 @@ while getopts ":db:v:" opt; do
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
elif [ -n "$flac2mp3_ffmpegadv" -o -n "$flac2mp3_extension" ]; then
|
||||
flac2mp3_message="Error|The -a and -e options cannot be set at the same time as either -v or -b options."
|
||||
echo "$flac2mp3_message" | log
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
else
|
||||
flac2mp3_vbrquality="$OPTARG"
|
||||
fi
|
||||
;;
|
||||
a ) # Set advanced options
|
||||
if [ -n "$flac2mp3_vbrquality" -o -n "$flac2mp3_bitrate" ]; then
|
||||
flac2mp3_message="Error|The -a and -e options cannot be set at the same time as either -v or -b options."
|
||||
echo "$flac2mp3_message" | log
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
else
|
||||
flac2mp3_ffmpegadv="$OPTARG"
|
||||
fi
|
||||
;;
|
||||
e ) # Set file extension
|
||||
if [ -n "$flac2mp3_vbrquality" -o -n "$flac2mp3_bitrate" ]; then
|
||||
flac2mp3_message="Error|The -a and -e options cannot be set at the same time as either -v or -b options."
|
||||
echo "$flac2mp3_message" | log
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
else
|
||||
flac2mp3_extension="$OPTARG"
|
||||
fi
|
||||
# Test for dot
|
||||
[ "${flac2mp3_extension:0:1}" != "." ] && flac2mp3_extension=".${flac2mp3_extension}"
|
||||
;;
|
||||
: ) # No required argument specified
|
||||
flac2mp3_message="Error|Invalid option: -${OPTARG} requires an argument"
|
||||
echo "$flac2mp3_message" | log
|
||||
@ -169,10 +217,18 @@ while getopts ":db:v:" opt; do
|
||||
;;
|
||||
esac
|
||||
done
|
||||
# Test for either -a and -e, but not both: logical XOR = non-equality
|
||||
if [ "${flac2mp3_ffmpegadv:+data}" != "${flac2mp3_extension:+data}" ]; then
|
||||
flac2mp3_message="Error|The -a and -e options must be specified together."
|
||||
echo "$flac2mp3_message" | log
|
||||
echo "$flac2mp3_message" >&2
|
||||
usage
|
||||
exit 3
|
||||
fi
|
||||
shift $((OPTIND -1))
|
||||
|
||||
# Set default bit rate
|
||||
[ -z "$flac2mp3_vbrquality" ] && [ -z "$flac2mp3_bitrate" ] && flac2mp3_bitrate="320k"
|
||||
[ -z "$flac2mp3_vbrquality" -a -z "$flac2mp3_bitrate" -a -z "$flac2mp3_ffmpegadv" -a -z "$flac2mp3_extension" ] && flac2mp3_bitrate="320k"
|
||||
|
||||
# Check for config file
|
||||
if [ -f "$flac2mp3_config" ]; then
|
||||
@ -236,37 +292,54 @@ fi
|
||||
#find "$lidarr_artist_path" -name "*.flac" -exec bash -c 'ffmpeg -loglevel warning -i "{}" -y -acodec libmp3lame -b:a 320k "${0/.flac}.mp3" && rm "{}"' {} \;
|
||||
|
||||
#### MAIN
|
||||
echo "Info|Lidarr event: $lidarr_eventtype, Artist: $lidarr_artist_name ($lidarr_artist_id), Album: $lidarr_album_title ($lidarr_album_id), Export bitrate: ${flac2mp3_bitrate:-$flac2mp3_vbrquality}, Tracks: $flac2mp3_tracks" | log
|
||||
flac2mp3_message="Info|Lidarr event: ${lidarr_eventtype}, Artist: ${lidarr_artist_name} (${lidarr_artist_id}), Album: ${lidarr_album_title} (${lidarr_album_id}), "
|
||||
if [ -z "$flac2mp3_ffmpegadv" ]; then
|
||||
flac2mp3_message+="Export bitrate: ${flac2mp3_bitrate:-$flac2mp3_vbrquality}"
|
||||
else
|
||||
flac2mp3_message+="Advanced options: '${flac2mp3_ffmpegadv}', File extension: ${flac2mp3_extension}"
|
||||
fi
|
||||
flac2mp3_message+=", Tracks: ${flac2mp3_tracks}"
|
||||
|
||||
echo "${flac2mp3_message}" | log
|
||||
echo "$flac2mp3_tracks" | awk -v Debug=$flac2mp3_debug \
|
||||
-v Recycle="$flac2mp3_recyclebin" \
|
||||
-v Bitrate=$flac2mp3_bitrate \
|
||||
-v VBR=$flac2mp3_vbrquality '
|
||||
-v Bitrate="$flac2mp3_bitrate" \
|
||||
-v VBR="$flac2mp3_vbrquality" \
|
||||
-v FFmpegADV="$flac2mp3_ffmpegadv" \
|
||||
-v EXT="$flac2mp3_extension" '
|
||||
BEGIN {
|
||||
FFMpeg="/usr/bin/ffmpeg"
|
||||
FFmpeg="/usr/bin/ffmpeg"
|
||||
FS="|"
|
||||
RS="|"
|
||||
IGNORECASE=1
|
||||
if (EXT == "") EXT=".mp3"
|
||||
if (Bitrate) {
|
||||
if (Debug) print "Debug|Using constant bitrate of "Bitrate
|
||||
BrCommand="-b:a "Bitrate
|
||||
} else {
|
||||
} else if (VBR) {
|
||||
if (Debug) print "Debug|Using variable quality of "VBR
|
||||
BrCommand="-q:a "VBR
|
||||
} else if (FFmpegADV) {
|
||||
if (Debug) print "Debug|Using advanced ffmpeg options: \""FFmpegADV"\""
|
||||
if (Debug) print "Debug|Exporting with file extension "EXT
|
||||
}
|
||||
}
|
||||
/\.flac/ {
|
||||
# Get each FLAC file name and create a new MP3 name
|
||||
# Get each FLAC file name and create a new MP3 (or other) name
|
||||
Track=$1
|
||||
sub(/\n/,"",Track)
|
||||
NewTrack=substr(Track, 1, length(Track)-5)".mp3"
|
||||
NewTrack=substr(Track, 1, length(Track)-5) EXT
|
||||
print "Info|Writing: "NewTrack
|
||||
# Check for advanced options
|
||||
if (FFmpegADV) FFmpegOPTS=FFmpegADV
|
||||
else FFmpegOPTS="-c:v copy -map 0 -y -acodec libmp3lame "BrCommand" -write_id3v1 1 -id3v2_version 3"
|
||||
# Convert the track
|
||||
if (Debug) print "Debug|Executing: nice "FFMpeg" -loglevel error -i \""Track"\" -c:v copy -map 0 -y -acodec libmp3lame "BrCommand" -write_id3v1 1 -id3v2_version 3 \""NewTrack"\""
|
||||
Result=system("nice "FFMpeg" -loglevel error -i \""Track"\" -c:v copy -map 0 -y -acodec libmp3lame "BrCommand" -write_id3v1 1 -id3v2_version 3 \""NewTrack"\" 2>&1")
|
||||
if (Debug) print "Debug|Executing: nice "FFmpeg" -loglevel error -i \""Track"\" "FFmpegOPTS" \""NewTrack"\""
|
||||
Result=system("nice "FFmpeg" -loglevel error -i \""Track"\" "FFmpegOPTS" \""NewTrack"\" 2>&1")
|
||||
if (Result) {
|
||||
print "Error|Exit code "Result" converting \""Track"\""
|
||||
} else {
|
||||
if (Recycle=="") {
|
||||
if (Recycle == "") {
|
||||
# No Recycle Bin, so check for non-zero size new file and delete the old one
|
||||
if (Debug) print "Debug|Deleting: \""Track"\" and setting permissions on \""NewTrack"\""
|
||||
#Command="[ -s \""NewTrack"\" ] && [ -f \""Track"\" ] && chown --reference=\""Track"\" \""NewTrack"\" && chmod --reference=\""Track"\" \""NewTrack"\" && rm \""Track"\""
|
||||
|
||||
3
root/usr/local/bin/flac2opus.sh
Normal file
3
root/usr/local/bin/flac2opus.sh
Normal file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
. /usr/local/bin/flac2mp3.sh -a "-c:v libtheora -map 0 -q:v 10 -c:a libopus -b:a 192K" -e .opus
|
||||
Loading…
x
Reference in New Issue
Block a user