""" A simple script to download music videos from bugs.co.kr author: pandamoon21 requirements: requests, rich, tqdm Usage: bugs_mv_dl.py {url/videoid} {quality} notes: - quality is optional, default set to FHD - SD (< 720p), HD (720p), FHD (1080p) example: -> bugs_mv_dl.py https://music.bugs.co.kr/mv/624404 FHD -> bugs_mv_dl.py https://music.bugs.co.kr/mv/624404 -> bugs_mv_dl.py 624404 last update: 20/04/2024 """ import re import requests import sys import warnings from pathlib import Path from rich import print from tqdm import TqdmExperimentalWarning from tqdm.rich import tqdm warnings.filterwarnings("ignore", category=TqdmExperimentalWarning) session = requests.Session() headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'DNT': '1', 'Origin': 'https://music.bugs.co.kr', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0', 'X-Requested-With': 'XMLHttpRequest', 'sec-ch-ua': '"Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } def get_playback(videoid, quality): res = session.post( url="https://music.bugs.co.kr/mvPlayer/lightSecureUrl", data={ "mvId": videoid, "pl_type": "html5", "quality": quality }, headers={ 'Referer': f'https://music.bugs.co.kr/mv/{videoid}', **headers } ) return res.json() def download_file(input_url, videoid, output): res = session.get( url=input_url, headers={ 'Referer': f'https://music.bugs.co.kr/mv/{videoid}', **headers }, allow_redirects=True, stream=True ) chunk_size = 1 TOTAL_SIZE = int(res.headers.get("Content-Length", 0)) CHUNK_SIZE = chunk_size * 10**6 output = Path(f"{output}.mp4") with ( open(str(output), "wb") as video, tqdm(total=TOTAL_SIZE, desc=f"Download {output}", unit="B", unit_scale=True) as bar ): for chunk in res.iter_content(chunk_size=CHUNK_SIZE): # writing one chunk at a time to the file if chunk: size = video.write(chunk) bar.update(size) try: videoid = sys.argv[1] except Exception: # using custom videoid from this py file instead videoid = "input_video_id_here" try: quality = sys.argv[2] except Exception: # using FHD as default -> SD, HD, FHD quality = "FHD" if "http" in videoid: # parse videoid videoid = re.search(r"\d{4,6}", videoid)[0] data = get_playback(videoid, quality) artist_name = data["mv"]["artist_nm"] mv_title = data["mv"]["mv_title"] album_title = data["mv"]["album_title"] title = "{} - {}".format(artist_name, mv_title) print(f" + Artist Name : {artist_name}") print(f" + MV Title : {mv_title}") print(f" + Album Title : {album_title}") lsu_url = data["url"] print("\nDownloading...") print(f" + Filename : {title}") # Download the file url = f"https://music.bugs.co.kr/lsu_vurl/{lsu_url}" download_file(url, videoid, title)