diff --git a/src/SongPrint.cxx b/src/SongPrint.cxx index 98d544cc38..79ff54cd56 100644 --- a/src/SongPrint.cxx +++ b/src/SongPrint.cxx @@ -48,6 +48,42 @@ song_print_uri(Response &r, const DetachedSong &song, bool base) noexcept song_print_uri(r, song.GetURI(), base); } +static void +song_print_real_uri(Response &r, const char *real_uri, bool base) noexcept +{ + std::string allocated; + + if (base) { + real_uri = PathTraitsUTF8::GetBase(real_uri); + } else { + allocated = uri_remove_auth(real_uri); + if (!allocated.empty()) + real_uri = allocated.c_str(); + } + + r.Fmt(FMT_STRING("RealUri: {}\n"), real_uri); +} + +static void +song_print_real_uri(Response &r, const LightSong &song, bool base) noexcept +{ + if (song.real_uri == nullptr) + return; + + if (!base && song.directory != nullptr) + r.Fmt(FMT_STRING("RealUri: {}\n"), + song.real_uri); + else + song_print_real_uri(r, song.real_uri, base); +} + +static void +song_print_real_uri(Response &r, const DetachedSong &song, bool base) noexcept +{ + if (song.HasRealURI()) + song_print_real_uri(r, song.GetRealURI(), base); +} + static void PrintRange(Response &r, SongTime start_time, SongTime end_time) noexcept { @@ -71,6 +107,8 @@ song_print_info(Response &r, const LightSong &song, bool base) noexcept { song_print_uri(r, song, base); + song_print_real_uri(r, song, base); + PrintRange(r, song.start_time, song.end_time); if (!IsNegative(song.mtime)) @@ -94,6 +132,8 @@ song_print_info(Response &r, const DetachedSong &song, bool base) noexcept { song_print_uri(r, song, base); + song_print_real_uri(r, song, base); + PrintRange(r, song.GetStartTime(), song.GetEndTime()); if (!IsNegative(song.GetLastModified())) diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx index 4efd97ec9c..29ff450543 100644 --- a/src/db/plugins/ProxyDatabasePlugin.cxx +++ b/src/db/plugins/ProxyDatabasePlugin.cxx @@ -203,12 +203,16 @@ Copy(TagBuilder &tag, TagType d_tag, ProxySong::ProxySong(const mpd_song *song) :LightSong(mpd_song_get_uri(song), tag2) { + const auto _real_uri = mpd_song_get_real_uri(song); + if (_real_uri != nullptr) + real_uri = _real_uri; + const auto _mtime = mpd_song_get_last_modified(song); if (_mtime > 0) mtime = std::chrono::system_clock::from_time_t(_mtime); - start_time = SongTime::FromS(mpd_song_get_start(song)); - end_time = SongTime::FromS(mpd_song_get_end(song)); + start_time = SongTime::FromMS(mpd_song_get_start_ms(song)); + end_time = SongTime::FromMS(mpd_song_get_end_ms(song)); const auto *af = mpd_song_get_audio_format(song); if (af != nullptr) { diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index 7045bddc12..2f479acd2b 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -534,7 +534,7 @@ CurlInputStream::SeekInternal(offset_type new_offset) if (offset > 0) request->SetOption(CURLOPT_RANGE, - fmt::format_int{offset}.c_str()); + fmt::format("{}-", offset).c_str()); StartRequest(); } diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 6e57ecb4ad..af5e85b8aa 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -903,7 +903,10 @@ PlayerControl::LockUpdateSongTag(DetachedSong &song, streams may change tags dynamically */ return; - song.SetTag(new_tag); + if (!song.GetEndTime().IsZero()) + song.SetTag(Tag::Merge(song.GetTag(), new_tag)); + else + song.SetTag(new_tag); LockSetTaggedSong(song);