diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c57d6e1..de74be3 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3121,7 +3121,7 @@ dependencies = [ "sea-orm", "serde", "serde_json", - "symphonia", + "symphonia 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", "tauri", "tauri-build", "tauri-plugin-decorum", @@ -3280,6 +3280,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -4342,6 +4351,12 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.6.29" @@ -4477,7 +4492,7 @@ dependencies = [ "cpal", "hound", "lewton", - "symphonia", + "symphonia 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5500,20 +5515,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" dependencies = [ "lazy_static", - "symphonia-bundle-flac", - "symphonia-bundle-mp3", - "symphonia-codec-aac", - "symphonia-codec-adpcm", + "symphonia-bundle-flac 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-bundle-mp3 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-codec-aac 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-codec-adpcm 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-codec-pcm 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-codec-vorbis 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-format-isomp4 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-format-riff 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-bundle-mp3 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-codec-aac 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-codec-adpcm 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", "symphonia-codec-alac", - "symphonia-codec-pcm", - "symphonia-codec-vorbis", - "symphonia-core", + "symphonia-codec-pcm 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-codec-vorbis 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", "symphonia-format-caf", - "symphonia-format-isomp4", + "symphonia-format-isomp4 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", "symphonia-format-mkv", "symphonia-format-ogg", - "symphonia-format-riff", - "symphonia-metadata", + "symphonia-format-riff 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5523,11 +5556,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "symphonia-utils-xiph", ] +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "log", + "symphonia-common", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", +] + [[package]] name = "symphonia-bundle-mp3" version = "0.5.4" @@ -5536,8 +5580,18 @@ checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" dependencies = [ "lazy_static", "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "lazy_static", + "log", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5548,7 +5602,17 @@ checksum = "cdbf25b545ad0d3ee3e891ea643ad115aff4ca92f6aec472086b957a58522f70" dependencies = [ "lazy_static", "log", - "symphonia-core", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-codec-aac" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "lazy_static", + "log", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5558,17 +5622,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-codec-adpcm" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "log", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] name = "symphonia-codec-alac" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8a6666649a08412906476a8b0efd9b9733e241180189e9f92b09c08d0e38f3" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5578,7 +5650,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "log", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5588,10 +5669,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "symphonia-utils-xiph", ] +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "log", + "symphonia-common", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", +] + +[[package]] +name = "symphonia-common" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", +] + [[package]] name = "symphonia-core" version = "0.5.4" @@ -5605,15 +5705,26 @@ dependencies = [ "log", ] +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "bitflags 2.6.0", + "bytemuck", + "lazy_static", + "log", + "num-complex", + "smallvec", +] + [[package]] name = "symphonia-format-caf" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43c99c696a388295a29fe71b133079f5d8b18041cf734c5459c35ad9097af50" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5624,34 +5735,42 @@ checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" dependencies = [ "encoding_rs", "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "symphonia-utils-xiph", ] +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "log", + "symphonia-common", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", +] + [[package]] name = "symphonia-format-mkv" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb43471a100f7882dc9937395bd5ebee8329298e766250b15b3875652fe3d6f" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" dependencies = [ "lazy_static", "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-common", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] name = "symphonia-format-ogg" version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-common", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5662,8 +5781,19 @@ checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" dependencies = [ "extended", "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "extended", + "log", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", + "symphonia-metadata 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5675,7 +5805,19 @@ dependencies = [ "encoding_rs", "lazy_static", "log", - "symphonia-core", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6#25aadc9f8739f31258a18fd78a69aa64884bdf62" +dependencies = [ + "lazy_static", + "log", + "regex-lite", + "smallvec", + "symphonia-core 0.5.4 (git+https://github.com/pdeljanov/Symphonia.git?branch=dev-0.6)", ] [[package]] @@ -5684,8 +5826,8 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" dependencies = [ - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "symphonia-metadata 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d505821..26e6cdc 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -26,7 +26,7 @@ tauri = { version = "2.1.1", features = [] } tauri-plugin-opener = "2.2.1" serde = { version = "1.0.216", features = ["derive"] } serde_json = "1.0.133" -symphonia = { version = "0.5.4", features = ["all"] } +symphonia = { git = "https://github.com/pdeljanov/Symphonia.git", branch = "dev-0.6", features = ["all"] } tauri-plugin-dialog = "2.2.0" rodio = {version = "0.20.1", features = ["symphonia-all"] } window-vibrancy = "0.5.2" diff --git a/src-tauri/src/music/core.rs b/src-tauri/src/music/core.rs index 4e5c218..9712468 100644 --- a/src-tauri/src/music/core.rs +++ b/src-tauri/src/music/core.rs @@ -9,10 +9,178 @@ use std::fs::File; use std::io::BufReader; use std::path::Path; use std::time::Duration; +use symphonia::core::formats::probe::Hint; use symphonia::core::formats::FormatOptions; use symphonia::core::io::MediaSourceStream; -use symphonia::core::meta::MetadataOptions; -use symphonia::core::probe::Hint; +use symphonia::core::meta::{MetadataOptions, StandardTag}; + +/** + * This code may seem bad. It is. + * + * But also, I have no idea how to dynamically generate the keys for the tags in a safe way, + * as I don't currently believe Rust supports this. If it does 🤷?? + */ +fn get_keys_for_standard_tag(tag: StandardTag) -> String { + match tag { + StandardTag::AccurateRipCount(_) => "AccurateRipCount", + StandardTag::AccurateRipCountAllOffsets(_) => "AccurateRipCountAllOffsets", + StandardTag::AccurateRipCountWithOffset(_) => "AccurateRipCountWithOffset", + StandardTag::AccurateRipCrc(_) => "AccurateRipCrc", + StandardTag::AccurateRipDiscId(_) => "AccurateRipDiscId", + StandardTag::AccurateRipId(_) => "AccurateRipId", + StandardTag::AccurateRipOffset(_) => "AccurateRipOffset", + StandardTag::AccurateRipResult(_) => "AccurateRipResult", + StandardTag::AccurateRipTotal(_) => "AccurateRipTotal", + StandardTag::AcoustIdFingerprint(_) => "AcoustIdFingerprint", + StandardTag::AcoustIdId(_) => "AcoustIdId", + StandardTag::Album(_) => "Album", + StandardTag::AlbumArtist(_) => "AlbumArtist", + StandardTag::Arranger(_) => "Arranger", + StandardTag::Artist(_) => "Artist", + StandardTag::Author(_) => "Author", + StandardTag::Bpm(_) => "Bpm", + StandardTag::CdToc(_) => "CdToc", + StandardTag::Comment(_) => "Comment", + StandardTag::CompilationFlag(_) => "CompilationFlag", + StandardTag::Composer(_) => "Composer", + StandardTag::Conductor(_) => "Conductor", + StandardTag::ContentAdvisory(_) => "ContentAdvisory", + StandardTag::Copyright(_) => "Copyright", + StandardTag::CueToolsDbDiscConfidence(_) => "CueToolsDbDiscConfidence", + StandardTag::CueToolsDbTrackConfidence(_) => "CueToolsDbTrackConfidence", + StandardTag::Date(_) => "Date", + StandardTag::Description(_) => "Description", + StandardTag::DiscNumber(_) => "DiscNumber", + StandardTag::DiscSubtitle(_) => "DiscSubtitle", + StandardTag::DiscTotal(_) => "DiscTotal", + StandardTag::EncodedBy(_) => "EncodedBy", + StandardTag::Encoder(_) => "Encoder", + StandardTag::EncoderSettings(_) => "EncoderSettings", + StandardTag::EncodingDate(_) => "EncodingDate", + StandardTag::Engineer(_) => "Engineer", + StandardTag::Ensemble(_) => "Ensemble", + StandardTag::Genre(_) => "Genre", + StandardTag::Grouping(_) => "Grouping", + StandardTag::IdentAsin(_) => "IdentAsin", + StandardTag::IdentBarcode(_) => "IdentBarcode", + StandardTag::IdentCatalogNumber(_) => "IdentCatalogNumber", + StandardTag::IdentEanUpn(_) => "IdentEanUpn", + StandardTag::IdentIsbn(_) => "IdentIsbn", + StandardTag::IdentIsrc(_) => "IdentIsrc", + StandardTag::IdentPn(_) => "IdentPn", + StandardTag::IdentPodcast(_) => "IdentPodcast", + StandardTag::IdentUpc(_) => "IdentUpc", + StandardTag::IndexNumber(_) => "IndexNumber", + StandardTag::InitialKey(_) => "InitialKey", + StandardTag::InternetRadioName(_) => "InternetRadioName", + StandardTag::InternetRadioOwner(_) => "InternetRadioOwner", + StandardTag::Label(_) => "Label", + StandardTag::LabelCode(_) => "LabelCode", + StandardTag::Language(_) => "Language", + StandardTag::License(_) => "License", + StandardTag::Lyricist(_) => "Lyricist", + StandardTag::Lyrics(_) => "Lyrics", + StandardTag::MediaFormat(_) => "MediaFormat", + StandardTag::MixDj(_) => "MixDj", + StandardTag::MixEngineer(_) => "MixEngineer", + StandardTag::Mood(_) => "Mood", + StandardTag::MovementName(_) => "MovementName", + StandardTag::MovementNumber(_) => "MovementNumber", + StandardTag::MovementTotal(_) => "MovementTotal", + StandardTag::Mp3GainAlbumMinMax(_) => "Mp3GainAlbumMinMax", + StandardTag::Mp3GainMinMax(_) => "Mp3GainMinMax", + StandardTag::Mp3GainUndo(_) => "Mp3GainUndo", + StandardTag::MusicBrainzAlbumArtistId(_) => "MusicBrainzAlbumArtistId", + StandardTag::MusicBrainzAlbumId(_) => "MusicBrainzAlbumId", + StandardTag::MusicBrainzArtistId(_) => "MusicBrainzArtistId", + StandardTag::MusicBrainzDiscId(_) => "MusicBrainzDiscId", + StandardTag::MusicBrainzGenreId(_) => "MusicBrainzGenreId", + StandardTag::MusicBrainzLabelId(_) => "MusicBrainzLabelId", + StandardTag::MusicBrainzOriginalAlbumId(_) => "MusicBrainzOriginalAlbumId", + StandardTag::MusicBrainzOriginalArtistId(_) => "MusicBrainzOriginalArtistId", + StandardTag::MusicBrainzRecordingId(_) => "MusicBrainzRecordingId", + StandardTag::MusicBrainzReleaseGroupId(_) => "MusicBrainzReleaseGroupId", + StandardTag::MusicBrainzReleaseStatus(_) => "MusicBrainzReleaseStatus", + StandardTag::MusicBrainzReleaseTrackId(_) => "MusicBrainzReleaseTrackId", + StandardTag::MusicBrainzReleaseType(_) => "MusicBrainzReleaseType", + StandardTag::MusicBrainzTrackId(_) => "MusicBrainzTrackId", + StandardTag::MusicBrainzTrmId(_) => "MusicBrainzTrmId", + StandardTag::MusicBrainzWorkId(_) => "MusicBrainzWorkId", + StandardTag::Narrator(_) => "Narrator", + StandardTag::Opus(_) => "Opus", + StandardTag::OriginalAlbum(_) => "OriginalAlbum", + StandardTag::OriginalArtist(_) => "OriginalArtist", + StandardTag::OriginalDate(_) => "OriginalDate", + StandardTag::OriginalFile(_) => "OriginalFile", + StandardTag::OriginalLyricist(_) => "OriginalLyricist", + StandardTag::OriginalWriter(_) => "OriginalWriter", + StandardTag::OriginalYear(_) => "OriginalYear", + StandardTag::Owner(_) => "Owner", + StandardTag::Part(_) => "Part", + StandardTag::PartNumber(_) => "PartNumber", + StandardTag::PartTotal(_) => "PartTotal", + StandardTag::Performer(_) => "Performer", + StandardTag::PlayCounter(_) => "PlayCounter", + StandardTag::PodcastCategory(_) => "PodcastCategory", + StandardTag::PodcastDescription(_) => "PodcastDescription", + StandardTag::PodcastFlag(_) => "PodcastFlag", + StandardTag::PodcastKeywords(_) => "PodcastKeywords", + StandardTag::Producer(_) => "Producer", + StandardTag::ProductionCopyright(_) => "ProductionCopyright", + StandardTag::PurchaseDate(_) => "PurchaseDate", + StandardTag::Rating(_) => "Rating", + StandardTag::RecordingDate(_) => "RecordingDate", + StandardTag::RecordingLocation(_) => "RecordingLocation", + StandardTag::RecordingTime(_) => "RecordingTime", + StandardTag::ReleaseCountry(_) => "ReleaseCountry", + StandardTag::ReleaseDate(_) => "ReleaseDate", + StandardTag::Remixer(_) => "Remixer", + StandardTag::ReplayGainAlbumGain(_) => "ReplayGainAlbumGain", + StandardTag::ReplayGainAlbumPeak(_) => "ReplayGainAlbumPeak", + StandardTag::ReplayGainAlbumRange(_) => "ReplayGainAlbumRange", + StandardTag::ReplayGainReferenceLoudness(_) => "ReplayGainReferenceLoudness", + StandardTag::ReplayGainTrackGain(_) => "ReplayGainTrackGain", + StandardTag::ReplayGainTrackPeak(_) => "ReplayGainTrackPeak", + StandardTag::ReplayGainTrackRange(_) => "ReplayGainTrackRange", + StandardTag::Script(_) => "Script", + StandardTag::Soloist(_) => "Soloist", + StandardTag::SortAlbum(_) => "SortAlbum", + StandardTag::SortAlbumArtist(_) => "SortAlbumArtist", + StandardTag::SortArtist(_) => "SortArtist", + StandardTag::SortComposer(_) => "SortComposer", + StandardTag::SortTrackTitle(_) => "SortTrackTitle", + StandardTag::SortTvShowTitle(_) => "SortTvShowTitle", + StandardTag::TaggingDate(_) => "TaggingDate", + StandardTag::TermsOfUse(_) => "TermsOfUse", + StandardTag::TrackNumber(_) => "TrackNumber", + StandardTag::TrackSubtitle(_) => "TrackSubtitle", + StandardTag::TrackTitle(_) => "TrackTitle", + StandardTag::TrackTotal(_) => "TrackTotal", + StandardTag::TvEpisode(_) => "TvEpisode", + StandardTag::TvEpisodeTitle(_) => "TvEpisodeTitle", + StandardTag::TvNetwork(_) => "TvNetwork", + StandardTag::TvSeason(_) => "TvSeason", + StandardTag::TvShowTitle(_) => "TvShowTitle", + StandardTag::Url(_) => "Url", + StandardTag::UrlArtist(_) => "UrlArtist", + StandardTag::UrlCopyright(_) => "UrlCopyright", + StandardTag::UrlInternetRadio(_) => "UrlInternetRadio", + StandardTag::UrlLabel(_) => "UrlLabel", + StandardTag::UrlOfficial(_) => "UrlOfficial", + StandardTag::UrlPayment(_) => "UrlPayment", + StandardTag::UrlPodcast(_) => "UrlPodcast", + StandardTag::UrlPurchase(_) => "UrlPurchase", + StandardTag::UrlSource(_) => "UrlSource", + StandardTag::Version(_) => "Version", + StandardTag::Work(_) => "Work", + StandardTag::Writer(_) => "Writer", + _ => { + // Twitch said that the previous placeholder would get me in trouble for royalties, this should totally solve that :) + panic!("AT THE DISCOGRAPHY OF MY FAVORITE ARTIST"); + } + } + .to_string() +} #[derive(Serialize)] pub struct PlayerState { @@ -34,10 +202,10 @@ pub async fn import_file(app_data: &AppData, path: &str) -> Result<(), String> { path: Set(path.parse().unwrap()), ..Default::default() } - .save(&app_data.db) - .await - .map(|_| ()) - .map_err(|e| e.to_string()) + .save(&app_data.db) + .await + .map(|_| ()) + .map_err(|e| e.to_string()) } pub fn read_metadata(path: &str) -> Result { @@ -47,27 +215,25 @@ pub fn read_metadata(path: &str) -> Result { let mss = MediaSourceStream::new(Box::new(src), Default::default()); let mut hint = Hint::new(); + hint.with_extension( + path.extension() + .and_then(|ext| ext.to_str()) + .unwrap_or_default(), + ); let meta_opts: MetadataOptions = Default::default(); let fmt_opts: FormatOptions = Default::default(); let mut probed = symphonia::default::get_probe() - .format(&hint, mss, &fmt_opts, &meta_opts) + .probe(&hint, mss, fmt_opts, meta_opts) .expect("unsupported format"); - let revision = probed - .metadata - .get() - .and_then(|mut metadata| metadata.skip_to_latest().cloned()) - .map(|meta_revision| meta_revision.clone()); + let mut metadata = probed.metadata(); + let revision = metadata.skip_to_latest(); - let tags = revision - .as_ref() - .map(|revision| revision.tags()); - - let visuals = revision - .as_ref() - .map(|revision| revision.visuals()); + let tags = revision.as_ref().map(|revision| revision.tags()); + + let visuals = revision.as_ref().map(|revision| revision.visuals()); let mut tag_map = serde_json::Map::new(); let mut visual_map = serde_json::Map::new(); @@ -77,31 +243,35 @@ pub fn read_metadata(path: &str) -> Result { // Process tags for tag in tags { let key = tag - .std_key - .map(|k| format!("{:?}", k)) - .unwrap_or_else(|| tag.key.to_string()); - tag_map.insert(key, serde_json::Value::String(tag.value.to_string())); + .clone() + .std + .map(|std_tag| get_keys_for_standard_tag(std_tag)) + .unwrap_or_else(|| tag.clone().raw.key.to_string()); + let value = tag.clone().raw.value.to_string(); + + tag_map.insert(key, serde_json::Value::String(value)); } // Process visuals for (index, visual) in visuals.iter().enumerate() { let base64_data = BASE64.encode(&visual.data); - let data_url = format!("url(data:{};base64,{})", visual.media_type, base64_data); + let media_type = visual.media_type.clone().unwrap_or("image/png".to_string()); + let data_url = format!("url(data:{};base64,{})", media_type, base64_data); visual_map.insert( format!("visual_{}", index), serde_json::json!({ - "media_type": visual.media_type.to_string(), - "dimensions": format!("{}x{}", visual.dimensions.map_or(0, |d| d.width), visual.dimensions.map_or(0, |d| d.height)), - "data": data_url, - "tags": visual.tags.iter().map(|tag| { - let key = tag - .std_key - .map(|k| format!("{:?}", k)) - .unwrap_or_else(|| tag.key.to_string()); - (key, serde_json::Value::String(tag.value.to_string())) - }).collect::>() - }) + "media_type": media_type, + "dimensions": format!("{}x{}", visual.dimensions.map_or(0, |d| d.width), visual.dimensions.map_or(0, |d| d.height)), + "data": data_url, + "tags": visual.tags.iter().map(|tag| { + let key = + tag.clone().std.map(|std_tag| get_keys_for_standard_tag(std_tag)).unwrap_or_else(|| tag.clone().raw.key.to_string()); + let value = tag.clone().raw.value.to_string(); + + (key, serde_json::Value::String(value)) + }).collect::>() + }), ); } diff --git a/src/app/views/home.component.ts b/src/app/views/home.component.ts index 2e9e496..2e5bded 100644 --- a/src/app/views/home.component.ts +++ b/src/app/views/home.component.ts @@ -12,23 +12,23 @@ import { SongMetadata } from '../types/song-metadata'; selector: 'app-home', imports: [JsonPipe], template: ` - @if (!openFileMutataion.data()) { - + @if (!openFileMutation.data()) { + } - @if (openFileMutataion.isError()) { -
Error: {{ openFileMutataion.error | json }}
+ @if (openFileMutation.isError()) { +
Error: {{ openFileMutation.error | json }}
} @if (mp3Metadata.isError()) {
Error: {{ mp3Metadata.error | json }}
} - @if (openFileMutataion.isPending()) { + @if (openFileMutation.isPending()) {
Loading...
} @if (mp3Metadata.isLoading()) {
Loading song metadata...
} - @if (openFileMutataion.data() && openFileMutataion.isSuccess() && mp3Metadata.isSuccess()) { + @if (openFileMutation.data() && openFileMutation.isSuccess() && mp3Metadata.isSuccess()) { @if (mp3CoverImage()) {
@@ -60,7 +60,7 @@ import { SongMetadata } from '../types/song-metadata'; export class Home { stateMetadata = injectSelector((state: RootState) => state.tauri); - openFileMutataion = injectMutation(() => ({ + openFileMutation = injectMutation(() => ({ mutationKey: ['openFile'], mutationFn: async () => { const result = await open({ @@ -81,12 +81,12 @@ export class Home { }) mp3Metadata = injectQuery(() => ({ - queryKey: ['mp3Metadata', this.openFileMutataion.data()], + queryKey: ['mp3Metadata', this.openFileMutation.data()], queryFn: async () => { - const path = this.openFileMutataion.data(); + const path = this.openFileMutation.data(); if (!path) return null; // TODO: Move invoke to a service - return invoke("read_metadata", { path }); + return await invoke("read_metadata", { path }); } })); @@ -101,7 +101,7 @@ export class Home { play() { invoke("play", { - path: this.openFileMutataion.data() + path: this.openFileMutation.data() }); }