asd
This commit is contained in:
parent
e05b00609c
commit
0ea98848e5
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
/out
|
/out
|
||||||
/music_mgr/target
|
/music_mgr/target
|
||||||
/.venv
|
/.venv
|
||||||
|
/config.json
|
|
@ -1,13 +1,8 @@
|
||||||
{
|
{
|
||||||
"ytdlp": {
|
"ytdlp": {
|
||||||
"path": "/usr/bin/yt-dlp",
|
"path": "C:\\bin\\yt-dlp.exe"
|
||||||
"is_python": false
|
|
||||||
},
|
},
|
||||||
"spotdl": {
|
"spotdl": {
|
||||||
"path": "/home/mcorange/.local/bin/spotdl",
|
"path": "UNUSED"
|
||||||
"is_python": false
|
|
||||||
},
|
|
||||||
"python": {
|
|
||||||
"path": ""
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -430,7 +430,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Nicolas Julian - Applause",
|
"name": "Nicolas Julian - Applause",
|
||||||
"url": "https://www.youtube.com/watch?v=-pXlrWVICAE"
|
"url": "https://www.youtube.com/watch?v=9qHLELnq1B0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "08 Blumchen - Blaue Augen",
|
"name": "08 Blumchen - Blaue Augen",
|
||||||
|
|
145
music_mgr/manifest.json
Normal file
145
music_mgr/manifest.json
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
{
|
||||||
|
"format": "m4a",
|
||||||
|
"genres": {
|
||||||
|
"pop": [
|
||||||
|
{"name": "Green Day - Basket Case", "url": "https://www.youtube.com/watch?v=wZ8eZRxFA-0"},
|
||||||
|
{"name": "Icona Pop - I Love It", "url": "https://www.youtube.com/watch?v=UxxajLWwzqY"}
|
||||||
|
],
|
||||||
|
"hip-hop": [
|
||||||
|
{"name": "Afroman - Because I Got High", "url": "https://www.youtube.com/watch?v=WeYsTmIzjkw"}
|
||||||
|
],
|
||||||
|
"rave": [
|
||||||
|
{"name": "EVERYTHING WHAT", "url": "https://www.youtube.com/watch?v=Gjdsq4kc5cA"},
|
||||||
|
{"name": "Tricky Disco", "url": "https://www.youtube.com/watch?v=t78qVdbAiXw"},
|
||||||
|
{"name": "DR. VODKA - Tricky Disco", "url": "https://www.youtube.com/watch?v=IknAUhl3i2o"}
|
||||||
|
],
|
||||||
|
"techno": [
|
||||||
|
{"name": "Dance For Me", "url": "https://www.youtube.com/watch?v=5DTSvGO_944"},
|
||||||
|
{"name": "Give It To Me", "url": "https://www.youtube.com/watch?v=upQe8EeSyZU"},
|
||||||
|
{"name": "Empire Of The Sun, southstar - We Are The People", "url": "https://www.youtube.com/watch?v=qguEGR5BK2k"},
|
||||||
|
{"name": "Beggin' (Techno)", "url": "https://www.youtube.com/watch?v=tXPs1FwW6lk"},
|
||||||
|
{"name": "Lily Allen - Not Fair", "url": "https://www.youtube.com/watch?v=WON_YIbeLis"},
|
||||||
|
{"name": "I WAS MADE FOR LOVIN' YOU (TECHNO)", "url": "https://www.youtube.com/watch?v=asVznhccYao"},
|
||||||
|
{"name": "Nicolas Julian - Applause", "url": "https://www.youtube.com/watch?v=-pXlrWVICAE"},
|
||||||
|
{"name": "08 Blumchen - Blaue Augen", "url": "https://www.youtube.com/watch?v=mE4PZcUfiwE"},
|
||||||
|
{"name": "MUTA - Party maker", "url": "https://www.youtube.com/watch?v=LT9VNK1aCXY"}
|
||||||
|
],
|
||||||
|
"electronic": [
|
||||||
|
{"name": "Zombie Nation - Kernkraft 400", "url": "https://www.youtube.com/watch?v=z5LW07FTJbI"},
|
||||||
|
{"name": "Benny Benassi - Satisfaction", "url": "https://www.youtube.com/watch?v=a0fkNdPiIL4"}
|
||||||
|
|
||||||
|
],
|
||||||
|
"rock": [
|
||||||
|
{"name": "Black Sabbath", "url": "https://www.youtube.com/watch?v=BOTIIw76qiE"}
|
||||||
|
],
|
||||||
|
"house": [
|
||||||
|
{"name": "Ralph Castelli - Morning Sex (Mochakk Remix)", "url": "https://www.youtube.com/watch?v=6bCwJ_TIDG4"},
|
||||||
|
{"name": "Billie Eilish - Bossa Nova (Lewii Edit)", "url": "https://www.youtube.com/watch?v=gNawHj2NCxA"},
|
||||||
|
{"name": "Fidde - I Only See Things I Dont Have", "url": "https://www.youtube.com/watch?v=vX_Ye_ZzI-Y"},
|
||||||
|
{"name": "Bauhouse - After Marvins Dance (Marvin Gaye's 'After The Dance' Edit)", "url": "https://www.youtube.com/watch?v=J-cgyYiExh8"},
|
||||||
|
{"name": "Men I Trust - Tailwhip (Lewii Edit)", "url": "https://www.youtube.com/watch?v=XhyM-JUWwWQ"},
|
||||||
|
{"name": "Sweely - Le Son Dancefloor", "url": "https://www.youtube.com/watch?v=5uEvZgmoG6Y"},
|
||||||
|
{"name": "THEOS - Rhodes Trip", "url": "https://www.youtube.com/watch?v=m7guRO0Uz_c"},
|
||||||
|
{"name": "Baltra - Tears Drop", "url": "https://www.youtube.com/watch?v=EXXMtKPfuzY"},
|
||||||
|
{"name": "Fidde - If Theres A Heaven I Wanna See It", "url": "https://www.youtube.com/watch?v=l2Nw7cIh7qg"},
|
||||||
|
{"name": "Unknown Artist - Kcik 23", "url": "https://www.youtube.com/watch?v=SnnqDdZJpzA"}
|
||||||
|
],
|
||||||
|
"lietuviskos": [
|
||||||
|
{"name": "Adomas Vysniauskas - As Judu", "url": "https://www.youtube.com/watch?v=dMm16TzZrjg"},
|
||||||
|
{"name": "RADVIS - KINO FILMAI", "url": "https://www.youtube.com/watch?v=vhAEkC3xNMo"},
|
||||||
|
{"name": "16Hz - Autostrada Vilnius - Kaunas", "url": "https://www.youtube.com/watch?v=ANS2TSegr40"},
|
||||||
|
{"name": "Zas - Zalias Pasas", "url": "https://www.youtube.com/watch?v=SZA7IjlCfyI"},
|
||||||
|
{"name": "Dzordana Butkute - Nebenoriu Laukt", "url": "https://www.youtube.com/watch?v=_AozFrAqNMk"},
|
||||||
|
{"name": "Juodas Garvezys (Remix)", "url": "https://www.youtube.com/watch?v=D-7qQbXHSAw"},
|
||||||
|
{"name": "morre - Kaip Diena", "url": "https://www.youtube.com/watch?v=6LDgLWCQSSM"},
|
||||||
|
{"name": "MC ENDRAY - AUDI", "url": "https://www.youtube.com/watch?v=oIjNoMGEuRg"},
|
||||||
|
{"name": "Mercy Dance - I Pajuri", "url": "https://www.youtube.com/watch?v=RPpkMh47l9w"},
|
||||||
|
{"name": "NL - Pasitusinam", "url": "https://www.youtube.com/watch?v=WhSFudvloog"},
|
||||||
|
{"name": "SixthBoi - Nevaidink", "url": "https://www.youtube.com/watch?v=nOTNnnrqTII"},
|
||||||
|
{"name": "Mr.Bullet - UZ MUS IR JUS", "url": "https://www.youtube.com/watch?v=85q_7jXEgH8"},
|
||||||
|
{"name": "Jovani, Karaliska Erdve - Is Leto Leidziasi Saule", "url": "https://www.youtube.com/watch?v=VqSu8iG1_DE"},
|
||||||
|
{"name": "Rondo - Margarita", "url": "https://www.youtube.com/watch?v=rF4w-Rxsiv4"},
|
||||||
|
{"name": "Radvis - TU ESI MELAGIS (Techno Extended)", "url": "https://www.youtube.com/watch?v=kmvvP7GW_bw"},
|
||||||
|
{"name": "Zas - Myliu kina", "url": "https://www.youtube.com/watch?v=ImFrfmi-qT8"},
|
||||||
|
{"name": "Zilvinas Zvagulis - Amerikonas grizo sunus", "url": "https://www.youtube.com/watch?v=UvzJEz5ADY8"},
|
||||||
|
{"name": "Raketa - I Kluba", "url": "https://www.youtube.com/watch?v=FkSjtpYN3EI"},
|
||||||
|
{"name": "Karaliska Erdve - Vakareja", "url": "https://www.youtube.com/watch?v=g0HmrlJ7fhE"},
|
||||||
|
{"name": "Tnn - Parukom", "url": "https://www.youtube.com/watch?v=v9pBZK2RIPI"},
|
||||||
|
{"name": "DJ Dalgis - Kauniete", "url": "https://www.youtube.com/watch?v=b3xPE9Iyuzc"},
|
||||||
|
{"name": "Andzikas - I gamta", "url": "https://www.youtube.com/watch?v=UyLdjC-hihM"},
|
||||||
|
{"name": "nemuno krantai - rytmecio rasos", "url": "https://www.youtube.com/watch?v=2-fGbsrofv4"},
|
||||||
|
{"name": "Tipo grupe - Lovoj Vezi", "url": "https://www.youtube.com/watch?v=M3zVMzWCy_c"},
|
||||||
|
{"name": "Kastanenda - Sombrero", "url": "https://www.youtube.com/watch?v=3Z3_4TknCfQ"},
|
||||||
|
{"name": "Elektra - Juda Tavo rankos", "url": "https://www.youtube.com/watch?v=k2RuDoudnOE"},
|
||||||
|
{"name": "Vilija ir Marijonas mikutavicius - Dabar Geriausi Musu Vakarai", "url": "https://www.youtube.com/watch?v=MPnZkEscWo0"},
|
||||||
|
{"name": "Parnesk alaus OG", "url": "https://www.youtube.com/watch?v=e7cB1JIlZ2k"},
|
||||||
|
{"name": "Eugenijus Ostapenko - Dviratukas", "url": "https://www.youtube.com/watch?v=ILFHZQK33Mw"},
|
||||||
|
{"name": "Ciulpuoneliai - Jau Nutilo Sirgaliai", "url": "https://www.youtube.com/watch?v=s8qIVA1U0C0"},
|
||||||
|
{"name": "Tweaxx - Mersas", "url": "https://www.youtube.com/watch?v=7ljAzgALPdA"},
|
||||||
|
{"name": "Dove - Naktinis Tusas", "url": "https://www.youtube.com/watch?v=pz-HEAwFEnk"},
|
||||||
|
{"name": "MAMA MANE RODYS PER FARUS", "url": "https://www.youtube.com/watch?v=F5HqXYRDZaE"},
|
||||||
|
{"name": "Kastaneda - Kelyje", "url": "https://www.youtube.com/watch?v=JVE6NQqKPL4"},
|
||||||
|
{"name": "NL - Juodas Golfas", "url": "https://www.youtube.com/watch?v=f2-ZmElSvPc"},
|
||||||
|
{"name": "DJ Dalgis - Zalia Siera", "url": "https://www.youtube.com/watch?v=nfentq_pez4"},
|
||||||
|
{"name": "L1GHT CASH - Whiskey Cola Lietuviskai (sultys degtinele) remix", "url": "https://www.youtube.com/watch?v=YVaqDaf1KXU"},
|
||||||
|
{"name": "Tipo grupe ir Kastaneda - Po stikliuka", "url": "https://www.youtube.com/watch?v=EtmE60nE7fI"},
|
||||||
|
{"name": "MG INTERNATIONAL - JUODA ORCHIDEJA", "url": "https://www.youtube.com/watch?v=HQvceFRBq9M"},
|
||||||
|
{"name": "Ganja - Truputi", "url": "https://www.youtube.com/watch?v=Pxve7CwiCHM"},
|
||||||
|
{"name": "Riaukenzo - Trys Trys Trys", "url": "https://www.youtube.com/watch?v=qJv6GRQCnCk"},
|
||||||
|
{"name": "Grupiokai - Degtine", "url": "https://www.youtube.com/watch?v=8SqbG2VmEFw"},
|
||||||
|
{"name": "Robertas Kupstas - Cia Mano Rojus", "url": "https://www.youtube.com/watch?v=xij_YeEInr8"},
|
||||||
|
{"name": "NIERKA - PENKTADIENIS", "url": "https://www.youtube.com/watch?v=h3TuZj_OAf0"},
|
||||||
|
{"name": "VAIKAI PO LELIJOM (REMIX)", "url": "https://www.youtube.com/watch?v=k1amBbsAZuo"},
|
||||||
|
{"name": "Vitalija Katunskyte - Robinzonas", "url": "https://www.youtube.com/watch?v=erDHG-QpbPY"},
|
||||||
|
{"name": "Rycka klipas", "url": "https://www.youtube.com/watch?v=nuTUDSQ3BBI"},
|
||||||
|
{"name": "Nezinau, Kodel...", "url": "https://www.youtube.com/watch?v=A-i2CkCnPoc"},
|
||||||
|
{"name": "NL - R1", "url": "https://www.youtube.com/watch?v=hSgav4fYnZ8"},
|
||||||
|
{"name": "DJ Dalgis - Negeriau", "url": "https://www.youtube.com/watch?v=c89YvG3MCcs"},
|
||||||
|
{"name": "Tipo Grupe - tipo daina", "url": "https://www.youtube.com/watch?v=PTIOaSjEgIU"},
|
||||||
|
{"name": "Depresinis feat. Deivas - 0,7", "url": "https://www.youtube.com/watch?v=rjwFjBgTzAA"},
|
||||||
|
{"name": "Depresinis & MERAKI2004 - VASARA ZJBS", "url": "https://www.youtube.com/watch?v=BD-pBjRy-5A"},
|
||||||
|
{"name": "Depresinis feat. Deivas - LEDUKAI", "url": "https://www.youtube.com/watch?v=R2-MtpkKgGI"},
|
||||||
|
{"name": "Depresinis feat. Deivas - Pavasaris", "url": "https://www.youtube.com/watch?v=yWWAucfQdN4"},
|
||||||
|
{"name": "Depresinis - LEDINE", "url": "https://www.youtube.com/watch?v=qugvChkXMLk"},
|
||||||
|
{"name": "Depresinis, Jypas - O Mazuti", "url": "https://www.youtube.com/watch?v=4t_DPbe2r3M"},
|
||||||
|
{"name": "AVA - Eik Tu NA", "url": "https://www.youtube.com/watch?v=yRf3ijaIgOg"},
|
||||||
|
{"name": "Judam Lietuvoj", "url": "https://www.youtube.com/watch?v=WDzWSEgSy5U"},
|
||||||
|
{"name": "16Hz - Baliavojam", "url": "https://www.youtube.com/watch?v=Ia-qERX8WLs"},
|
||||||
|
{"name": "Deivas - Klaipeda On Top", "url": "https://www.youtube.com/watch?v=g_h2M3e2OYU"},
|
||||||
|
{"name": "Depresinis - Volkswagina", "url": "https://www.youtube.com/watch?v=1lZR1VKsQHo"},
|
||||||
|
{"name": "SADBOY - Kaifuok", "url": "https://www.youtube.com/watch?v=vclryWgfy8I"},
|
||||||
|
{"name": "SADBOY - Blizgantys Naikai", "url": "https://www.youtube.com/watch?v=p5KsYJGcfOM"},
|
||||||
|
{"name": "SADBOY - 1001 Naktis", "url": "https://www.youtube.com/watch?v=mLJIjGvWmKI"},
|
||||||
|
{"name": "SADBOY - Deginam", "url": "https://www.youtube.com/watch?v=w3R0Aq1EGXg"},
|
||||||
|
{"name": "Wenona Waves - Topine Panele", "url": "https://www.youtube.com/watch?v=MPHuhmUomfE"},
|
||||||
|
{"name": "Andzikas - Virs debesu", "url": "https://www.youtube.com/watch?v=PHJcVGhxra8"},
|
||||||
|
{"name": "Grupe MX - 1.9 TDI", "url": "https://www.youtube.com/watch?v=8FBr5GQXsI8"},
|
||||||
|
{"name": "Patruliai - Kur Tu", "url": "https://www.youtube.com/watch?v=OPWhiu3cvj0"},
|
||||||
|
{"name": "Ka Tu Ka Vakare", "url": "https://www.youtube.com/watch?v=6SOS4ljHbJY"}
|
||||||
|
],
|
||||||
|
"lietuviskos/rave": [
|
||||||
|
{"name": "VainHouse - Malunas Prie Kelio", "url": "https://www.youtube.com/watch?v=bbwuNjDXCiM"},
|
||||||
|
{"name": "Sokoledas - Mano Skonis Sokolado (Matuze & Arnisxd Remix)", "url": "https://www.youtube.com/watch?v=hb41bfQxiM0"}
|
||||||
|
],
|
||||||
|
"rusiskos": [
|
||||||
|
{"name": "Topolini puh", "url": "https://www.youtube.com/watch?v=UUryvYF8tUs"},
|
||||||
|
{"name": "Raim & Artur feat. Zhenis - Diskoteka is 90 hit", "url": "https://www.youtube.com/watch?v=GfBhxlNhrn0"},
|
||||||
|
{"name": "Pimp Schwab - vse shto nas ne Ubivaet", "url": "https://www.youtube.com/watch?v=NTEXFyUE9Ww"},
|
||||||
|
{"name": "Dzaro and hansa - Visky Kola karaleva trans pola", "url": "https://www.youtube.com/watch?v=fflrMvZ2HtA"}
|
||||||
|
],
|
||||||
|
"noclue": [
|
||||||
|
{"name": "Bad Boys", "url": "https://www.youtube.com/watch?v=NTC7RD8xzCY"},
|
||||||
|
{"name": "DR. VODKA - DZIEWCZYNO Z TIKTOKA", "url": "https://www.youtube.com/watch?v=HLbw1WQt64o"},
|
||||||
|
{"name": "Maco Mamuko - Whiskey, Cola i Tequila", "url": "https://www.youtube.com/watch?v=aBrN0k0Phtc"}
|
||||||
|
|
||||||
|
],
|
||||||
|
"reggea": [
|
||||||
|
{"name": "Shaggy - It Wasn't Me", "url": "https://www.youtube.com/watch?v=ssVj50ombaM"}
|
||||||
|
],
|
||||||
|
"alt": [
|
||||||
|
{"name": "ROMANCEPLANET - FALL FROM THE SKY", "url": "https://www.youtube.com/watch?v=HMhzxzXBisw"},
|
||||||
|
{"name": "ROMANCEPLANET - PLAIN WHITE TEE", "url": "https://www.youtube.com/watch?v=tdVQbNwjGac"},
|
||||||
|
{"name": "ROMANCEPLANET - DANCE", "url": "https://www.youtube.com/watch?v=ircOfMb4gEw"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,15 +5,16 @@ use crate::{config::{cli::CliCommand, ConfigWrapper}, downloader::Downloader, ma
|
||||||
|
|
||||||
|
|
||||||
pub async fn command_run(cfg: &ConfigWrapper, manifest: &mut Manifest) -> anyhow::Result<()> {
|
pub async fn command_run(cfg: &ConfigWrapper, manifest: &mut Manifest) -> anyhow::Result<()> {
|
||||||
let mut downloader = Downloader::new(cfg.cfg.ytdlp.path.clone());
|
let mut downloader = Downloader::new();
|
||||||
match &cfg.cli.command {
|
match &cfg.cli.command {
|
||||||
None | Some(CliCommand::Download) => {
|
None | Some(CliCommand::Download) => {
|
||||||
if let Ok(count) = downloader.download_all(manifest, &cfg).await {
|
match downloader.download_all(manifest, &cfg).await {
|
||||||
log::info!("Downloaded {count} songs");
|
Ok(count) => log::info!("Downloaded {count} songs"),
|
||||||
} else {
|
Err(e) => {
|
||||||
log::error!("Failed to download songs");
|
log::error!("Failed to download songs: {e}");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Some(c) => {
|
Some(c) => {
|
||||||
match c {
|
match c {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use camino::Utf8PathBuf;
|
use camino::Utf8PathBuf;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
|
|
||||||
use crate::util::isatty;
|
|
||||||
|
|
||||||
#[derive(Debug, Parser, Default)]
|
#[derive(Debug, Parser, Default)]
|
||||||
pub struct CliArgs {
|
pub struct CliArgs {
|
||||||
|
|
|
@ -5,12 +5,12 @@ use std::path::PathBuf;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use crate::util::{self, dl_to_file, isatty};
|
use crate::util::{self, isatty};
|
||||||
|
|
||||||
use self::cli::CliArgs;
|
use self::cli::CliArgs;
|
||||||
|
|
||||||
const YTDLP_DL_URL: &'static str = "https://github.com/yt-dlp/yt-dlp/archive/refs/heads/master.zip";
|
// const YTDLP_DL_URL: &'static str = "https://github.com/yt-dlp/yt-dlp/archive/refs/heads/master.zip";
|
||||||
const SPOTDL_DL_URL: &'static str = "https://github.com/spotDL/spotify-downloader/archive/refs/heads/master.zip";
|
// const SPOTDL_DL_URL: &'static str = "https://github.com/spotDL/spotify-downloader/archive/refs/heads/master.zip";
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct ConfigWrapper {
|
pub struct ConfigWrapper {
|
||||||
|
@ -23,24 +23,16 @@ pub struct ConfigWrapper {
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub ytdlp: ConfigYtdlp,
|
pub ytdlp: ConfigYtdlp,
|
||||||
pub spotdl: ConfigSpotdl,
|
pub spotdl: ConfigSpotdl,
|
||||||
pub python: ConfigPython,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Default)]
|
#[derive(Debug, Serialize, Deserialize, Default)]
|
||||||
pub struct ConfigYtdlp {
|
pub struct ConfigYtdlp {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
pub is_python: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Default)]
|
#[derive(Debug, Serialize, Deserialize, Default)]
|
||||||
pub struct ConfigSpotdl {
|
pub struct ConfigSpotdl {
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
pub is_python: bool
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Default)]
|
|
||||||
pub struct ConfigPython {
|
|
||||||
pub path: PathBuf,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,67 +61,67 @@ impl Config {
|
||||||
|
|
||||||
async fn setup_config(cli: &CliArgs) -> Result<Self> {
|
async fn setup_config(cli: &CliArgs) -> Result<Self> {
|
||||||
let mut s = Self::default();
|
let mut s = Self::default();
|
||||||
|
let mut error = false;
|
||||||
let bin_dir = cli.output.clone().into_std_path_buf().join(".bin/");
|
|
||||||
let mut python_needed = false;
|
|
||||||
|
|
||||||
match util::is_program_in_path("yt-dlp") {
|
match util::is_program_in_path("yt-dlp") {
|
||||||
Some(p) => {
|
Some(p) => {
|
||||||
s.ytdlp.path = p;
|
s.ytdlp.path = p;
|
||||||
s.ytdlp.is_python = false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
None => {
|
None => {
|
||||||
python_needed = true;
|
error = true;
|
||||||
s.ytdlp.is_python = true;
|
log::error!("could not find yt-dlp, please install it.");
|
||||||
s.ytdlp.path = bin_dir.join("ytdlp");
|
log::info!(" - With winget (Windows only) (recommended):");
|
||||||
dl_to_file(YTDLP_DL_URL, s.ytdlp.path.join("ytdlp.zip")).await?;
|
log::info!(" - Most new windows versions have winget installed, if not, instructions here: https://learn.microsoft.com/en-us/windows/package-manager/winget/#install-winget");
|
||||||
zip_extensions::zip_extract(&s.ytdlp.path.join("ytdlp.zip"), &s.ytdlp.path)?;
|
log::info!(" - run `winget install yt-dlp`");
|
||||||
|
log::info!(" - With chocolatey (Windows only):");
|
||||||
|
log::info!(" - Make sure you have chocolatey installed - https://chocolatey.org/install");
|
||||||
|
log::info!(" - run `choco install yt-dlp` as Admin");
|
||||||
|
log::info!(" - With pip (from python) (Cross platform)");
|
||||||
|
log::info!(" - Make sure you have python installed");
|
||||||
|
log::info!(" - pip install yt-dlp");
|
||||||
|
log::info!(" - Using your distro's package manager (Unix/BSD only) (Not recommended)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match util::is_program_in_path("spotdl") {
|
match util::is_program_in_path("spotdl") {
|
||||||
Some(p) => {
|
Some(p) => {
|
||||||
s.spotdl.path = p;
|
s.spotdl.path = p;
|
||||||
s.spotdl.is_python = false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
None => {
|
None => {
|
||||||
python_needed = true;
|
let res = crate::prompt::prompt_bool("Spotdl is not installed but if you dont need to download music from spotify you dont need it, skip it?", None);
|
||||||
s.spotdl.is_python = true;
|
if res {
|
||||||
s.spotdl.path = bin_dir.join("ytdlp");
|
s.spotdl.path = PathBuf::from("UNUSED");
|
||||||
dl_to_file(SPOTDL_DL_URL, s.spotdl.path.join("spotdl.zip")).await?;
|
} else {
|
||||||
zip_extensions::zip_extract(&s.spotdl.path.join("spotdl.zip"), &s.ytdlp.path)?;
|
error = true;
|
||||||
|
log::error!("could not find spotdl, please install it. ");
|
||||||
|
log::info!(" - With pip (from python) (Cross platform) (recommended)");
|
||||||
|
log::info!(" - Make sure you have python installed - https://www.python.org/downloads/");
|
||||||
|
log::info!(" - pip install spotdl");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match util::is_program_in_path("ffmpeg") {
|
||||||
|
Some(_) => (),
|
||||||
|
|
||||||
let python_paths = &[
|
|
||||||
util::is_program_in_path("python"),
|
|
||||||
util::is_program_in_path("python3")
|
|
||||||
];
|
|
||||||
|
|
||||||
if python_needed {
|
|
||||||
let mut found = false;
|
|
||||||
for p in python_paths {
|
|
||||||
match p {
|
|
||||||
Some(p) => {
|
|
||||||
s.python.path = p.clone();
|
|
||||||
found = true;
|
|
||||||
break
|
|
||||||
}
|
|
||||||
None => {
|
None => {
|
||||||
}
|
error = true;
|
||||||
}
|
log::error!("could not find ffmpeg, please install it.");
|
||||||
}
|
log::info!(" - With winget (Windows only) (recommended):");
|
||||||
|
log::info!(" - Most new windows versions have winget installed, if not, instructions here: https://learn.microsoft.com/en-us/windows/package-manager/winget/#install-winget");
|
||||||
if !found {
|
log::info!(" - run `winget install --id=Gyan.FFmpeg -e`");
|
||||||
panic!("Python needs to be installed for this to work, or install ytdlp and spotdl manually, (dont forget to delete the config file after doing so)");
|
log::info!(" - With chocolatey (Windows only):");
|
||||||
|
log::info!(" - Make sure you have chocolatey installed - https://chocolatey.org/install");
|
||||||
|
log::info!(" - run `choco install ffmpeg` as Admin");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !error {
|
||||||
s.save(cli.config.clone().into_std_path_buf())?;
|
s.save(cli.config.clone().into_std_path_buf())?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(s)
|
Ok(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,15 +20,13 @@ lazy_static!(
|
||||||
|
|
||||||
pub struct Downloader {
|
pub struct Downloader {
|
||||||
count: usize,
|
count: usize,
|
||||||
ytdlp_path: PathBuf,
|
|
||||||
id_itr: usize,
|
id_itr: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Downloader {
|
impl Downloader {
|
||||||
pub fn new(ytdlp_path: PathBuf) -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
count: 0,
|
count: 0,
|
||||||
ytdlp_path,
|
|
||||||
id_itr: 0,
|
id_itr: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,8 +51,12 @@ impl Downloader {
|
||||||
log::debug!("File {path} exists, skipping");
|
log::debug!("File {path} exists, skipping");
|
||||||
return Ok(())
|
return Ok(())
|
||||||
}
|
}
|
||||||
let mut cmd = tokio::process::Command::new(&self.ytdlp_path);
|
|
||||||
let cmd = cmd.args([
|
log::debug!("File {path} doesnt exist, downloading");
|
||||||
|
let mut cmd = if song.url.contains("youtube.com") || song.url.contains("youtu.be") {
|
||||||
|
log::debug!("Song {} is from yotube", song.url);
|
||||||
|
let mut cmd = tokio::process::Command::new(&cfg.cfg.ytdlp.path);
|
||||||
|
cmd.args([
|
||||||
"-x",
|
"-x",
|
||||||
"--audio-format",
|
"--audio-format",
|
||||||
format.as_str(),
|
format.as_str(),
|
||||||
|
@ -62,10 +64,23 @@ impl Downloader {
|
||||||
path.as_str(),
|
path.as_str(),
|
||||||
song.url.as_str()
|
song.url.as_str()
|
||||||
]);
|
]);
|
||||||
|
cmd
|
||||||
|
} else {
|
||||||
|
let mut cmd = tokio::process::Command::new(&cfg.cfg.spotdl.path);
|
||||||
|
cmd.args([
|
||||||
|
"-x",
|
||||||
|
"--audio-format",
|
||||||
|
format.as_str(),
|
||||||
|
"-o",
|
||||||
|
path.as_str(),
|
||||||
|
song.url.as_str()
|
||||||
|
]);
|
||||||
|
cmd
|
||||||
|
};
|
||||||
|
|
||||||
let cmd = if log::max_level() < Level::Debug {
|
if log::max_level() < Level::Debug {
|
||||||
cmd.stdout(Stdio::null()).stderr(Stdio::null())
|
cmd.stdout(Stdio::null()).stderr(Stdio::null());
|
||||||
} else {cmd};
|
};
|
||||||
|
|
||||||
let mut proc = cmd.spawn()?;
|
let mut proc = cmd.spawn()?;
|
||||||
let id = self.id_itr;
|
let id = self.id_itr;
|
||||||
|
|
|
@ -18,6 +18,7 @@ pub fn simple_prompt(p: &str) -> String {
|
||||||
buf.trim().to_string()
|
buf.trim().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn prompt_with_list(p: &str, options: &[&str]) -> usize {
|
pub fn prompt_with_list(p: &str, options: &[&str]) -> usize {
|
||||||
println!("{c}prompt{r}: {p}",
|
println!("{c}prompt{r}: {p}",
|
||||||
c=anstyle::AnsiColor::Cyan.render_fg(),
|
c=anstyle::AnsiColor::Cyan.render_fg(),
|
||||||
|
@ -75,7 +76,7 @@ pub fn prompt_with_list_or_str(p: &str, options: &[String]) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn prompt_with_map(p: &str, options: HashMap<&str, &str>) -> String {
|
pub fn prompt_with_map(p: &str, options: HashMap<&str, &str>) -> String {
|
||||||
println!("{c}prompt{r}: {p}",
|
println!("{c}prompt{r}: {p}",
|
||||||
c=anstyle::AnsiColor::Cyan.render_fg(),
|
c=anstyle::AnsiColor::Cyan.render_fg(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{io::Write, path::PathBuf};
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use crate::constants;
|
use crate::constants;
|
||||||
|
|
||||||
|
@ -43,12 +43,12 @@ pub fn isatty() -> bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn dl_to_file(url: &str, p: PathBuf) -> anyhow::Result<()> {
|
// pub async fn dl_to_file(url: &str, p: PathBuf) -> anyhow::Result<()> {
|
||||||
log::info!("Downloading {} -> {:?}", url, p);
|
// log::info!("Downloading {} -> {:?}", url, p);
|
||||||
let ytdlp_req = reqwest::get(url).await?.bytes().await?;
|
// let ytdlp_req = reqwest::get(url).await?.bytes().await?;
|
||||||
log::debug!("Downloading {:?} finished, writing to file", p);
|
// log::debug!("Downloading {:?} finished, writing to file", p);
|
||||||
let mut fd = std::fs::File::create(&p)?;
|
// let mut fd = std::fs::File::create(&p)?;
|
||||||
fd.write(&ytdlp_req)?;
|
// fd.write(&ytdlp_req)?;
|
||||||
log::debug!("Finished writing {:?}", p);
|
// log::debug!("Finished writing {:?}", p);
|
||||||
Ok(())
|
// Ok(())
|
||||||
}
|
// }
|
Loading…
Reference in New Issue
Block a user