mirror of
https://github.com/GuillemCastro/spotify-dl.git
synced 2024-11-22 02:10:26 +01:00
Added spotify URL parsing
This commit is contained in:
parent
2387c64fe6
commit
58125236e1
4 changed files with 34 additions and 7 deletions
20
Cargo.lock
generated
20
Cargo.lock
generated
|
@ -51,6 +51,15 @@ dependencies = [
|
||||||
"opaque-debug",
|
"opaque-debug",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "0.7.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "alsa"
|
name = "alsa"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
@ -1700,18 +1709,20 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.5.6"
|
version = "1.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
|
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
"regex-syntax",
|
"regex-syntax",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.26"
|
version = "0.6.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
|
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "remove_dir_all"
|
name = "remove_dir_all"
|
||||||
|
@ -1901,6 +1912,7 @@ dependencies = [
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"librespot",
|
"librespot",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
|
"regex",
|
||||||
"rpassword",
|
"rpassword",
|
||||||
"structopt",
|
"structopt",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
|
|
@ -15,6 +15,7 @@ librespot = "0.3.1"
|
||||||
tokio = { version = "1.18.2", features = ["rt"] }
|
tokio = { version = "1.18.2", features = ["rt"] }
|
||||||
flac-bound = { version = "0.2.0" }
|
flac-bound = { version = "0.2.0" }
|
||||||
audiotags = "0.2.7182"
|
audiotags = "0.2.7182"
|
||||||
|
regex = "1.7.1"
|
||||||
|
|
||||||
[package.metadata.deb]
|
[package.metadata.deb]
|
||||||
depends="libflac-dev"
|
depends="libflac-dev"
|
||||||
|
|
|
@ -32,21 +32,23 @@ spotify-dl 0.1.0
|
||||||
A commandline utility to download music directly from Spotify
|
A commandline utility to download music directly from Spotify
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
spotify-dl [OPTIONS] --username <username> [tracks]...
|
spotify-dl [FLAGS] [OPTIONS] --username <username> [tracks]...
|
||||||
|
|
||||||
FLAGS:
|
FLAGS:
|
||||||
-h, --help Prints help information
|
-h, --help Prints help information
|
||||||
|
-o, --ordered Download songs in the order they are in the playlist, prfixing the filename with the track number
|
||||||
-V, --version Prints version information
|
-V, --version Prints version information
|
||||||
|
|
||||||
OPTIONS:
|
OPTIONS:
|
||||||
-d, --destination <destination> The directory where the songs will be downloaded [default: .]
|
-d, --destination <destination> The directory where the songs will be downloaded [default: .]
|
||||||
|
-p, --password <password> Your Spotify password
|
||||||
-u, --username <username> Your Spotify username
|
-u, --username <username> Your Spotify username
|
||||||
|
|
||||||
ARGS:
|
ARGS:
|
||||||
<tracks>... A list of Spotify URIs (songs, podcasts or playlists)
|
<tracks>... A list of Spotify URIs (songs, podcasts or playlists)
|
||||||
```
|
```
|
||||||
|
|
||||||
Songs and playlists must be passed as Spotify URIs (e.g. `spotify:track:123456789abcdefghABCDEF` for songs and `spotify:playlist:123456789abcdefghABCDEF` for playlists).
|
Songs and playlists must be passed as Spotify URIs or URLs (e.g. `spotify:track:123456789abcdefghABCDEF` for songs and `spotify:playlist:123456789abcdefghABCDEF` for playlists or `https://open.spotify.com/playlist/123456789abcdefghABCDEF?si=1234567890`).
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -15,6 +15,7 @@ use librespot::playback::player::Player;
|
||||||
|
|
||||||
use librespot::metadata::{Album, Artist, Metadata, Track};
|
use librespot::metadata::{Album, Artist, Metadata, Track};
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
use indicatif::{ProgressBar, ProgressStyle};
|
use indicatif::{ProgressBar, ProgressStyle};
|
||||||
|
@ -142,7 +143,18 @@ async fn main() {
|
||||||
let mut tracks: Vec<SpotifyId> = Vec::new();
|
let mut tracks: Vec<SpotifyId> = Vec::new();
|
||||||
|
|
||||||
for track_url in opt.tracks {
|
for track_url in opt.tracks {
|
||||||
let track = SpotifyId::from_uri(track_url.as_str()).unwrap();
|
let track = SpotifyId::from_uri(track_url.as_str()).unwrap_or_else(|_| {
|
||||||
|
let regex = Regex::new(r"https://open.spotify.com/(\w+)/(.*)\?").unwrap();
|
||||||
|
|
||||||
|
let results = regex.captures(track_url.as_str()).unwrap();
|
||||||
|
let uri = format!(
|
||||||
|
"spotify:{}:{}",
|
||||||
|
results.get(1).unwrap().as_str(),
|
||||||
|
results.get(2).unwrap().as_str()
|
||||||
|
);
|
||||||
|
|
||||||
|
SpotifyId::from_uri(&uri).unwrap()
|
||||||
|
});
|
||||||
match &track.audio_type {
|
match &track.audio_type {
|
||||||
librespot::core::spotify_id::SpotifyAudioType::Track => {
|
librespot::core::spotify_id::SpotifyAudioType::Track => {
|
||||||
tracks.push(track);
|
tracks.push(track);
|
||||||
|
|
Loading…
Reference in a new issue