commit 12b872f6bc658bb00de519d72055bf5b562bb22c Author: MCorange99 Date: Sun Apr 7 00:54:43 2024 +0300 asd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a4c508 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/* +!/.gitignore +!/dl.py +!/manifest.json +!/requirements.txt \ No newline at end of file diff --git a/dl.py b/dl.py new file mode 100644 index 0000000..8e83b8e --- /dev/null +++ b/dl.py @@ -0,0 +1,133 @@ +import os, sys, json, subprocess, time; +from types import *; +from typing import *; +from dataclasses import dataclass +from argparse_dataclass import dataclass as argparser +from enum import IntEnum + +@dataclass +class Process: + proc: subprocess.Popen[bytes] + name: str + url: str + file: str + genre: str + +PROCESSES: List[Process] =[] + +class Level(IntEnum): + ERROR = 0 + WARN = 1 + INFO = 2 + DEBUG = 3 + +def level_to_prefix(l: Level) -> str: + match l: + case Level.ERROR: + return "\033[0;31m\033[1merror\033[0m" + case Level.WARN: + return "\033[1;33m\033[1mwarn\033[0m" + case Level.INFO: + return "\033[1;32m\033[1minfo\033[0m" + case Level.DEBUG: + return "\033[1;34m\033[1mdebug\033[0m" + + + +class Logger: + level: Level = Level.INFO + + def error(self, s: str): + if self.level >= Level.ERROR: + print(f"{level_to_prefix(Level.ERROR)}: {s}") + def warn(self, s: str): + if self.level >= Level.WARN: + print(f"{level_to_prefix(Level.WARN)}: {s}") + def info(self, s: str): + if self.level >= Level.INFO: + print(f"{level_to_prefix(Level.INFO)}: {s}") + def debug(self, s: str): + if self.level >= Level.DEBUG: + print(f"{level_to_prefix(Level.DEBUG)}: {s}") + +LOGGER = Logger() + + +if os.name == 'nt': + YTDLP="yt-dlp.exe" +else: + YTDLP="yt-dlp" + +@dataclass +class ManifestSong: + name: str + url: str + +type ManifestGenre = List[ManifestSong] + +type Manifest = Dict[str, ManifestGenre] + +@argparser +class CliArgs: + manifest: str = "./manifest.json" + output_dir: str = "./" + debug: bool = False + +def main(cliargs: CliArgs) -> int: + if cliargs.debug: + LOGGER.level = Level.DEBUG + manifest: Manifest = get_manifest(cliargs) + count = 0 + for (genre, v) in manifest.items(): + for song in v: + if len(PROCESSES) > 10: + wait_for_procs(10) + if download_song(genre, song["name"], song["url"]): + count += 1 + wait_for_procs() + LOGGER.info(f"Downloaded {count} new songs") + + +def download_song(dir: str, name: str, url: str) -> bool: + if not os.path.isdir(dir): + os.mkdir(dir) + + outfile=f"{dir}/{name}.m4a" + + if os.path.isfile(outfile): + LOGGER.debug(f"Already downloaded {outfile} ({url}), skipping") + return False + + LOGGER.info(f"Downloading {outfile} ({url})") + + proc = subprocess.Popen( + [YTDLP, "-x", "--audio-format", "m4a","-o", outfile, url], + stdout=open(os.devnull, 'wb') + ) + + PROCESSES.append(Process(proc, name, url, outfile, dir)) + return True + + +def wait_for_procs(until: int = 0): + while len(PROCESSES) > until: + for proc in PROCESSES: + retcode = proc.proc.poll() + if retcode is not None: # Process finished. + PROCESSES.remove(proc) + LOGGER.info(f"Finished downloading {proc.file}") + break + else: # No process is done, wait a bit and check again. + time.sleep(.1) + continue + + +def get_manifest(cliargs: CliArgs) -> Manifest: + with open(cliargs.manifest, "r") as f: + data = f.read() + return json.loads(data) + + +if __name__ == "__main__": + ret = main(CliArgs.parse_args(sys.argv[1:])) + sys.exit(ret) \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8bf886e --- /dev/null +++ b/manifest.json @@ -0,0 +1,137 @@ +{ + "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"} + ], + "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"} + ], + "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"} + ] +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..adb8563 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +argparse_dataclass == 2.0.0 \ No newline at end of file