1
0
mirror of https://github.com/spl0k/supysonic.git synced 2024-09-18 18:31:04 +00:00

Support setting basic metadata in transcoded media

Other small fixes:
 - Fixed typo in README
 - Fixed `oggenc2` using `-q` instead of `-Q` to mean "quiet"

Fixes #170
This commit is contained in:
Carey Metcalfe 2019-11-11 15:04:25 -05:00
parent 2f94089e9c
commit 2f9fa0da6f
4 changed files with 41 additions and 12 deletions

View File

@ -19,7 +19,7 @@ _Supysonic_ currently targets the version 1.9.0 of the _Subsonic_ API. For more
details, go check the [API implementation status][docs-api].
[subsonic]: http://www.subsonic.org/
[transcoding]: docs/trancoding.md
[transcoding]: docs/transcoding.md
[lastfm]: https://last.fm/
[docs-api]: docs/api.md

View File

@ -64,7 +64,7 @@ decoder_mp3 = mpg123 --quiet -w - %srcpath
decoder_ogg = oggdec -o %srcpath
decoder_flac = flac -d -c -s %srcpath
encoder_mp3 = lame --quiet -b %outrate - -
encoder_ogg = oggenc2 -q -M %outrate -
encoder_ogg = oggenc2 -Q -M %outrate -
; Default format, used when a client requests a bitrate lower than the original
; file and no specific format

View File

@ -57,6 +57,14 @@ program. The command-lines can include the following fields:
* `%srcfmt`: extension of the original file
* `%outfmt`: extension of the resulting file
* `%outrate`: bitrate of the resulting file
* `%title`: title of the file to transcode
* `%album`: album name of the file to transcode
* `%artist`: artist name of the file to transcode
* `%tracknumber`: track number of the file to transcode
* `%totaltracks`: number of tracks in the album of the file to transcode
* `%discnumber`: disc number of the file to transcode
* `%genre`: genre of the file to transcode (not always available, defaults to "")
* `%year`: year of the file to transcode (not always available, defaults to "")
One final note: the original file should be provided as an argument of
transcoders and decoders. All transcoders, decoders and encoders should write
@ -67,9 +75,10 @@ client requests a bitrate lower than the original file and no specific format.
## Suggested configuration
Here are some example configuration that you could use. This is provided as-is,
Here is an example configuration that you could use. This is provided as-is,
and some configurations haven't been tested.
Basic configuration:
```ini
[transcoding]
transcoder_mp3_mp3 = lame --quiet --mp3input -b %outrate %srcpath -
@ -78,7 +87,19 @@ decoder_mp3 = mpg123 --quiet -w - %srcpath
decoder_ogg = oggdec -o %srcpath
decoder_flac = flac -d -c -s %srcpath
encoder_mp3 = lame --quiet -b %outrate - -
encoder_ogg = oggenc2 -q -M %outrate -
encoder_ogg = oggenc2 -Q -M %outrate -
default_transcode_target = mp3
```
To include track metadata in the transcoded stream:
```ini
[transcoding]
transcoder_mp3_mp3 = lame --quiet --mp3input -b %outrate --tt %title --tl %album --ta %artist --tn %tracknumber/%totaltracks --tv TPOS=%discnumber --tg %genre --ty %year --add-id3v2 %srcpath -
transcoder = ffmpeg -i %srcpath -ab %outratek -v 0 -metadata title=%title -metadata album=%album -metadata author=%artist -metadata track=%tracknumber/%totaltracks -metadata disc=%discnumber -metadata genre=%genre -metadata date=%year -f %outfmt -
decoder_mp3 = mpg123 --quiet -w - %srcpath
decoder_ogg = oggdec -o %srcpath
decoder_flac = flac -d -c -s %srcpath
encoder_mp3 = lame --quiet -b %outrate --tt %title --tl %album --ta %artist --tn %tracknumber/%totaltracks --tv TPOS=%discnumber --tg %genre --ty %year --add-id3v2 - -
encoder_ogg = oggenc2 -Q -M %outrate -t %title -l %album -a %artist -N %tracknumber -c TOTALTRACKS=%totaltracks -c DISCNUMBER=%discnumber -G %genre -d %year -
default_transcode_target = mp3
```

View File

@ -48,16 +48,24 @@ logger = logging.getLogger(__name__)
def prepare_transcoding_cmdline(
base_cmdline, input_file, input_format, output_format, output_bitrate
base_cmdline, res, input_format, output_format, output_bitrate
):
if not base_cmdline:
return None
ret = shlex.split(base_cmdline)
ret = [
part.replace("%srcpath", input_file)
part.replace("%srcpath", res.path)
.replace("%srcfmt", input_format)
.replace("%outfmt", output_format)
.replace("%outrate", str(output_bitrate))
.replace("%title", res.title)
.replace("%album", res.album.name)
.replace("%artist", res.artist.name)
.replace("%tracknumber", str(res.number))
.replace("%totaltracks", str(res.album.tracks.count()))
.replace("%discnumber", str(res.disc))
.replace("%genre", res.genre if res.genre else "")
.replace("%year", str(res.year) if res.year else "")
for part in ret
]
return ret
@ -128,12 +136,12 @@ def stream_media():
logger.info(message)
raise GenericError(message)
transcoder, decoder, encoder = map(
lambda x: prepare_transcoding_cmdline(
x, res.path, src_suffix, dst_suffix, dst_bitrate
),
[transcoder, decoder, encoder],
)
transcoder, decoder, encoder = [
prepare_transcoding_cmdline(
x, res, src_suffix, dst_suffix, dst_bitrate
)
for x in (transcoder, decoder, encoder)
]
try:
if transcoder:
dec_proc = None