From 66a25e62f2ada041a343c4c649807835dbfddbfd Mon Sep 17 00:00:00 2001 From: EinTim23 Date: Sat, 10 May 2025 22:13:36 +0200 Subject: [PATCH] add proper exception handling to winrt --- src/backends/windows.cpp | 89 +++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/src/backends/windows.cpp b/src/backends/windows.cpp index 51f0c6c..5ed3f6c 100644 --- a/src/backends/windows.cpp +++ b/src/backends/windows.cpp @@ -92,50 +92,55 @@ std::shared_ptr backend::getMediaInformation() { return nullptr; auto playbackInfo = currentSession.GetPlaybackInfo(); - auto mediaProperties = currentSession.TryGetMediaPropertiesAsync().get(); - auto timelineInformation = currentSession.GetTimelineProperties(); - if (!mediaProperties) + try { + auto mediaProperties = currentSession.TryGetMediaPropertiesAsync().get(); + auto timelineInformation = currentSession.GetTimelineProperties(); + if (!mediaProperties) + return nullptr; + + auto endTime = std::chrono::duration_cast(timelineInformation.EndTime()).count(); + auto elapsedTime = + std::chrono::duration_cast(timelineInformation.Position()).count(); + + auto thumbnail = mediaProperties.Thumbnail(); + std::string thumbnailData = ""; + + if (thumbnail) { + auto stream = thumbnail.OpenReadAsync().get(); + size_t size = static_cast(stream.Size()); + + DataReader reader(stream); + reader.LoadAsync(static_cast(size)).get(); + + std::vector buffer(size); + reader.ReadBytes(buffer); + reader.Close(); + + thumbnailData = std::string(buffer.begin(), buffer.end()); + stream.Close(); + } + + std::string artist = toStdString(mediaProperties.Artist()); + std::string albumName = toStdString(mediaProperties.AlbumTitle()); + if (artist == "") + artist = toStdString(mediaProperties.AlbumArtist()); // Needed for some apps + + if (artist.find(EM_DASH) != std::string::npos) { + albumName = artist.substr(artist.find(EM_DASH) + 3); + artist = artist.substr(0, artist.find(EM_DASH)); + utils::trim(artist); + utils::trim(albumName); + } + + std::string modelId = toStdString(currentSession.SourceAppUserModelId()); + + return std::make_shared( + playbackInfo.PlaybackStatus() == GlobalSystemMediaTransportControlsSessionPlaybackStatus::Paused, + toStdString(mediaProperties.Title()), std::move(artist), std::move(albumName), std::move(modelId), + std::move(thumbnailData), endTime, elapsedTime); + } catch (...) { return nullptr; - - auto endTime = std::chrono::duration_cast(timelineInformation.EndTime()).count(); - auto elapsedTime = std::chrono::duration_cast(timelineInformation.Position()).count(); - - auto thumbnail = mediaProperties.Thumbnail(); - std::string thumbnailData = ""; - - if (thumbnail) { - auto stream = thumbnail.OpenReadAsync().get(); - size_t size = static_cast(stream.Size()); - - DataReader reader(stream); - reader.LoadAsync(static_cast(size)).get(); - - std::vector buffer(size); - reader.ReadBytes(buffer); - reader.Close(); - - thumbnailData = std::string(buffer.begin(), buffer.end()); - stream.Close(); } - - std::string artist = toStdString(mediaProperties.Artist()); - std::string albumName = toStdString(mediaProperties.AlbumTitle()); - if (artist == "") - artist = toStdString(mediaProperties.AlbumArtist()); // Needed for some apps - - if (artist.find(EM_DASH) != std::string::npos) { - albumName = artist.substr(artist.find(EM_DASH) + 3); - artist = artist.substr(0, artist.find(EM_DASH)); - utils::trim(artist); - utils::trim(albumName); - } - - std::string modelId = toStdString(currentSession.SourceAppUserModelId()); - - return std::make_shared( - playbackInfo.PlaybackStatus() == GlobalSystemMediaTransportControlsSessionPlaybackStatus::Paused, - toStdString(mediaProperties.Title()), std::move(artist), std::move(albumName), std::move(modelId), - std::move(thumbnailData), endTime, elapsedTime); } bool backend::init() {