From e2e83ea76041e8d0318818132f95fa16606f047e Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Wed, 9 Feb 2022 15:04:49 -0800 Subject: [PATCH] FFmpeg/FLAC/Opus/Vorbis Inputs: Fix metadata The dynamic metadata functions should only activate for unseekable streams, not seekable streams, and not local files. Signed-off-by: Christopher Snowhill --- Plugins/FFMPEG/FFMPEGDecoder.m | 2 ++ Plugins/Flac/FlacDecoder.m | 49 +++++++++++++++++---------------- Plugins/Opus/Opus/OpusDecoder.m | 11 +++++--- Plugins/Vorbis/VorbisDecoder.m | 4 +++ 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/Plugins/FFMPEG/FFMPEGDecoder.m b/Plugins/FFMPEG/FFMPEGDecoder.m index 2bad0e86b..3c298f126 100644 --- a/Plugins/FFMPEG/FFMPEGDecoder.m +++ b/Plugins/FFMPEG/FFMPEGDecoder.m @@ -461,6 +461,8 @@ int64_t ffmpeg_seek(void *opaque, int64_t offset, int whence) { } - (void)updateMetadata { + if([source seekable]) return; + const AVDictionaryEntry *tag = NULL; NSString *_genre = genre; NSString *_album = album; diff --git a/Plugins/Flac/FlacDecoder.m b/Plugins/Flac/FlacDecoder.m index 4ec8e2119..8a53238ba 100644 --- a/Plugins/Flac/FlacDecoder.m +++ b/Plugins/Flac/FlacDecoder.m @@ -230,10 +230,11 @@ void MetadataCallback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMeta } } - if(![_genre isEqual:flacDecoder->genre] || - ![_album isEqual:flacDecoder->album] || - ![_artist isEqual:flacDecoder->artist] || - ![_title isEqual:flacDecoder->title]) { + if(![flacDecoder->source seekable] && + (![_genre isEqual:flacDecoder->genre] || + ![_album isEqual:flacDecoder->album] || + ![_artist isEqual:flacDecoder->artist] || + ![_title isEqual:flacDecoder->title])) { flacDecoder->genre = _genre; flacDecoder->album = _album; flacDecoder->artist = _artist; @@ -365,25 +366,27 @@ void ErrorCallback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorS } } - Class sourceClass = [source class]; - if([sourceClass isEqual:NSClassFromString(@"HTTPSource")]) { - HTTPSource *httpSource = (HTTPSource *)source; - if([httpSource hasMetadata]) { - NSDictionary *metadata = [httpSource metadata]; - NSString *_genre = [metadata valueForKey:@"genre"]; - NSString *_album = [metadata valueForKey:@"album"]; - NSString *_artist = [metadata valueForKey:@"artist"]; - NSString *_title = [metadata valueForKey:@"title"]; - if(![_genre isEqualToString:genre] || - ![_album isEqualToString:album] || - ![_artist isEqualToString:artist] || - ![_title isEqualToString:title]) { - genre = _genre; - album = _album; - artist = _artist; - title = _title; - [self willChangeValueForKey:@"metadata"]; - [self didChangeValueForKey:@"metadata"]; + if(![source seekable]) { + Class sourceClass = [source class]; + if([sourceClass isEqual:NSClassFromString(@"HTTPSource")]) { + HTTPSource *httpSource = (HTTPSource *)source; + if([httpSource hasMetadata]) { + NSDictionary *metadata = [httpSource metadata]; + NSString *_genre = [metadata valueForKey:@"genre"]; + NSString *_album = [metadata valueForKey:@"album"]; + NSString *_artist = [metadata valueForKey:@"artist"]; + NSString *_title = [metadata valueForKey:@"title"]; + if(![_genre isEqualToString:genre] || + ![_album isEqualToString:album] || + ![_artist isEqualToString:artist] || + ![_title isEqualToString:title]) { + genre = _genre; + album = _album; + artist = _artist; + title = _title; + [self willChangeValueForKey:@"metadata"]; + [self didChangeValueForKey:@"metadata"]; + } } } } diff --git a/Plugins/Opus/Opus/OpusDecoder.m b/Plugins/Opus/Opus/OpusDecoder.m index 839085c11..7390e1c95 100644 --- a/Plugins/Opus/Opus/OpusDecoder.m +++ b/Plugins/Opus/Opus/OpusDecoder.m @@ -158,10 +158,11 @@ opus_int64 sourceTell(void *_stream) { } } - if(![_genre isEqual:genre] || - ![_album isEqual:album] || - ![_artist isEqual:artist] || - ![_title isEqual:title]) { + if(![source seekable] && + (![_genre isEqual:genre] || + ![_album isEqual:album] || + ![_artist isEqual:artist] || + ![_title isEqual:title])) { genre = _genre; album = _album; artist = _artist; @@ -173,6 +174,8 @@ opus_int64 sourceTell(void *_stream) { } - (void)updateIcyMetadata { + if([source seekable]) return; + NSString *_genre = genre; NSString *_album = album; NSString *_artist = artist; diff --git a/Plugins/Vorbis/VorbisDecoder.m b/Plugins/Vorbis/VorbisDecoder.m index 5e344ed26..133c87d10 100644 --- a/Plugins/Vorbis/VorbisDecoder.m +++ b/Plugins/Vorbis/VorbisDecoder.m @@ -107,6 +107,8 @@ long sourceTell(void *datasource) { } - (void)updateMetadata { + if([source seekable]) return; + const vorbis_comment *comment = ov_comment(&vorbisRef, -1); if(comment) { @@ -153,6 +155,8 @@ long sourceTell(void *datasource) { } - (void)updateIcyMetadata { + if([source seekable]) return; + NSString *_genre = genre; NSString *_album = album; NSString *_artist = artist;