input/Plugin: pass URI as std::string_view

This commit is contained in:
Max Kellermann 2025-01-30 11:20:52 +01:00
parent aee49d1c1c
commit 715ef846b6
35 changed files with 85 additions and 92 deletions

View File

@ -36,7 +36,7 @@ RemoteTagCache::Lookup(const std::string &uri) noexcept
lock.unlock(); lock.unlock();
try { try {
item->scanner = InputScanTags(uri.c_str(), *item); item->scanner = InputScanTags(uri, *item);
if (!item->scanner) { if (!item->scanner) {
/* unsupported */ /* unsupported */
lock.lock(); lock.lock();

View File

@ -146,7 +146,7 @@ find_stream_art(std::string_view directory, Mutex &mutex)
std::string art_file = PathTraitsUTF8::Build(directory, name); std::string art_file = PathTraitsUTF8::Build(directory, name);
try { try {
return InputStream::OpenReady(art_file.c_str(), mutex); return InputStream::OpenReady(art_file, mutex);
} catch (...) { } catch (...) {
auto e = std::current_exception(); auto e = std::current_exception();
if (!IsFileNotFound(e)) if (!IsFileNotFound(e))

View File

@ -68,7 +68,7 @@ private:
void DecodeFile(); void DecodeFile();
/* virtual methods from class DecoderClient */ /* virtual methods from class DecoderClient */
InputStreamPtr OpenUri(const char *uri) override; InputStreamPtr OpenUri(std::string_view uri) override;
size_t Read(InputStream &is, size_t Read(InputStream &is,
std::span<std::byte> dest) noexcept override; std::span<std::byte> dest) noexcept override;
@ -246,14 +246,14 @@ try {
if (!path.IsNull()) if (!path.IsNull())
DecodeFile(); DecodeFile();
else else
DecodeStream(*OpenUri(uri.c_str())); DecodeStream(*OpenUri(uri));
ChromaprintDecoderClient::Finish(); ChromaprintDecoderClient::Finish();
} catch (StopDecoder) { } catch (StopDecoder) {
} }
InputStreamPtr InputStreamPtr
GetChromaprintCommand::OpenUri(const char *uri2) GetChromaprintCommand::OpenUri(std::string_view uri2)
{ {
if (cancel) if (cancel)
throw StopDecoder(); throw StopDecoder();

View File

@ -372,7 +372,7 @@ DecoderBridge::SeekError() noexcept
} }
InputStreamPtr InputStreamPtr
DecoderBridge::OpenUri(const char *uri) DecoderBridge::OpenUri(std::string_view uri)
{ {
assert(dc.state == DecoderState::START || assert(dc.state == DecoderState::START ||
dc.state == DecoderState::DECODE); dc.state == DecoderState::DECODE);

View File

@ -158,7 +158,7 @@ public:
SongTime GetSeekTime() noexcept override; SongTime GetSeekTime() noexcept override;
uint64_t GetSeekFrame() noexcept override; uint64_t GetSeekFrame() noexcept override;
void SeekError() noexcept override; void SeekError() noexcept override;
InputStreamPtr OpenUri(const char *uri) override; InputStreamPtr OpenUri(std::string_view uri) override;
size_t Read(InputStream &is, size_t Read(InputStream &is,
std::span<std::byte> dest) noexcept override; std::span<std::byte> dest) noexcept override;
void SubmitTimestamp(FloatDuration t) noexcept override; void SubmitTimestamp(FloatDuration t) noexcept override;

View File

@ -10,6 +10,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <span> #include <span>
#include <string_view>
struct AudioFormat; struct AudioFormat;
struct Tag; struct Tag;
@ -80,7 +81,7 @@ public:
* *
* Throws std::runtime_error on error. * Throws std::runtime_error on error.
*/ */
virtual InputStreamPtr OpenUri(const char *uri) = 0; virtual InputStreamPtr OpenUri(std::string_view uri) = 0;
/** /**
* Blocking read from the input stream. * Blocking read from the input stream.

View File

@ -227,7 +227,7 @@ decoder_run_stream_plugin(DecoderBridge &bridge, InputStream &is,
static DecodeResult static DecodeResult
decoder_run_stream_locked(DecoderBridge &bridge, InputStream &is, decoder_run_stream_locked(DecoderBridge &bridge, InputStream &is,
std::unique_lock<Mutex> &lock, std::unique_lock<Mutex> &lock,
const char *uri) std::string_view uri)
{ {
const auto suffix = uri_get_suffix(uri); const auto suffix = uri_get_suffix(uri);

View File

@ -11,7 +11,6 @@
#include "fs/Path.hxx" #include "fs/Path.hxx"
#include "lib/fmt/PathFormatter.hxx" #include "lib/fmt/PathFormatter.hxx"
#include "lib/fmt/RuntimeError.hxx" #include "lib/fmt/RuntimeError.hxx"
#include "util/AllocatedString.hxx"
#include "util/Math.hxx" #include "util/Math.hxx"
#include "util/ScopeExit.hxx" #include "util/ScopeExit.hxx"
@ -407,10 +406,8 @@ static constexpr WavpackStreamReader64 mpd_is_reader = {
static InputStreamPtr static InputStreamPtr
wavpack_open_wvc(DecoderClient &client, std::string_view uri) wavpack_open_wvc(DecoderClient &client, std::string_view uri)
{ {
const AllocatedString wvc_url{uri, "c"sv};
try { try {
return client.OpenUri(wvc_url.c_str()); return client.OpenUri(fmt::format("{}c", uri));
} catch (...) { } catch (...) {
return nullptr; return nullptr;
} }

View File

@ -9,7 +9,7 @@
#include <iterator> #include <iterator>
bool bool
InputPlugin::SupportsUri(const char *uri) const noexcept InputPlugin::SupportsUri(std::string_view uri) const noexcept
{ {
assert(prefixes || protocols); assert(prefixes || protocols);
if (prefixes != nullptr) { if (prefixes != nullptr) {

View File

@ -47,7 +47,7 @@ struct InputPlugin {
* *
* Throws std::runtime_error on error. * Throws std::runtime_error on error.
*/ */
InputStreamPtr (*open)(const char *uri, Mutex &mutex); InputStreamPtr (*open)(std::string_view uri, Mutex &mutex);
/** /**
* return a set of supported protocols * return a set of supported protocols
@ -63,11 +63,11 @@ struct InputPlugin {
* *
* @return nullptr if the given URI is not supported. * @return nullptr if the given URI is not supported.
*/ */
std::unique_ptr<RemoteTagScanner> (*scan_tags)(const char *uri, std::unique_ptr<RemoteTagScanner> (*scan_tags)(std::string_view uri,
RemoteTagHandler &handler) = nullptr; RemoteTagHandler &handler) = nullptr;
[[gnu::pure]] [[gnu::pure]]
bool SupportsUri(const char *uri) const noexcept; bool SupportsUri(std::string_view uri) const noexcept;
template<typename F> template<typename F>
void ForeachSupportedUri(F lambda) const noexcept { void ForeachSupportedUri(F lambda) const noexcept {

View File

@ -4,7 +4,7 @@
#include "InputStream.hxx" #include "InputStream.hxx"
#include "Handler.hxx" #include "Handler.hxx"
#include "tag/Tag.hxx" #include "tag/Tag.hxx"
#include "util/ASCII.hxx" #include "util/StringCompare.hxx"
#include <cassert> #include <cassert>
#include <stdexcept> #include <stdexcept>
@ -38,17 +38,17 @@ InputStream::SetReady() noexcept
*/ */
[[gnu::pure]] [[gnu::pure]]
static bool static bool
ExpensiveSeeking(const char *uri) noexcept ExpensiveSeeking(std::string_view uri) noexcept
{ {
return StringStartsWithCaseASCII(uri, "http://") || return StringStartsWithIgnoreCase(uri, "http://") ||
StringStartsWithCaseASCII(uri, "qobuz://") || StringStartsWithIgnoreCase(uri, "qobuz://") ||
StringStartsWithCaseASCII(uri, "https://"); StringStartsWithIgnoreCase(uri, "https://");
} }
bool bool
InputStream::CheapSeeking() const noexcept InputStream::CheapSeeking() const noexcept
{ {
return IsSeekable() && !ExpensiveSeeking(uri.c_str()); return IsSeekable() && !ExpensiveSeeking(uri);
} }
//[[noreturn]] //[[noreturn]]

View File

@ -111,14 +111,14 @@ public:
* @return an #InputStream object on success * @return an #InputStream object on success
*/ */
[[nodiscard]] [[nodiscard]]
static InputStreamPtr Open(const char *uri, Mutex &mutex); static InputStreamPtr Open(std::string_view uri, Mutex &mutex);
/** /**
* Just like Open(), but waits for the stream to become ready. * Just like Open(), but waits for the stream to become ready.
* It is a wrapper for Open(), WaitReady() and Check(). * It is a wrapper for Open(), WaitReady() and Check().
*/ */
[[nodiscard]] [[nodiscard]]
static InputStreamPtr OpenReady(const char *uri, Mutex &mutex); static InputStreamPtr OpenReady(std::string_view uri, Mutex &mutex);
/** /**
* Install a new handler. * Install a new handler.

View File

@ -13,7 +13,7 @@
#include <stdexcept> #include <stdexcept>
InputStreamPtr InputStreamPtr
InputStream::Open(const char *url, Mutex &mutex) InputStream::Open(std::string_view url, Mutex &mutex)
{ {
if (PathTraitsUTF8::IsAbsolute(url)) { if (PathTraitsUTF8::IsAbsolute(url)) {
const auto path = AllocatedPath::FromUTF8Throw(url); const auto path = AllocatedPath::FromUTF8Throw(url);
@ -32,7 +32,7 @@ InputStream::Open(const char *url, Mutex &mutex)
} }
InputStreamPtr InputStreamPtr
InputStream::OpenReady(const char *uri, Mutex &mutex) InputStream::OpenReady(std::string_view uri, Mutex &mutex)
{ {
auto is = Open(uri, mutex); auto is = Open(uri, mutex);
LockWaitReady(*is); LockWaitReady(*is);

View File

@ -1,8 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Copyright The Music Player Daemon Project // Copyright The Music Player Daemon Project
#ifndef MPD_PROXY_INPUT_STREAM_HXX #pragma once
#define MPD_PROXY_INPUT_STREAM_HXX
#include "InputStream.hxx" #include "InputStream.hxx"
#include "Ptr.hxx" #include "Ptr.hxx"
@ -26,15 +25,17 @@ protected:
InputStreamPtr input; InputStreamPtr input;
public: public:
[[nodiscard]]
explicit ProxyInputStream(InputStreamPtr _input) noexcept; explicit ProxyInputStream(InputStreamPtr _input) noexcept;
/** /**
* Construct an instance without an #InputStream instance. * Construct an instance without an #InputStream instance.
* Once that instance becomes available, call SetInput(). * Once that instance becomes available, call SetInput().
*/ */
ProxyInputStream(const char *_uri, template<typename U>
Mutex &_mutex) noexcept [[nodiscard]]
:InputStream(_uri, _mutex) {} ProxyInputStream(U &&_uri, Mutex &_mutex) noexcept
:InputStream(std::forward<U>(_uri), _mutex) {}
~ProxyInputStream() noexcept override; ~ProxyInputStream() noexcept override;
@ -78,5 +79,3 @@ protected:
InvokeOnAvailable(); InvokeOnAvailable();
} }
}; };
#endif

View File

@ -70,7 +70,7 @@ static constexpr std::size_t n_input_plugins = std::size(input_plugins) - 1;
bool input_plugins_enabled[std::max(n_input_plugins, std::size_t(1))]; bool input_plugins_enabled[std::max(n_input_plugins, std::size_t(1))];
bool bool
HasRemoteTagScanner(const char *uri) noexcept HasRemoteTagScanner(std::string_view uri) noexcept
{ {
for (const auto &plugin : GetEnabledInputPlugins()) { for (const auto &plugin : GetEnabledInputPlugins()) {
if (plugin.scan_tags != nullptr && if (plugin.scan_tags != nullptr &&

View File

@ -7,6 +7,8 @@
#include "util/FilteredContainer.hxx" #include "util/FilteredContainer.hxx"
#include "util/TerminatedArray.hxx" #include "util/TerminatedArray.hxx"
#include <string_view>
/** /**
* NULL terminated list of all input plugins which were enabled at * NULL terminated list of all input plugins which were enabled at
* compile time. * compile time.
@ -30,4 +32,4 @@ GetEnabledInputPlugins() noexcept
[[gnu::pure]] [[gnu::pure]]
bool bool
HasRemoteTagScanner(const char *uri) noexcept; HasRemoteTagScanner(std::string_view uri) noexcept;

View File

@ -7,7 +7,7 @@
#include "Registry.hxx" #include "Registry.hxx"
std::unique_ptr<RemoteTagScanner> std::unique_ptr<RemoteTagScanner>
InputScanTags(const char *uri, RemoteTagHandler &handler) InputScanTags(std::string_view uri, RemoteTagHandler &handler)
{ {
for (const auto &plugin : GetEnabledInputPlugins()) { for (const auto &plugin : GetEnabledInputPlugins()) {
if (plugin.scan_tags == nullptr || !plugin.SupportsUri(uri)) if (plugin.scan_tags == nullptr || !plugin.SupportsUri(uri))

View File

@ -1,10 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Copyright The Music Player Daemon Project // Copyright The Music Player Daemon Project
#ifndef MPD_INPUT_SCAN_TAGS_HXX #pragma once
#define MPD_INPUT_SCAN_TAGS_HXX
#include <memory> #include <memory>
#include <string_view>
class RemoteTagScanner; class RemoteTagScanner;
class RemoteTagHandler; class RemoteTagHandler;
@ -19,6 +19,4 @@ class RemoteTagHandler;
* by any (enabled) plugin * by any (enabled) plugin
*/ */
std::unique_ptr<RemoteTagScanner> std::unique_ptr<RemoteTagScanner>
InputScanTags(const char *uri, RemoteTagHandler &handler); InputScanTags(std::string_view uri, RemoteTagHandler &handler);
#endif

View File

@ -9,7 +9,7 @@
#include <string.h> #include <string.h>
ThreadInputStream::ThreadInputStream(const char *_plugin, ThreadInputStream::ThreadInputStream(const char *_plugin,
const char *_uri, std::string_view _uri,
Mutex &_mutex, Mutex &_mutex,
size_t _buffer_size) noexcept size_t _buffer_size) noexcept
:InputStream(_uri, _mutex), :InputStream(_uri, _mutex),

View File

@ -62,7 +62,7 @@ class ThreadInputStream : public InputStream {
public: public:
ThreadInputStream(const char *_plugin, ThreadInputStream(const char *_plugin,
const char *_uri, Mutex &_mutex, std::string_view _uri, Mutex &_mutex,
size_t _buffer_size) noexcept; size_t _buffer_size) noexcept;
#ifndef NDEBUG #ifndef NDEBUG

View File

@ -90,7 +90,7 @@ public:
AlsaInputStream(const AlsaInputStream &) = delete; AlsaInputStream(const AlsaInputStream &) = delete;
AlsaInputStream &operator=(const AlsaInputStream &) = delete; AlsaInputStream &operator=(const AlsaInputStream &) = delete;
static InputStreamPtr Create(EventLoop &event_loop, const char *uri, static InputStreamPtr Create(EventLoop &event_loop, std::string_view uri,
Mutex &mutex); Mutex &mutex);
protected: protected:
@ -194,11 +194,9 @@ AlsaInputStream::AlsaInputStream(EventLoop &_loop,
} }
inline InputStreamPtr inline InputStreamPtr
AlsaInputStream::Create(EventLoop &event_loop, const char *uri, AlsaInputStream::Create(EventLoop &event_loop, std::string_view uri,
Mutex &mutex) Mutex &mutex)
{ {
assert(uri != nullptr);
AlsaInputStream::SourceSpec spec(uri); AlsaInputStream::SourceSpec spec(uri);
if (!spec.IsValidScheme()) if (!spec.IsValidScheme())
return nullptr; return nullptr;
@ -451,7 +449,7 @@ alsa_input_init(EventLoop &event_loop, const ConfigBlock &block)
} }
static InputStreamPtr static InputStreamPtr
alsa_input_open(const char *uri, Mutex &mutex) alsa_input_open(std::string_view uri, Mutex &mutex)
{ {
return AlsaInputStream::Create(*global_config.event_loop, uri, return AlsaInputStream::Create(*global_config.event_loop, uri,
mutex); mutex);

View File

@ -47,7 +47,7 @@ class CdioParanoiaInputStream final : public InputStream {
lsn_t buffer_lsn; lsn_t buffer_lsn;
public: public:
CdioParanoiaInputStream(const char *_uri, Mutex &_mutex, CdioParanoiaInputStream(std::string_view _uri, Mutex &_mutex,
cdrom_drive_t *_drv, CdIo_t *_cdio, cdrom_drive_t *_drv, CdIo_t *_cdio,
bool reverse_endian, bool reverse_endian,
lsn_t _lsn_from, lsn_t lsn_to) lsn_t _lsn_from, lsn_t lsn_to)
@ -171,7 +171,7 @@ cdio_detect_device()
} }
static InputStreamPtr static InputStreamPtr
input_cdio_open(const char *uri, input_cdio_open(std::string_view uri,
Mutex &mutex) Mutex &mutex)
{ {
const auto parsed_uri = parse_cdio_uri(uri); const auto parsed_uri = parse_cdio_uri(uri);

View File

@ -19,9 +19,9 @@
#include "lib/fmt/ToBuffer.hxx" #include "lib/fmt/ToBuffer.hxx"
#include "event/Call.hxx" #include "event/Call.hxx"
#include "event/Loop.hxx" #include "event/Loop.hxx"
#include "util/ASCII.hxx"
#include "util/CNumberParser.hxx" #include "util/CNumberParser.hxx"
#include "util/Domain.hxx" #include "util/Domain.hxx"
#include "util/StringCompare.hxx"
#include "Log.hxx" #include "Log.hxx"
#include "PluginUnavailable.hxx" #include "PluginUnavailable.hxx"
#include "config.h" #include "config.h"
@ -42,6 +42,8 @@
#include <curl/curl.h> #include <curl/curl.h>
using std::string_view_literals::operator""sv;
/** /**
* Do not buffer more than this number of bytes. It should be a * Do not buffer more than this number of bytes. It should be a
* reasonable limit that doesn't make low-end machines suffer too * reasonable limit that doesn't make low-end machines suffer too
@ -596,10 +598,10 @@ OpenCurlInputStream(std::string_view uri, const Curl::Headers &headers,
} }
static InputStreamPtr static InputStreamPtr
input_curl_open(const char *url, Mutex &mutex) input_curl_open(std::string_view url, Mutex &mutex)
{ {
if (!StringStartsWithCaseASCII(url, "http://") && if (!StringStartsWithIgnoreCase(url, "http://"sv) &&
!StringStartsWithCaseASCII(url, "https://")) !StringStartsWithIgnoreCase(url, "https://"sv))
return nullptr; return nullptr;
return CurlInputStream::Open(url, {}, mutex); return CurlInputStream::Open(url, {}, mutex);

View File

@ -18,7 +18,7 @@ class FfmpegInputStream final : public ThreadInputStream {
Ffmpeg::IOContext io; Ffmpeg::IOContext io;
public: public:
FfmpegInputStream(const char *_uri, Mutex &_mutex) FfmpegInputStream(std::string_view _uri, Mutex &_mutex)
:ThreadInputStream("ffmpeg", _uri, _mutex, BUFFER_SIZE) :ThreadInputStream("ffmpeg", _uri, _mutex, BUFFER_SIZE)
{ {
Start(); Start();
@ -82,8 +82,7 @@ input_ffmpeg_protocols() noexcept
} }
static InputStreamPtr static InputStreamPtr
input_ffmpeg_open(const char *uri, input_ffmpeg_open(std::string_view uri, Mutex &mutex)
Mutex &mutex)
{ {
return std::make_unique<FfmpegInputStream>(uri, mutex); return std::make_unique<FfmpegInputStream>(uri, mutex);
} }

View File

@ -16,7 +16,7 @@ class MmsInputStream final : public ThreadInputStream {
mmsx_t *mms; mmsx_t *mms;
public: public:
MmsInputStream(const char *_uri, Mutex &_mutex) MmsInputStream(std::string_view _uri, Mutex &_mutex)
:ThreadInputStream(input_plugin_mms.name, _uri, _mutex, :ThreadInputStream(input_plugin_mms.name, _uri, _mutex,
BUFFER_SIZE) BUFFER_SIZE)
{ {
@ -56,8 +56,7 @@ MmsInputStream::Open()
} }
static InputStreamPtr static InputStreamPtr
input_mms_open(const char *url, input_mms_open(std::string_view url, Mutex &mutex)
Mutex &mutex)
{ {
return std::make_unique<MmsInputStream>(url, mutex); return std::make_unique<MmsInputStream>(url, mutex);
} }

View File

@ -213,7 +213,7 @@ input_nfs_finish() noexcept
} }
static InputStreamPtr static InputStreamPtr
input_nfs_open(const char *uri, input_nfs_open(std::string_view uri,
Mutex &mutex) Mutex &mutex)
{ {
auto is = std::make_unique<NfsInputStream>(uri, mutex); auto is = std::make_unique<NfsInputStream>(uri, mutex);

View File

@ -17,6 +17,8 @@
#include <memory> #include <memory>
using std::string_view_literals::operator""sv;
static QobuzClient *qobuz_client; static QobuzClient *qobuz_client;
class QobuzInputStream final class QobuzInputStream final
@ -29,7 +31,7 @@ class QobuzInputStream final
std::exception_ptr error; std::exception_ptr error;
public: public:
QobuzInputStream(const char *_uri, const char *_track_id, QobuzInputStream(std::string_view _uri, std::string_view _track_id,
Mutex &_mutex) noexcept Mutex &_mutex) noexcept
:ProxyInputStream(_uri, _mutex), :ProxyInputStream(_uri, _mutex),
track_id(_track_id) track_id(_track_id)
@ -151,27 +153,23 @@ FinishQobuzInput() noexcept
} }
[[gnu::pure]] [[gnu::pure]]
static const char * static std::string_view
ExtractQobuzTrackId(const char *uri) ExtractQobuzTrackId(std::string_view uri) noexcept
{ {
// TODO: what's the standard "qobuz://" URI syntax? // TODO: what's the standard "qobuz://" URI syntax?
const char *track_id = StringAfterPrefix(uri, "qobuz://track/"); if (SkipPrefix(uri, "qobuz://track/"sv))
if (track_id == nullptr) return uri;
return nullptr;
if (*track_id == 0) return {};
return nullptr;
return track_id;
} }
static InputStreamPtr static InputStreamPtr
OpenQobuzInput(const char *uri, Mutex &mutex) OpenQobuzInput(std::string_view uri, Mutex &mutex)
{ {
assert(qobuz_client != nullptr); assert(qobuz_client != nullptr);
const char *track_id = ExtractQobuzTrackId(uri); const auto track_id = ExtractQobuzTrackId(uri);
if (track_id == nullptr) if (track_id.empty())
return nullptr; return nullptr;
// TODO: validate track_id // TODO: validate track_id
@ -180,12 +178,12 @@ OpenQobuzInput(const char *uri, Mutex &mutex)
} }
static std::unique_ptr<RemoteTagScanner> static std::unique_ptr<RemoteTagScanner>
ScanQobuzTags(const char *uri, RemoteTagHandler &handler) ScanQobuzTags(std::string_view uri, RemoteTagHandler &handler)
{ {
assert(qobuz_client != nullptr); assert(qobuz_client != nullptr);
const char *track_id = ExtractQobuzTrackId(uri); const auto track_id = ExtractQobuzTrackId(uri);
if (track_id == nullptr) if (track_id.empty())
return nullptr; return nullptr;
return std::make_unique<QobuzTagScanner>(*qobuz_client, track_id, return std::make_unique<QobuzTagScanner>(*qobuz_client, track_id,

View File

@ -61,16 +61,16 @@ public:
}; };
static std::string static std::string
MakeTrackUrl(QobuzClient &client, const char *track_id) MakeTrackUrl(QobuzClient &client, std::string_view track_id)
{ {
return client.MakeUrl("track", "get", return client.MakeUrl("track", "get",
{ {
{"track_id", track_id}, {"track_id", std::string{track_id}},
}); });
} }
QobuzTagScanner::QobuzTagScanner(QobuzClient &client, QobuzTagScanner::QobuzTagScanner(QobuzClient &client,
const char *track_id, std::string_view track_id,
RemoteTagHandler &_handler) RemoteTagHandler &_handler)
:request(client.GetCurl(), :request(client.GetCurl(),
MakeTrackUrl(client, track_id).c_str(), MakeTrackUrl(client, track_id).c_str(),

View File

@ -21,7 +21,7 @@ public:
class ResponseParser; class ResponseParser;
QobuzTagScanner(QobuzClient &client, QobuzTagScanner(QobuzClient &client,
const char *track_id, std::string_view track_id,
RemoteTagHandler &_handler); RemoteTagHandler &_handler);
~QobuzTagScanner() noexcept override; ~QobuzTagScanner() noexcept override;

View File

@ -17,7 +17,7 @@ class SmbclientInputStream final : public InputStream {
SMBCFILE *const handle; SMBCFILE *const handle;
public: public:
SmbclientInputStream(const char *_uri, SmbclientInputStream(std::string &&_uri,
Mutex &_mutex, Mutex &_mutex,
SmbclientContext &&_ctx, SmbclientContext &&_ctx,
SMBCFILE *_handle, const struct stat &st) SMBCFILE *_handle, const struct stat &st)
@ -64,12 +64,13 @@ input_smbclient_init(EventLoop &, const ConfigBlock &)
} }
static InputStreamPtr static InputStreamPtr
input_smbclient_open(const char *uri, input_smbclient_open(std::string_view _uri,
Mutex &mutex) Mutex &mutex)
{ {
auto ctx = SmbclientContext::New(); auto ctx = SmbclientContext::New();
SMBCFILE *handle = ctx.OpenReadOnly(uri); std::string uri{_uri};
SMBCFILE *handle = ctx.OpenReadOnly(uri.c_str());
if (handle == nullptr) if (handle == nullptr)
throw MakeErrno("smbc_open() failed"); throw MakeErrno("smbc_open() failed");
@ -81,7 +82,7 @@ input_smbclient_open(const char *uri,
} }
return std::make_unique<MaybeBufferedInputStream> return std::make_unique<MaybeBufferedInputStream>
(std::make_unique<SmbclientInputStream>(uri, mutex, (std::make_unique<SmbclientInputStream>(std::move(uri), mutex,
std::move(ctx), std::move(ctx),
handle, st)); handle, st));
} }

View File

@ -71,7 +71,7 @@ public:
void SeekError() noexcept override {} void SeekError() noexcept override {}
//InputStreamPtr OpenUri(const char *) override; //InputStreamPtr OpenUri(std::string_view uri) override;
size_t Read(InputStream &is, size_t Read(InputStream &is,
std::span<std::byte> dest) noexcept override; std::span<std::byte> dest) noexcept override;

View File

@ -119,8 +119,7 @@ SmbclientStorage::GetInfo(std::string_view uri_utf8, [[maybe_unused]] bool follo
InputStreamPtr InputStreamPtr
SmbclientStorage::OpenFile(std::string_view uri_utf8, Mutex &file_mutex) SmbclientStorage::OpenFile(std::string_view uri_utf8, Mutex &file_mutex)
{ {
auto uri = MapUTF8(uri_utf8); return InputStream::Open(MapUTF8(uri_utf8), file_mutex);
return InputStream::Open(uri.c_str(), file_mutex);
} }
std::unique_ptr<StorageDirectoryReader> std::unique_ptr<StorageDirectoryReader>

View File

@ -54,7 +54,7 @@ DumpDecoderClient::SeekError() noexcept
} }
InputStreamPtr InputStreamPtr
DumpDecoderClient::OpenUri(const char *uri) DumpDecoderClient::OpenUri(std::string_view uri)
{ {
return InputStream::OpenReady(uri, mutex); return InputStream::OpenReady(uri, mutex);
} }

View File

@ -31,7 +31,7 @@ public:
SongTime GetSeekTime() noexcept override; SongTime GetSeekTime() noexcept override;
uint64_t GetSeekFrame() noexcept override; uint64_t GetSeekFrame() noexcept override;
void SeekError() noexcept override; void SeekError() noexcept override;
InputStreamPtr OpenUri(const char *uri) override; InputStreamPtr OpenUri(std::string_view uri) override;
size_t Read(InputStream &is, size_t Read(InputStream &is,
std::span<std::byte> dest) noexcept override; std::span<std::byte> dest) noexcept override;
void SubmitTimestamp(FloatDuration t) noexcept override; void SubmitTimestamp(FloatDuration t) noexcept override;

View File

@ -90,7 +90,7 @@ public:
class MyChromaprintDecoderClient final : public ChromaprintDecoderClient { class MyChromaprintDecoderClient final : public ChromaprintDecoderClient {
public: public:
InputStreamPtr OpenUri(const char *) override { InputStreamPtr OpenUri(std::string_view) override {
throw std::runtime_error("Not implemented"); throw std::runtime_error("Not implemented");
} }
}; };