140 lines
4.2 KiB
Python
140 lines
4.2 KiB
Python
import requests
|
|
import os.path
|
|
import pandas as pd
|
|
|
|
import logging
|
|
|
|
|
|
class Download:
|
|
def __init__(self, session: requests.Session = requests.Session(), file: str = ".cache3.csv", temp: str = "temp"):
|
|
self.session = session
|
|
self.session.headers = {
|
|
"Connection": "keep-alive",
|
|
"Referer": "https://musify.club/"
|
|
}
|
|
self.temp = temp
|
|
self.file = file
|
|
|
|
self.dataframe = pd.read_csv(os.path.join(self.temp, self.file), index_col=0)
|
|
|
|
for idx, row in self.dataframe.iterrows():
|
|
self.download(row['path'], row['file'], row['url'])
|
|
|
|
def download(self, path, file, url):
|
|
if os.path.exists(file):
|
|
return
|
|
os.makedirs(path, exist_ok=True)
|
|
|
|
logging.info(f"downloading: {url}")
|
|
r = self.session.get(url)
|
|
if r.status_code != 200:
|
|
if r.status_code == 404:
|
|
logging.warning(f"{url} was not found")
|
|
return -1
|
|
raise ConnectionError(f"\"{url}\" returned {r.status_code}: {r.text}")
|
|
with open(file, "wb") as mp3_file:
|
|
mp3_file.write(r.content)
|
|
logging.info("finished")
|
|
|
|
|
|
"""
|
|
class Track:
|
|
def __init__(self, url: str, release: Release, track_name: str, track_artists: list = None,
|
|
session: requests.Session = requests.Session()):
|
|
self.session = session
|
|
self.url = url
|
|
|
|
parsed_url = urllib.parse.urlparse(url)
|
|
path = os.path.normpath(parsed_url.path)
|
|
split_path = path.split(os.sep)
|
|
|
|
url_type = split_path[1]
|
|
if url_type != "track":
|
|
raise Exception(f'"{url}" is supposed to link a track.')
|
|
name = split_path[2]
|
|
name = name.split("-")
|
|
|
|
self.id = name[-1]
|
|
self.name = "-".join(name[:-1])
|
|
|
|
self.track_artists = track_artists
|
|
self.release = release
|
|
self.pretty_track = track_name
|
|
self.mp3_url = self.get_mp3_url()
|
|
|
|
def __str__(self):
|
|
|
|
def fetch(self):
|
|
return
|
|
|
|
def get_mp3_url(self):
|
|
# https://musify.club/track/dl/17254894/ghost-bath-convince-me-to-bleed.mp3
|
|
return f"https://musify.club/track/dl/{self.id}/{self.name}.mp3"
|
|
|
|
def add_album_art(self, path):
|
|
|
|
|
|
img = self.release.raw_artwork
|
|
|
|
audio = EasyMP3(path, ID3=ID3)
|
|
|
|
try:
|
|
audio.add_tags()
|
|
except _util.error:
|
|
pass
|
|
|
|
audio.tags.add(
|
|
APIC(
|
|
encoding=3, # UTF-8
|
|
mime='image/png',
|
|
type=3, # 3 is for album art
|
|
desc='Cover',
|
|
data=img.read() # Reads and adds album art
|
|
)
|
|
)
|
|
audio.save()
|
|
|
|
def download(self):
|
|
download_path = os.path.join(self.release.path, self.name + ".mp3")
|
|
# download only when the file doesn't exist yet
|
|
if not os.path.exists(download_path):
|
|
logging.info(f"downloading: {self.mp3_url}")
|
|
r = requests.get(self.mp3_url, proxies=proxy)
|
|
if r.status_code != 200:
|
|
if r.status_code == 404:
|
|
logging.warning(f"{self.mp3_url} was not found")
|
|
return -1
|
|
raise ConnectionError(f"\"{self.mp3_url}\" returned {r.status_code}: {r.text}")
|
|
with open(download_path, "wb") as mp3_file:
|
|
mp3_file.write(r.content)
|
|
logging.info("finished")
|
|
|
|
audiofile = EasyID3(download_path)
|
|
if self.track_artists is not None:
|
|
audiofile["artist"] = self.track_artists
|
|
else:
|
|
audiofile["artist"] = self.release.pretty_release
|
|
audiofile["albumartist"] = self.release.artist.pretty_name
|
|
audiofile["date"] = self.release.year
|
|
|
|
if self.release.genre is not None:
|
|
audiofile["genre"] = self.release.genre
|
|
|
|
audiofile["title"] = self.pretty_track
|
|
audiofile["album"] = self.release.pretty_release
|
|
|
|
audiofile.save()
|
|
# self.add_album_art(download_path)
|
|
|
|
"""
|
|
|
|
if __name__ == "__main__":
|
|
proxies = {
|
|
'http': 'socks5h://127.0.0.1:9150',
|
|
'https': 'socks5h://127.0.0.1:9150'
|
|
}
|
|
|
|
s = requests.Session()
|
|
s.proxies = proxies
|
|
Download(session=s)
|