From 229d93330888d04299239ea2ca7a508d3405f279 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Oct 2025 07:39:59 +0200 Subject: [PATCH 1/2] feat!: fix MP4 format names --- crates/downloader/src/lib.rs | 2 +- crates/protocol/proto/media_manifest.proto | 16 ++++---- crates/protocol/proto/metadata.proto | 8 ++-- crates/spotifyio/src/util.rs | 43 ++++++++++++---------- crates/spotifyioweb/src/util.rs | 36 +++++++++--------- 5 files changed, 54 insertions(+), 51 deletions(-) diff --git a/crates/downloader/src/lib.rs b/crates/downloader/src/lib.rs index a4a1f58..4789d01 100644 --- a/crates/downloader/src/lib.rs +++ b/crates/downloader/src/lib.rs @@ -441,7 +441,7 @@ impl SpotifyDownloader { audio_item.track_id ); - let formats = &[AudioFileFormat::MP4_128]; + let formats = &[AudioFileFormat::MP4_128, AudioFileFormat::MP4_128_DUAL]; let (format, file_id) = formats .iter() diff --git a/crates/protocol/proto/media_manifest.proto b/crates/protocol/proto/media_manifest.proto index e9fe45f..8f74813 100644 --- a/crates/protocol/proto/media_manifest.proto +++ b/crates/protocol/proto/media_manifest.proto @@ -18,10 +18,10 @@ message AudioFile { MP3_160_ENC = 7; AAC_24 = 8; AAC_48 = 9; - AAC_160 = 10; - AAC_320 = 11; - MP4_128 = 12; - OTHER5 = 13; + MP4_128 = 10; + MP4_256 = 11; + MP4_128_DUAL = 12; + MP4_256_DUAL = 13; FLAC_FLAC = 16; } } @@ -29,22 +29,22 @@ message AudioFile { message File { int32 bitrate = 3; string mime_type = 4; - + oneof file { ExternalFile external_file = 1; FileIdFile file_id_file = 2; } - + message ExternalFile { string method = 1; bytes body = 4; - + oneof endpoint { string url = 2; string service = 3; } } - + message FileIdFile { string file_id_hex = 1; AudioFile.Format download_format = 2; diff --git a/crates/protocol/proto/metadata.proto b/crates/protocol/proto/metadata.proto index f3707ec..a9cddc4 100644 --- a/crates/protocol/proto/metadata.proto +++ b/crates/protocol/proto/metadata.proto @@ -292,10 +292,10 @@ message AudioFile { MP3_160_ENC = 7; AAC_24 = 8; AAC_48 = 9; - AAC_160 = 10; - AAC_320 = 11; - MP4_128 = 12; - MP4_256 = 13; + MP4_128 = 10; + MP4_256 = 11; + MP4_128_DUAL = 12; + MP4_256_DUAL = 13; FLAC_FLAC = 16; UNKNOWN_FORMAT = 255; } diff --git a/crates/spotifyio/src/util.rs b/crates/spotifyio/src/util.rs index 71d430c..c7b50c1 100644 --- a/crates/spotifyio/src/util.rs +++ b/crates/spotifyio/src/util.rs @@ -59,11 +59,11 @@ pub fn audio_format_extension(format: AudioFileFormat) -> Option<&'static str> { | AudioFileFormat::MP3_160_ENC | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 => Some(".mp3"), - AudioFileFormat::AAC_24 - | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::AAC_320 => Some(".aac"), - AudioFileFormat::MP4_128 | AudioFileFormat::MP4_256 => Some(".m4a"), + AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 => Some(".aac"), + AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL + | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL => Some(".m4a"), AudioFileFormat::FLAC_FLAC => Some(".flac"), AudioFileFormat::UNKNOWN_FORMAT => None, } @@ -79,11 +79,11 @@ pub fn audio_format_mime(format: AudioFileFormat) -> Option<&'static str> { | AudioFileFormat::MP3_160_ENC | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 => Some("audio/mp3"), - AudioFileFormat::AAC_24 - | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::AAC_320 => Some("audio/aac"), - AudioFileFormat::MP4_128 | AudioFileFormat::MP4_256 => Some("audio/mp4"), + AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 => Some("audio/aac"), + AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL + | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL => Some("audio/mp4"), AudioFileFormat::FLAC_FLAC => Some("audio/flac"), AudioFileFormat::UNKNOWN_FORMAT => None, } @@ -94,14 +94,13 @@ pub fn audio_format_bitrate(format: AudioFileFormat) -> Option { match format { AudioFileFormat::OGG_VORBIS_96 | AudioFileFormat::MP3_96 => Some(96000), AudioFileFormat::OGG_VORBIS_160 - | AudioFileFormat::AAC_160 | AudioFileFormat::MP3_160 | AudioFileFormat::MP3_160_ENC => Some(160000), - AudioFileFormat::OGG_VORBIS_320 | AudioFileFormat::AAC_320 | AudioFileFormat::MP3_320 => { - Some(320000) + AudioFileFormat::OGG_VORBIS_320 | AudioFileFormat::MP3_320 => Some(320000), + AudioFileFormat::MP4_128 | AudioFileFormat::MP4_128_DUAL => Some(128000), + AudioFileFormat::MP3_256 | AudioFileFormat::MP4_256 | AudioFileFormat::MP4_256_DUAL => { + Some(256000) } - AudioFileFormat::MP4_128 => Some(128000), - AudioFileFormat::MP3_256 | AudioFileFormat::MP4_256 => Some(256000), AudioFileFormat::AAC_24 => Some(24000), AudioFileFormat::AAC_48 => Some(48000), AudioFileFormat::FLAC_FLAC | AudioFileFormat::UNKNOWN_FORMAT => None, @@ -117,13 +116,13 @@ pub fn audio_format_available(format: AudioFileFormat, is_premium: bool) -> bool | AudioFileFormat::MP3_160_ENC | AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::MP4_128 => true, + | AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL => true, AudioFileFormat::OGG_VORBIS_320 | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 - | AudioFileFormat::AAC_320 | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL | AudioFileFormat::FLAC_FLAC => is_premium, AudioFileFormat::UNKNOWN_FORMAT => false, } @@ -131,5 +130,11 @@ pub fn audio_format_available(format: AudioFileFormat, is_premium: bool) -> bool /// Return true if the audio format uses Widevine pub fn audio_format_widevine(format: AudioFileFormat) -> bool { - matches!(format, AudioFileFormat::MP4_128 | AudioFileFormat::MP4_256) + matches!( + format, + AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL + | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL + ) } diff --git a/crates/spotifyioweb/src/util.rs b/crates/spotifyioweb/src/util.rs index b8c234d..2437ec5 100644 --- a/crates/spotifyioweb/src/util.rs +++ b/crates/spotifyioweb/src/util.rs @@ -28,11 +28,11 @@ pub fn audio_format_extension(format: AudioFileFormat) -> Option<&'static str> { | AudioFileFormat::MP3_160_ENC | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 => Some(".mp3"), - AudioFileFormat::AAC_24 - | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::AAC_320 => Some(".aac"), - AudioFileFormat::MP4_128 | AudioFileFormat::MP4_256 => Some(".m4a"), + AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 => Some(".aac"), + AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL + | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL => Some(".m4a"), AudioFileFormat::FLAC_FLAC => Some(".flac"), AudioFileFormat::UNKNOWN_FORMAT => None, } @@ -48,11 +48,11 @@ pub fn audio_format_mime(format: AudioFileFormat) -> Option<&'static str> { | AudioFileFormat::MP3_160_ENC | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 => Some("audio/mp3"), - AudioFileFormat::AAC_24 - | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::AAC_320 => Some("audio/aac"), - AudioFileFormat::MP4_128 | AudioFileFormat::MP4_256 => Some("audio/mp4"), + AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 => Some("audio/aac"), + AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL + | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL => Some("audio/mp4"), AudioFileFormat::FLAC_FLAC => Some("audio/flac"), AudioFileFormat::UNKNOWN_FORMAT => None, } @@ -66,8 +66,8 @@ pub fn audio_format_bitrate(format: AudioFileFormat) -> Option { | AudioFileFormat::MP3_160 | AudioFileFormat::MP3_160_ENC => Some(160000), AudioFileFormat::OGG_VORBIS_320 | AudioFileFormat::MP3_320 => Some(320000), - AudioFileFormat::MP4_128 | AudioFileFormat::AAC_160 => Some(128000), - AudioFileFormat::MP3_256 | AudioFileFormat::MP4_256 | AudioFileFormat::AAC_320 => { + AudioFileFormat::MP4_128 | AudioFileFormat::MP4_128_DUAL => Some(128000), + AudioFileFormat::MP3_256 | AudioFileFormat::MP4_256 | AudioFileFormat::MP4_256_DUAL => { Some(256000) } AudioFileFormat::AAC_24 => Some(24000), @@ -85,13 +85,13 @@ pub fn audio_format_available(format: AudioFileFormat, is_premium: bool) -> bool | AudioFileFormat::MP3_160_ENC | AudioFileFormat::AAC_24 | AudioFileFormat::AAC_48 - | AudioFileFormat::AAC_160 - | AudioFileFormat::MP4_128 => true, + | AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL => true, AudioFileFormat::OGG_VORBIS_320 | AudioFileFormat::MP3_256 | AudioFileFormat::MP3_320 - | AudioFileFormat::AAC_320 | AudioFileFormat::MP4_256 + | AudioFileFormat::MP4_256_DUAL | AudioFileFormat::FLAC_FLAC => is_premium, AudioFileFormat::UNKNOWN_FORMAT => false, } @@ -102,10 +102,8 @@ pub fn audio_format_widevine(format: AudioFileFormat) -> bool { matches!( format, AudioFileFormat::MP4_128 + | AudioFileFormat::MP4_128_DUAL | AudioFileFormat::MP4_256 - | AudioFileFormat::AAC_160 - | AudioFileFormat::AAC_320 - | AudioFileFormat::AAC_24 - | AudioFileFormat::AAC_48 + | AudioFileFormat::MP4_256_DUAL ) } From 4c37c102cfdd20bc7f35a893f0a6d08b5395b0c8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Oct 2025 07:41:13 +0200 Subject: [PATCH 2/2] update spotifyio-downloader to v0.6.0 --- crates/downloader/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/downloader/Cargo.toml b/crates/downloader/Cargo.toml index 9fef250..759818a 100644 --- a/crates/downloader/Cargo.toml +++ b/crates/downloader/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "spotifyio-downloader" description = "CLI for downloading music from Spotify" -version = "0.5.1" +version = "0.6.0" edition.workspace = true authors.workspace = true license.workspace = true