commit
This commit is contained in:
BIN
src/__pycache__/phonetic_compares.cpython-310.pyc
Normal file
BIN
src/__pycache__/phonetic_compares.cpython-310.pyc
Normal file
Binary file not shown.
127
src/download.py
127
src/download.py
@@ -1,3 +1,4 @@
|
||||
import mutagen.id3
|
||||
import requests
|
||||
import os.path
|
||||
import pandas as pd
|
||||
@@ -13,69 +14,42 @@ import youtube_music
|
||||
https://en.wikipedia.org/wiki/ID3
|
||||
https://mutagen.readthedocs.io/en/latest/user/id3.html
|
||||
|
||||
>>> from mutagen.easyid3 import EasyID3
|
||||
>>> print(EasyID3.valid_keys.keys())
|
||||
dict_keys(
|
||||
[
|
||||
'album',
|
||||
'bpm',
|
||||
'compilation',
|
||||
'composer',
|
||||
'copyright',
|
||||
'encodedby',
|
||||
'lyricist',
|
||||
'length',
|
||||
'media',
|
||||
'mood',
|
||||
'grouping',
|
||||
'title',
|
||||
'version',
|
||||
'artist',
|
||||
'albumartist',
|
||||
'conductor',
|
||||
'arranger',
|
||||
'discnumber',
|
||||
'organization',
|
||||
'tracknumber',
|
||||
'author',
|
||||
'albumartistsort',
|
||||
'albumsort',
|
||||
'composersort',
|
||||
'artistsort',
|
||||
'titlesort',
|
||||
'isrc',
|
||||
'discsubtitle',
|
||||
'language',
|
||||
'genre',
|
||||
'date',
|
||||
'originaldate',
|
||||
'performer:*',
|
||||
'musicbrainz_trackid',
|
||||
'website',
|
||||
'replaygain_*_gain',
|
||||
'replaygain_*_peak',
|
||||
'musicbrainz_artistid',
|
||||
'musicbrainz_albumid',
|
||||
'musicbrainz_albumartistid',
|
||||
'musicbrainz_trmid',
|
||||
'musicip_puid',
|
||||
'musicip_fingerprint',
|
||||
'musicbrainz_albumstatus',
|
||||
'musicbrainz_albumtype', <----------
|
||||
'releasecountry',
|
||||
'musicbrainz_discid',
|
||||
'asin',
|
||||
'performer',
|
||||
'barcode',
|
||||
'catalognumber',
|
||||
'musicbrainz_releasetrackid',
|
||||
'musicbrainz_releasegroupid',
|
||||
'musicbrainz_workid',
|
||||
'acoustid_fingerprint',
|
||||
'acoustid_id'
|
||||
])
|
||||
# to get all valid keys
|
||||
from mutagen.easyid3 import EasyID3
|
||||
print(EasyID3.valid_keys.keys())
|
||||
"""
|
||||
|
||||
|
||||
def write_metadata(row, file_path):
|
||||
# only convert the file to the proper format if mutagen doesn't work with it due to time
|
||||
try:
|
||||
audiofile = EasyID3(file_path)
|
||||
except mutagen.id3.ID3NoHeaderError:
|
||||
AudioSegment.from_file(file_path).export(file_path, format="mp3")
|
||||
audiofile = EasyID3(file_path)
|
||||
|
||||
valid_keys = list(EasyID3.valid_keys.keys())
|
||||
|
||||
for key in list(row.keys()):
|
||||
if type(row[key]) == list or key in valid_keys and not pd.isna(row[key]):
|
||||
# print(key)
|
||||
if type(row[key]) == int or type(row[key]) == float:
|
||||
row[key] = str(row[key])
|
||||
audiofile[key] = row[key]
|
||||
|
||||
logging.info("saving")
|
||||
audiofile.save(file_path, v1=2)
|
||||
|
||||
|
||||
def path_stuff(path: str, file_: str):
|
||||
# returns true if it shouldn't be downloaded
|
||||
if os.path.exists(file_):
|
||||
logging.info(f"'{file_}' does already exist, thus not downloading.")
|
||||
return True
|
||||
os.makedirs(path, exist_ok=True)
|
||||
return False
|
||||
|
||||
|
||||
class Download:
|
||||
def __init__(self, session: requests.Session = requests.Session(), file: str = ".cache3.csv", temp: str = "temp",
|
||||
base_path: str = ""):
|
||||
@@ -94,8 +68,8 @@ class Download:
|
||||
row['file'] = os.path.join(base_path, row['file'])
|
||||
row['path'] = os.path.join(base_path, row['path'])
|
||||
|
||||
if self.path_stuff(row['path'], row['file']):
|
||||
self.write_metadata(row, row['file'])
|
||||
if path_stuff(row['path'], row['file']):
|
||||
write_metadata(row, row['file'])
|
||||
continue
|
||||
|
||||
src = row['src']
|
||||
@@ -103,32 +77,7 @@ class Download:
|
||||
musify.download(row)
|
||||
elif src == 'youtube':
|
||||
youtube_music.download(row)
|
||||
self.write_metadata(row, row['file'])
|
||||
|
||||
def path_stuff(self, path: str, file_: str):
|
||||
# returns true if it shouldn't be downloaded
|
||||
if os.path.exists(file_):
|
||||
logging.info(f"'{file_}' does already exist, thus not downloading.")
|
||||
return True
|
||||
os.makedirs(path, exist_ok=True)
|
||||
return False
|
||||
|
||||
def write_metadata(self, row, filePath):
|
||||
AudioSegment.from_file(filePath).export(filePath, format="mp3")
|
||||
|
||||
audiofile = EasyID3(filePath)
|
||||
|
||||
valid_keys = list(EasyID3.valid_keys.keys())
|
||||
|
||||
for key in list(row.keys()):
|
||||
if type(row[key]) == list or key in valid_keys and not pd.isna(row[key]):
|
||||
# print(key)
|
||||
if type(row[key]) == int or type(row[key]) == float:
|
||||
row[key] = str(row[key])
|
||||
audiofile[key] = row[key]
|
||||
|
||||
print("saving")
|
||||
audiofile.save(filePath, v1=2)
|
||||
write_metadata(row, row['file'])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@@ -31,6 +31,12 @@ class Download:
|
||||
self.add_url(youtube_url, 'youtube', dict(row))
|
||||
continue
|
||||
|
||||
# check musify again, but with a diffrent methode that takes longer
|
||||
musify_url = musify.get_musify_url_slow(row)
|
||||
if musify_url is not None:
|
||||
self.add_url(musify_url, 'musify', dict(row))
|
||||
continue
|
||||
|
||||
logging.warning(f"Didn't find any sources for {row['title']}")
|
||||
|
||||
self.dump_urls(file)
|
||||
|
32
src/main.py
32
src/main.py
@@ -7,17 +7,28 @@ import logging
|
||||
import requests
|
||||
import os
|
||||
|
||||
|
||||
TEMP = "temp"
|
||||
STEP_ONE_CACHE = ".cache1.csv"
|
||||
STEP_TWO_CACHE = ".cache2.csv"
|
||||
STEP_THREE_CACHE = ".cache3.csv"
|
||||
|
||||
NOT_A_GENRE = ".", "..", "misc_scripts", "Music", "script", ".git", ".idea"
|
||||
MUSIC_DIR = os.path.expanduser('~/Music')
|
||||
TOR = False
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
|
||||
def get_existing_genre():
|
||||
valid_directories = []
|
||||
for elem in os.listdir(MUSIC_DIR):
|
||||
if elem not in NOT_A_GENRE:
|
||||
valid_directories.append(elem)
|
||||
|
||||
return valid_directories
|
||||
|
||||
|
||||
def search_for_metadata(query: str):
|
||||
search = metadata.Search(query=query, temp=TEMP)
|
||||
|
||||
@@ -41,6 +52,24 @@ def search_for_metadata(query: str):
|
||||
continue
|
||||
|
||||
|
||||
def get_genre():
|
||||
existing_genres = get_existing_genre()
|
||||
print("printing available genres:")
|
||||
for i, genre_option in enumerate(existing_genres):
|
||||
print(f"{i}: {genre_option}")
|
||||
|
||||
genre = input("Input the ID for an existing genre or text for a new one: ")
|
||||
|
||||
if genre.isdigit():
|
||||
genre_id = int(genre)
|
||||
if genre_id >= len(existing_genres):
|
||||
logging.warning("An invalid genre id has been given")
|
||||
return get_genre()
|
||||
return existing_genres[genre_id]
|
||||
|
||||
return genre
|
||||
|
||||
|
||||
def cli(start_at: int = 0):
|
||||
session = requests.Session()
|
||||
if TOR:
|
||||
@@ -50,7 +79,8 @@ def cli(start_at: int = 0):
|
||||
}
|
||||
|
||||
if start_at <= 2:
|
||||
genre = input("genre to download to: ")
|
||||
genre = get_genre()
|
||||
logging.info(f"{genre} has been set as genre.")
|
||||
|
||||
if start_at <= 0:
|
||||
search = search_for_metadata(query=input("initial query: "))
|
||||
|
@@ -10,16 +10,18 @@ musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeI
|
||||
|
||||
KNOWN_KIND_OF_OPTIONS = ["artist", "release", "track"]
|
||||
|
||||
|
||||
def output(msg: str):
|
||||
print(msg)
|
||||
|
||||
def get_elem_from_obj(current_object, keys: list, after_process=lambda x: x):
|
||||
|
||||
def get_elem_from_obj(current_object, keys: list, after_process=lambda x: x, return_if_none=None):
|
||||
current_object = current_object
|
||||
for key in keys:
|
||||
if key in current_object or (type(key) == int and key < len(current_object)):
|
||||
current_object = current_object[key]
|
||||
else:
|
||||
return None
|
||||
return return_if_none
|
||||
return after_process(current_object)
|
||||
|
||||
|
||||
@@ -47,6 +49,7 @@ class Search:
|
||||
|
||||
metadata_list = []
|
||||
if kind == "artist":
|
||||
|
||||
metadata_list = self.download_artist(mb_id)
|
||||
elif kind == "release":
|
||||
metadata_list = self.download_release(mb_id)
|
||||
@@ -70,7 +73,6 @@ class Search:
|
||||
|
||||
for i, release in enumerate(result["artist"]["release-list"]):
|
||||
metadata_list.extend(self.download_release(release["id"], i))
|
||||
|
||||
return metadata_list
|
||||
|
||||
def download_release(self, mb_id, album_sort: int = None):
|
||||
@@ -80,6 +82,7 @@ class Search:
|
||||
label-rels, place-rels, event-rels, recording-rels, release-rels, release-group-rels, series-rels, url-rels,
|
||||
work-rels, instrument-rels
|
||||
"""
|
||||
|
||||
def get_additional_artist_info(mb_id_):
|
||||
r = musicbrainzngs.get_artist_by_id(mb_id_, includes=["releases"])
|
||||
|
||||
@@ -91,10 +94,12 @@ class Search:
|
||||
break
|
||||
|
||||
return album_sort
|
||||
|
||||
result = musicbrainzngs.get_release_by_id(mb_id, includes=["artists", "recordings", 'release-groups'])
|
||||
|
||||
if album_sort is None:
|
||||
album_sort = get_additional_artist_info(get_elem_from_obj(result, ['release', 'artist-credit', 0, 'artist', 'id']))
|
||||
album_sort = get_additional_artist_info(
|
||||
get_elem_from_obj(result, ['release', 'artist-credit', 0, 'artist', 'id']))
|
||||
release_type = get_elem_from_obj(result, ['release', 'release-group', 'type'])
|
||||
|
||||
tracklist_metadata = []
|
||||
@@ -107,11 +112,15 @@ class Search:
|
||||
track_id = track["recording"]["id"]
|
||||
this_track = track["position"]
|
||||
|
||||
tracklist_metadata.extend(self.download_track(track_id, is_various_artist=is_various_artist, track=this_track, total_tracks=track_count, album_sort=album_sort, album_type=release_type))
|
||||
|
||||
tracklist_metadata.extend(
|
||||
self.download_track(track_id, is_various_artist=is_various_artist, track=this_track,
|
||||
total_tracks=track_count, album_sort=album_sort, album_type=release_type,
|
||||
release_data=result['release']))
|
||||
|
||||
return tracklist_metadata
|
||||
|
||||
def download_track(self, mb_id, is_various_artist: bool = None, track: int = None, total_tracks: int = None, album_sort: int = None, album_type: str = None):
|
||||
def download_track(self, mb_id, is_various_artist: bool = None, track: int = None, total_tracks: int = None,
|
||||
album_sort: int = None, album_type: str = None, release_data: dict = None):
|
||||
"""
|
||||
TODO
|
||||
bpm its kind of possible via the AcousticBrainz API. however, the data may not be of very good
|
||||
@@ -159,27 +168,27 @@ class Search:
|
||||
recording-rels, release-rels, release-group-rels, series-rels, url-rels, work-rels, instrument-rels
|
||||
"""
|
||||
|
||||
result = musicbrainzngs.get_recording_by_id(mb_id, includes=["artists", "releases", "recording-rels", "isrcs", "work-level-rels"])
|
||||
result = musicbrainzngs.get_recording_by_id(mb_id, includes=["artists", "releases", "recording-rels", "isrcs",
|
||||
"work-level-rels"])
|
||||
recording_data = result['recording']
|
||||
isrc = get_elem_from_obj(recording_data, ['isrc-list', 0])
|
||||
|
||||
release_data = recording_data['release-list'][0]
|
||||
if release_data is None:
|
||||
# choosing the last release, because it is the least likely one to be a single
|
||||
release_data = recording_data['release-list'][-1]
|
||||
mb_release_id = release_data['id']
|
||||
|
||||
title = recording_data['title']
|
||||
|
||||
|
||||
|
||||
artist = []
|
||||
mb_artist_ids = []
|
||||
for artist_ in recording_data['artist-credit']:
|
||||
name_ = get_elem_from_obj(artist_, ['artist', 'name'])
|
||||
if name_ is None:
|
||||
continue
|
||||
artist.append(name_)
|
||||
mb_artist_ids.append(get_elem_from_obj(artist_, ['artist', 'id']))
|
||||
# artist = [get_elem_from_obj(artist_, ['artist', 'name']) for artist_ in recording_data['artist-credit']]
|
||||
# mb_artist_ids = [get_elem_from_obj(artist_, ['artist', 'id']) for artist_ in recording_data['artist-credit']]
|
||||
|
||||
name_ = get_elem_from_obj(artist_, ['artist', 'name'])
|
||||
if name_ is None:
|
||||
continue
|
||||
artist.append(name_)
|
||||
mb_artist_ids.append(get_elem_from_obj(artist_, ['artist', 'id']))
|
||||
|
||||
def get_additional_artist_info(mb_id_):
|
||||
r = musicbrainzngs.get_artist_by_id(mb_id_, includes=["releases"])
|
||||
|
||||
@@ -193,7 +202,8 @@ class Search:
|
||||
return album_sort
|
||||
|
||||
def get_additional_release_info(mb_id_):
|
||||
r = musicbrainzngs.get_release_by_id(mb_id_, includes=["artists", "recordings", "recording-rels", 'release-groups'])
|
||||
r = musicbrainzngs.get_release_by_id(mb_id_,
|
||||
includes=["artists", "recordings", "recording-rels", 'release-groups'])
|
||||
is_various_artist_ = len(r['release']['artist-credit']) > 1
|
||||
tracklist = r['release']['medium-list'][0]['track-list']
|
||||
track_count_ = len(tracklist)
|
||||
@@ -412,7 +422,8 @@ def interactive_demo():
|
||||
search = Search(query=input("initial query: "))
|
||||
print(search.options)
|
||||
while True:
|
||||
input_ = input("d to download, q to quit, .. for previous options, . for current options, int for this element: ").lower()
|
||||
input_ = input(
|
||||
"d to download, q to quit, .. for previous options, . for current options, int for this element: ").lower()
|
||||
input_.strip()
|
||||
if input_ == "q":
|
||||
break
|
||||
@@ -435,9 +446,12 @@ if __name__ == "__main__":
|
||||
# automated_demo()
|
||||
search = Search(query="psychonaut 4")
|
||||
# search.download_release("27f00fb8-983c-4d5c-950f-51418aac55dc")
|
||||
search.download_release("1aeb676f-e556-4b17-b45e-64ab69ef0375")
|
||||
# for track_ in search.download_artist("c0c720b5-012f-4204-a472-981403f37b12"):
|
||||
# print(track_)
|
||||
res = search.download_track("83a30323-aee1-401a-b767-b3c1bdd026c0")
|
||||
# res = search.download_track("83a30323-aee1-401a-b767-b3c1bdd026c0")
|
||||
# res = search.download_track("5e1ee2c5-502c-44d3-b1bc-22803441d8c6")
|
||||
res = search.download_track("86b43bec-eea6-40ae-8624-c1e404204ba1")
|
||||
# res = search.download_track("5cc28584-10c6-40e2-b6d4-6891e7e7c575")
|
||||
|
||||
for key in res[0]:
|
||||
|
@@ -1,5 +1,8 @@
|
||||
import logging
|
||||
import requests
|
||||
import bs4
|
||||
|
||||
import phonetic_compares
|
||||
|
||||
session = requests.Session()
|
||||
session.headers = {
|
||||
@@ -7,6 +10,7 @@ session.headers = {
|
||||
"Referer": "https://musify.club/"
|
||||
}
|
||||
|
||||
|
||||
def get_musify_url(row):
|
||||
title = row['title']
|
||||
artists = row['artist']
|
||||
@@ -22,6 +26,7 @@ def get_musify_url(row):
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_download_link(default_url):
|
||||
# https://musify.club/track/dl/18567672/rauw-alejandro-te-felicito-feat-shakira.mp3
|
||||
# /track/sundenklang-wenn-mein-herz-schreit-3883217'
|
||||
@@ -34,6 +39,10 @@ def get_download_link(default_url):
|
||||
|
||||
return f"https://musify.club/track/dl/{musify_id}/{musify_name}.mp3"
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
|
||||
>>>>>>> e923dcdaf208a95492af3afaa9e49fbbcfb9520c
|
||||
def download_from_musify(file, url):
|
||||
logging.info(f"downloading: '{url}'")
|
||||
r = session.get(url)
|
||||
@@ -46,7 +55,66 @@ def download_from_musify(file, url):
|
||||
mp3_file.write(r.content)
|
||||
logging.info("finished")
|
||||
|
||||
|
||||
def download(row):
|
||||
url = row['url']
|
||||
file_ = row['file']
|
||||
return download_from_musify(file_, url)
|
||||
|
||||
|
||||
def search_for_track(row):
|
||||
track = row.title
|
||||
artist = row.artist
|
||||
|
||||
url = f"https://musify.club/search?searchText={track}"
|
||||
r = session.get(url)
|
||||
if r.status_code != 200:
|
||||
raise ConnectionError(f"{r.url} returned {r.status_code}:\n{r.content}")
|
||||
soup = bs4.BeautifulSoup(r.content, features="html.parser")
|
||||
tracklist_container_soup = soup.find_all("div", {"class": "playlist"})
|
||||
if len(tracklist_container_soup) != 1:
|
||||
raise Exception("Connfusion Error. HTML Layout of https://musify.club changed.")
|
||||
tracklist_container_soup = tracklist_container_soup[0]
|
||||
|
||||
tracklist_soup = tracklist_container_soup.find_all("div", {"class": "playlist__details"})
|
||||
|
||||
def parse_track_soup(_track_soup):
|
||||
anchor_soups = _track_soup.find_all("a")
|
||||
band_name = anchor_soups[0].text.strip()
|
||||
title = anchor_soups[1].text.strip()
|
||||
url_ = anchor_soups[1]['href']
|
||||
return band_name, title, url_
|
||||
|
||||
for track_soup in tracklist_soup:
|
||||
band_option, title_option, track_url = parse_track_soup(track_soup)
|
||||
|
||||
title_match, title_distance = phonetic_compares.match_titles(track, title_option)
|
||||
band_match, band_distance = phonetic_compares.match_artists(artist, band_option)
|
||||
|
||||
print(track, title_option, title_match, title_distance)
|
||||
print(artist, band_option, band_match, band_distance)
|
||||
|
||||
if not title_match and not band_match:
|
||||
return get_download_link(track_url)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_musify_url_slow(row):
|
||||
print(row)
|
||||
result = search_for_track(row)
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import pandas as pd
|
||||
import json
|
||||
|
||||
df = pd.read_csv("../temp/.cache1.csv")
|
||||
print(df)
|
||||
|
||||
for idx, row in df.iterrows():
|
||||
row['artist'] = json.loads(row['artist'].replace("'", '"'))
|
||||
print("-" * 200)
|
||||
print(get_musify_url_slow(row))
|
||||
|
23
src/phonetic_compares.py
Normal file
23
src/phonetic_compares.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import jellyfish
|
||||
|
||||
TITLE_THRESHOLD_LEVENSHTEIN = 2
|
||||
|
||||
|
||||
def match_titles(title_1: str, title_2: str) -> (bool, int):
|
||||
distance = jellyfish.levenshtein_distance(title_1, title_2)
|
||||
return distance > 1, distance
|
||||
|
||||
|
||||
def match_artists(artist_1, artist_2: str) -> (bool, int):
|
||||
if type(artist_1) == list:
|
||||
distances = []
|
||||
|
||||
for artist_1_ in artist_1:
|
||||
print(artist_1_)
|
||||
match, distance = match_titles(artist_1_, artist_2)
|
||||
if not match:
|
||||
return match, distance
|
||||
|
||||
distances.append(distance)
|
||||
return True, min(distances)
|
||||
return match_titles(artist_1, artist_2)
|
@@ -1,14 +1,19 @@
|
||||
,id,album,title,artist,album_artist,tracknumber,albumsort,titlesort,isrc,date,year,musicbrainz_artistid,musicbrainz_albumid,musicbrainz_albumartistid,musicbrainz_albumstatus,total_tracks,language,musicbrainz_albumtype,compilation,releasecountry,barcode
|
||||
0,5e1ee2c5-502c-44d3-b1bc-22803441d8c6,Abgesägte Schrotflinte,Abgesägte Schrotflinte,['Crystal F'],Crystal F,1,0,1,DEVY82000223,2021-03-12,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,ca933487-97ff-4a44-ab6f-9e4fcd26ceda,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851774871
|
||||
1,71e4dd64-6479-45be-b9a0-37d4edc364fa,Das Leben danach,Schockschwerenot,['Crystal F'],Crystal F,2,0,2,DEVY82000317,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
2,c6b0ce24-b75b-40ad-a12a-1fa8a412dc14,Genug,Genug,['Crystal F'],Crystal F,3,0,3,DEVY82000308,2021-04-30,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,e9043dfa-189e-4caa-94c8-7e329d009389,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851604161
|
||||
3,d01df009-40cf-4bae-8ab4-19e70c552feb,Du willst mit mir gehen,Du willst mit mir gehen,['Crystal F'],Crystal F,4,0,4,DEVY82000296,2021-04-02,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,2659e838-ac3b-425b-935d-7cb93043bb3f,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851783668
|
||||
4,5a3d0f0f-d847-4678-b14d-f0875339ec13,Das Leben danach,Komm wir tun mir weh,['Crystal F'],Crystal F,5,0,5,DEVY82000318,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
5,8426e0e1-e14b-48ec-8e53-950fdf3b8754,Das Leben danach,S4distentreff 4,"['Crystal F', 'MXP', 'Dollar John', 'G-Ko']",Crystal F,6,0,6,DEVY82000319,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
6,1543f558-4d54-4047-a6aa-affd02e89ab4,Das Leben danach,Stehen geblieben,['Crystal F'],Crystal F,7,0,7,DEVY82000320,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
7,ccf6d043-7157-492b-bca0-78a24c0c8372,Das Leben danach,"Blau, grün, gelb","['Crystal F', 'Ruffiction']",Crystal F,8,0,8,DEVY82000321,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
8,41ad47ab-0337-4fcc-b369-5a4b1e12dc3c,Das Leben danach,Was fühlst du noch,"['Crystal F', 'Zero/Zero', 'Nils Davis', 'Taha']",Crystal F,9,0,9,DEVY82000322,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
9,ed6cc3e1-d493-4a51-973c-3adc1a6ea978,Das Leben danach,Katzen,"['Crystal F', 'Kito', 'Kirby']",Crystal F,10,0,10,DEVY82000323,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
10,b49a466f-e77b-465d-9c01-06298efb0c9d,Das Leben danach,Wach sein,['Crystal F'],Crystal F,11,0,11,DEVY82000324,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
11,86b43bec-eea6-40ae-8624-c1e404204ba1,Das Leben danach,Rote Augen,['Crystal F'],Crystal F,12,0,12,DEVY82000325,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
12,2a3dc1ae-6752-420f-b1d3-ca9e26a15c48,Das Leben danach,Schlechtes Essen,['Crystal F'],Crystal F,13,0,13,DEVY82000326,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133
|
||||
0,755e2c25-2a88-4d87-a794-580dc4886ab9,Into Light's Graven Womb,Intro,['Nocturnal Triumph'],Nocturnal Triumph,1,0,1,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,
|
||||
1,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,0,2,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,
|
||||
2,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,0,3,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,
|
||||
3,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,0,4,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,
|
||||
4,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,0,5,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,
|
||||
5,755e2c25-2a88-4d87-a794-580dc4886ab9,Into Light's Graven Womb,Intro,['Nocturnal Triumph'],Nocturnal Triumph,1,1,1,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,
|
||||
6,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,1,2,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,
|
||||
7,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,1,3,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,
|
||||
8,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,1,4,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,
|
||||
9,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,1,5,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,
|
||||
10,de6095d0-40f8-4121-8ae9-7ca8332b0fc4,The Fangs of Miseries Past,The Fires of Tragedy,['Nocturnal Triumph'],Nocturnal Triumph,1,2,1,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,
|
||||
11,4337fac9-ee73-4183-bd63-7d6b7c279e1f,The Fangs of Miseries Past,The Fangs of Miseries Past,['Nocturnal Triumph'],Nocturnal Triumph,2,2,2,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,
|
||||
12,d9118f78-34bd-4c57-8df6-34ee2775a895,The Fangs of Miseries Past,A Moon Cloaked in Despair,['Nocturnal Triumph'],Nocturnal Triumph,3,2,3,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,
|
||||
13,2e6cfa77-ee95-4c76-a802-06aa8cf8364a,The Fangs of Miseries Past,Towards Rebirth and Demise,['Nocturnal Triumph'],Nocturnal Triumph,4,2,4,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,
|
||||
14,e5eda55f-6048-4f8c-8f0f-463af2b5b9f7,Nocturnal Triumph,The Hammer of Immateriality,['Nocturnal Triumph'],Nocturnal Triumph,1,3,1,,2022-01-12,2022,6bee5e73-5340-4514-90aa-22dad13c2206,0b533827-8d1d-4881-a9bb-84cd3054d321,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,XW,
|
||||
15,4d19329f-3e48-440b-85f4-293bfc2780b7,Nocturnal Triumph,Beneath the Veins of God,['Nocturnal Triumph'],Nocturnal Triumph,2,3,2,,2022-01-12,2022,6bee5e73-5340-4514-90aa-22dad13c2206,0b533827-8d1d-4881-a9bb-84cd3054d321,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,XW,
|
||||
16,7a601bea-f05c-486b-8ce1-0bedd6099b2c,Nocturnal Triumph,Where He Slumbers in Wait,['Nocturnal Triumph'],Nocturnal Triumph,3,3,3,,2022-01-12,2022,6bee5e73-5340-4514-90aa-22dad13c2206,0b533827-8d1d-4881-a9bb-84cd3054d321,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,XW,
|
||||
17,79d7db2c-6ef7-4525-9eab-c47f3a074d1a,Nocturnal Triumph,Torn by the Weight of Reversal,['Nocturnal Triumph'],Nocturnal Triumph,4,3,4,,2022-01-12,2022,6bee5e73-5340-4514-90aa-22dad13c2206,0b533827-8d1d-4881-a9bb-84cd3054d321,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,XW,
|
||||
|
|
@@ -1,14 +1,13 @@
|
||||
,id,album,title,artist,album_artist,tracknumber,albumsort,titlesort,isrc,date,year,musicbrainz_artistid,musicbrainz_albumid,musicbrainz_albumartistid,musicbrainz_albumstatus,total_tracks,language,musicbrainz_albumtype,compilation,releasecountry,barcode,url,src
|
||||
0,5e1ee2c5-502c-44d3-b1bc-22803441d8c6,Abgesägte Schrotflinte,Abgesägte Schrotflinte,['Crystal F'],Crystal F,1,0,1,DEVY82000223,2021-03-12,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,ca933487-97ff-4a44-ab6f-9e4fcd26ceda,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851774871,https://www.youtube.com/watch?v=QLvZVY_iiUc,youtube
|
||||
1,71e4dd64-6479-45be-b9a0-37d4edc364fa,Das Leben danach,Schockschwerenot,['Crystal F'],Crystal F,2,0,2,DEVY82000317,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=VJESTJWnRhU,youtube
|
||||
2,c6b0ce24-b75b-40ad-a12a-1fa8a412dc14,Genug,Genug,['Crystal F'],Crystal F,3,0,3,DEVY82000308,2021-04-30,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,e9043dfa-189e-4caa-94c8-7e329d009389,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851604161,https://www.youtube.com/watch?v=C0-n46T22vo,youtube
|
||||
3,d01df009-40cf-4bae-8ab4-19e70c552feb,Du willst mit mir gehen,Du willst mit mir gehen,['Crystal F'],Crystal F,4,0,4,DEVY82000296,2021-04-02,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,2659e838-ac3b-425b-935d-7cb93043bb3f,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851783668,https://www.youtube.com/watch?v=D0rYWsUgDuQ,youtube
|
||||
4,5a3d0f0f-d847-4678-b14d-f0875339ec13,Das Leben danach,Komm wir tun mir weh,['Crystal F'],Crystal F,5,0,5,DEVY82000318,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=3Hq0_qc3zqo,youtube
|
||||
5,8426e0e1-e14b-48ec-8e53-950fdf3b8754,Das Leben danach,S4distentreff 4,"['Crystal F', 'MXP', 'Dollar John', 'G-Ko']",Crystal F,6,0,6,DEVY82000319,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=sFmYIN0JNec,youtube
|
||||
6,1543f558-4d54-4047-a6aa-affd02e89ab4,Das Leben danach,Stehen geblieben,['Crystal F'],Crystal F,7,0,7,DEVY82000320,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=V65bn2jN4ZE,youtube
|
||||
7,ccf6d043-7157-492b-bca0-78a24c0c8372,Das Leben danach,"Blau, grün, gelb","['Crystal F', 'Ruffiction']",Crystal F,8,0,8,DEVY82000321,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=Mo7hZ984faU,youtube
|
||||
8,41ad47ab-0337-4fcc-b369-5a4b1e12dc3c,Das Leben danach,Was fühlst du noch,"['Crystal F', 'Zero/Zero', 'Nils Davis', 'Taha']",Crystal F,9,0,9,DEVY82000322,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=T15QiksB7do,youtube
|
||||
9,ed6cc3e1-d493-4a51-973c-3adc1a6ea978,Das Leben danach,Katzen,"['Crystal F', 'Kito', 'Kirby']",Crystal F,10,0,10,DEVY82000323,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=eKCpu74GYxs,youtube
|
||||
10,b49a466f-e77b-465d-9c01-06298efb0c9d,Das Leben danach,Wach sein,['Crystal F'],Crystal F,11,0,11,DEVY82000324,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=dboTFFBUPW0,youtube
|
||||
11,86b43bec-eea6-40ae-8624-c1e404204ba1,Das Leben danach,Rote Augen,['Crystal F'],Crystal F,12,0,12,DEVY82000325,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=zvYHKYz6AGI,youtube
|
||||
12,2a3dc1ae-6752-420f-b1d3-ca9e26a15c48,Das Leben danach,Schlechtes Essen,['Crystal F'],Crystal F,13,0,13,DEVY82000326,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=XAfpge1FxLY,youtube
|
||||
0,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,0,2,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342760/nocturnal-triumph-the-key-and-the-stone.mp3,musify
|
||||
1,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,0,3,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342761/nocturnal-triumph-of-worship-and-principle.mp3,musify
|
||||
2,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,0,4,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342762/nocturnal-triumph-into-lights-graven-womb.mp3,musify
|
||||
3,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,0,5,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342763/nocturnal-triumph-desolate-chambers-echo.mp3,musify
|
||||
4,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,1,2,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342760/nocturnal-triumph-the-key-and-the-stone.mp3,musify
|
||||
5,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,1,3,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342761/nocturnal-triumph-of-worship-and-principle.mp3,musify
|
||||
6,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,1,4,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342762/nocturnal-triumph-into-lights-graven-womb.mp3,musify
|
||||
7,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,1,5,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342763/nocturnal-triumph-desolate-chambers-echo.mp3,musify
|
||||
8,de6095d0-40f8-4121-8ae9-7ca8332b0fc4,The Fangs of Miseries Past,The Fires of Tragedy,['Nocturnal Triumph'],Nocturnal Triumph,1,2,1,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131947/nocturnal-triumph-the-fires-of-tragedy.mp3,musify
|
||||
9,4337fac9-ee73-4183-bd63-7d6b7c279e1f,The Fangs of Miseries Past,The Fangs of Miseries Past,['Nocturnal Triumph'],Nocturnal Triumph,2,2,2,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131949/nocturnal-triumph-the-fangs-of-miseries-past.mp3,musify
|
||||
10,d9118f78-34bd-4c57-8df6-34ee2775a895,The Fangs of Miseries Past,A Moon Cloaked in Despair,['Nocturnal Triumph'],Nocturnal Triumph,3,2,3,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131948/nocturnal-triumph-a-moon-cloaked-in-despair.mp3,musify
|
||||
11,2e6cfa77-ee95-4c76-a802-06aa8cf8364a,The Fangs of Miseries Past,Towards Rebirth and Demise,['Nocturnal Triumph'],Nocturnal Triumph,4,2,4,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131950/nocturnal-triumph-towards-rebirth-and-demise.mp3,musify
|
||||
|
|
@@ -1,14 +1,13 @@
|
||||
,id,album,title,artist,album_artist,tracknumber,albumsort,titlesort,isrc,date,year,musicbrainz_artistid,musicbrainz_albumid,musicbrainz_albumartistid,musicbrainz_albumstatus,total_tracks,language,musicbrainz_albumtype,compilation,releasecountry,barcode,url,src,path,file,genre
|
||||
0,5e1ee2c5-502c-44d3-b1bc-22803441d8c6,Abgesägte Schrotflinte,Abgesägte Schrotflinte,['Crystal F'],Crystal F,1,0,1,DEVY82000223,2021-03-12,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,ca933487-97ff-4a44-ab6f-9e4fcd26ceda,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851774871,https://www.youtube.com/watch?v=QLvZVY_iiUc,youtube,horrorcore/Crystal F/Abgesägte Schrotflinte,horrorcore/Crystal F/Abgesägte Schrotflinte/Abgesägte Schrotflinte.mp3,horrorcore
|
||||
1,71e4dd64-6479-45be-b9a0-37d4edc364fa,Das Leben danach,Schockschwerenot,['Crystal F'],Crystal F,2,0,2,DEVY82000317,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=VJESTJWnRhU,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Schockschwerenot.mp3,horrorcore
|
||||
2,c6b0ce24-b75b-40ad-a12a-1fa8a412dc14,Das Leben danach,Genug,['Crystal F'],Crystal F,3,0,3,DEVY82000308,2021-04-30,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,e9043dfa-189e-4caa-94c8-7e329d009389,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851604161,https://www.youtube.com/watch?v=C0-n46T22vo,youtube,horrorcore/Crystal F/Genug,horrorcore/Crystal F/Genug/Genug.mp3,horrorcore
|
||||
3,d01df009-40cf-4bae-8ab4-19e70c552feb,Du willst mit mir gehen,Du willst mit mir gehen,['Crystal F'],Crystal F,4,0,4,DEVY82000296,2021-04-02,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,2659e838-ac3b-425b-935d-7cb93043bb3f,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4062851783668,https://www.youtube.com/watch?v=D0rYWsUgDuQ,youtube,horrorcore/Crystal F/Du willst mit mir gehen,horrorcore/Crystal F/Du willst mit mir gehen/Du willst mit mir gehen.mp3,horrorcore
|
||||
4,5a3d0f0f-d847-4678-b14d-f0875339ec13,Das Leben danach,Komm wir tun mir weh,['Crystal F'],Crystal F,5,0,5,DEVY82000318,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=3Hq0_qc3zqo,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Komm wir tun mir weh.mp3,horrorcore
|
||||
5,8426e0e1-e14b-48ec-8e53-950fdf3b8754,Das Leben danach,S4distentreff 4,"['Crystal F', 'MXP', 'Dollar John', 'G-Ko']",Crystal F,6,0,6,DEVY82000319,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=sFmYIN0JNec,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/S4distentreff 4.mp3,horrorcore
|
||||
6,1543f558-4d54-4047-a6aa-affd02e89ab4,Das Leben danach,Stehen geblieben,['Crystal F'],Crystal F,7,0,7,DEVY82000320,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=V65bn2jN4ZE,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Stehen geblieben.mp3,horrorcore
|
||||
7,ccf6d043-7157-492b-bca0-78a24c0c8372,Das Leben danach,"Blau, grün, gelb","['Crystal F', 'Ruffiction']",Crystal F,8,0,8,DEVY82000321,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=Mo7hZ984faU,youtube,horrorcore/Crystal F/Das Leben danach,"horrorcore/Crystal F/Das Leben danach/Blau, grün, gelb.mp3",horrorcore
|
||||
8,41ad47ab-0337-4fcc-b369-5a4b1e12dc3c,Das Leben danach,Was fühlst du noch,"['Crystal F', 'Zero/Zero', 'Nils Davis', 'Taha']",Crystal F,9,0,9,DEVY82000322,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=T15QiksB7do,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Was fühlst du noch.mp3,horrorcore
|
||||
9,ed6cc3e1-d493-4a51-973c-3adc1a6ea978,Das Leben danach,Katzen,"['Crystal F', 'Kito', 'Kirby']",Crystal F,10,0,10,DEVY82000323,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=eKCpu74GYxs,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Katzen.mp3,horrorcore
|
||||
10,b49a466f-e77b-465d-9c01-06298efb0c9d,Das Leben danach,Wach sein,['Crystal F'],Crystal F,11,0,11,DEVY82000324,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=dboTFFBUPW0,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Wach sein.mp3,horrorcore
|
||||
11,86b43bec-eea6-40ae-8624-c1e404204ba1,Das Leben danach,Rote Augen,['Crystal F'],Crystal F,12,0,12,DEVY82000325,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=zvYHKYz6AGI,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Rote Augen.mp3,horrorcore
|
||||
12,2a3dc1ae-6752-420f-b1d3-ca9e26a15c48,Das Leben danach,Schlechtes Essen,['Crystal F'],Crystal F,13,0,13,DEVY82000326,2021-06-11,2021,5cfecbe4-f600-45e5-9038-ce820eedf3d1,1aeb676f-e556-4b17-b45e-64ab69ef0375,5cfecbe4-f600-45e5-9038-ce820eedf3d1,Official,13,deu,Album,,XW,4260526714133,https://www.youtube.com/watch?v=XAfpge1FxLY,youtube,horrorcore/Crystal F/Das Leben danach,horrorcore/Crystal F/Das Leben danach/Schlechtes Essen.mp3,horrorcore
|
||||
0,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,0,2,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342760/nocturnal-triumph-the-key-and-the-stone.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/The Key and the Stone.mp3,black metal
|
||||
1,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,0,3,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342761/nocturnal-triumph-of-worship-and-principle.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Of Worship and Principle.mp3,black metal
|
||||
2,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,0,4,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342762/nocturnal-triumph-into-lights-graven-womb.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Into Light's Graven Womb.mp3,black metal
|
||||
3,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,0,5,,2016,2016,6bee5e73-5340-4514-90aa-22dad13c2206,f5910dba-3972-4250-956f-7cfa7cbd4cd1,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,,,https://musify.club/track/dl/10342763/nocturnal-triumph-desolate-chambers-echo.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Desolate Chambers Echo.mp3,black metal
|
||||
4,f0d029c3-fcfa-4ae3-b05c-9900807c3bd6,Into Light's Graven Womb,The Key and the Stone,['Nocturnal Triumph'],Nocturnal Triumph,2,1,2,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342760/nocturnal-triumph-the-key-and-the-stone.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/The Key and the Stone.mp3,black metal
|
||||
5,587999cf-d697-49e3-9c17-3d25c8d9acfe,Into Light's Graven Womb,Of Worship and Principle,['Nocturnal Triumph'],Nocturnal Triumph,3,1,3,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342761/nocturnal-triumph-of-worship-and-principle.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Of Worship and Principle.mp3,black metal
|
||||
6,f819f1f5-d3d6-4776-b56b-57b75d04844b,Into Light's Graven Womb,Into Light's Graven Womb,['Nocturnal Triumph'],Nocturnal Triumph,4,1,4,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342762/nocturnal-triumph-into-lights-graven-womb.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Into Light's Graven Womb.mp3,black metal
|
||||
7,66a00bfa-e1f0-467b-98f5-559e71538188,Into Light's Graven Womb,Desolate Chambers Echo,['Nocturnal Triumph'],Nocturnal Triumph,5,1,5,,2017-07-31,2017,6bee5e73-5340-4514-90aa-22dad13c2206,81fa66bc-425e-45c3-ad80-2a7624e380a4,6bee5e73-5340-4514-90aa-22dad13c2206,Official,5,eng,Album,,XW,,https://musify.club/track/dl/10342763/nocturnal-triumph-desolate-chambers-echo.mp3,musify,black metal/Nocturnal Triumph/Into Light's Graven Womb,black metal/Nocturnal Triumph/Into Light's Graven Womb/Desolate Chambers Echo.mp3,black metal
|
||||
8,de6095d0-40f8-4121-8ae9-7ca8332b0fc4,The Fangs of Miseries Past,The Fires of Tragedy,['Nocturnal Triumph'],Nocturnal Triumph,1,2,1,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131947/nocturnal-triumph-the-fires-of-tragedy.mp3,musify,black metal/Nocturnal Triumph/The Fangs of Miseries Past,black metal/Nocturnal Triumph/The Fangs of Miseries Past/The Fires of Tragedy.mp3,black metal
|
||||
9,4337fac9-ee73-4183-bd63-7d6b7c279e1f,The Fangs of Miseries Past,The Fangs of Miseries Past,['Nocturnal Triumph'],Nocturnal Triumph,2,2,2,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131949/nocturnal-triumph-the-fangs-of-miseries-past.mp3,musify,black metal/Nocturnal Triumph/The Fangs of Miseries Past,black metal/Nocturnal Triumph/The Fangs of Miseries Past/The Fangs of Miseries Past.mp3,black metal
|
||||
10,d9118f78-34bd-4c57-8df6-34ee2775a895,The Fangs of Miseries Past,A Moon Cloaked in Despair,['Nocturnal Triumph'],Nocturnal Triumph,3,2,3,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131948/nocturnal-triumph-a-moon-cloaked-in-despair.mp3,musify,black metal/Nocturnal Triumph/The Fangs of Miseries Past,black metal/Nocturnal Triumph/The Fangs of Miseries Past/A Moon Cloaked in Despair.mp3,black metal
|
||||
11,2e6cfa77-ee95-4c76-a802-06aa8cf8364a,The Fangs of Miseries Past,Towards Rebirth and Demise,['Nocturnal Triumph'],Nocturnal Triumph,4,2,4,,2018,2018,6bee5e73-5340-4514-90aa-22dad13c2206,874bba46-d47f-4ef3-9960-9468c6dfa536,6bee5e73-5340-4514-90aa-22dad13c2206,Official,4,eng,Album,,,,https://musify.club/track/dl/11131950/nocturnal-triumph-towards-rebirth-and-demise.mp3,musify,black metal/Nocturnal Triumph/The Fangs of Miseries Past,black metal/Nocturnal Triumph/The Fangs of Miseries Past/Towards Rebirth and Demise.mp3,black metal
|
||||
|
|
@@ -1,41 +1,52 @@
|
||||
import youtube_dl
|
||||
import pandas as pd
|
||||
import jellyfish
|
||||
import logging
|
||||
import time
|
||||
|
||||
import phonetic_compares
|
||||
|
||||
YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist':'True'}
|
||||
YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist': 'True'}
|
||||
YOUTUBE_URL_KEY = 'webpage_url'
|
||||
YOUTUBE_TITLE_KEY = 'title'
|
||||
WAIT_BETWEEN_BLOCK = 10
|
||||
MAX_TRIES = 3
|
||||
|
||||
|
||||
def get_youtube_from_isrc(isrc: str):
|
||||
# https://stackoverflow.com/questions/63388364/searching-youtube-videos-using-youtube-dl
|
||||
with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
|
||||
video = ydl.extract_info(f"ytsearch:{isrc}", download=False)['entries'][0]
|
||||
print(type(video))
|
||||
if YOUTUBE_URL_KEY not in video:
|
||||
return None
|
||||
return {
|
||||
videos = ydl.extract_info(f"ytsearch:{isrc}", download=False)['entries']
|
||||
|
||||
return [{
|
||||
'url': video[YOUTUBE_URL_KEY],
|
||||
'title': video['title']
|
||||
}
|
||||
'title': video[YOUTUBE_TITLE_KEY]
|
||||
} for video in videos]
|
||||
|
||||
|
||||
def get_youtube_url(row):
|
||||
if pd.isna(row['isrc']):
|
||||
return None
|
||||
real_title = row['title'].lower()
|
||||
|
||||
result = get_youtube_from_isrc(row['isrc'])
|
||||
video_title = result['title'].lower()
|
||||
final_result = None
|
||||
results = get_youtube_from_isrc(row['isrc'])
|
||||
for result in results:
|
||||
video_title = result['title'].lower()
|
||||
match, distance = phonetic_compares.match_titles(video_title, real_title)
|
||||
|
||||
phonetic_distance = jellyfish.levenshtein_distance(real_title, video_title)
|
||||
if match:
|
||||
logging.warning(
|
||||
f"dont downloading {result['url']} cuz the phonetic distance ({distance}) between {real_title} and {video_title} is to high.")
|
||||
continue
|
||||
|
||||
print(real_title, video_title, phonetic_distance)
|
||||
if phonetic_distance > 1:
|
||||
logging.warning(f"dont downloading {result['url']} cuz the phonetic distance ({phonetic_distance}) between {real_title} and {video_title} is to high.")
|
||||
final_result = result
|
||||
|
||||
if final_result is None:
|
||||
return None
|
||||
return result['url']
|
||||
return final_result['url']
|
||||
|
||||
def download(row):
|
||||
|
||||
def download(row, trie: int = 0):
|
||||
url = row['url']
|
||||
file_ = row['file']
|
||||
options = {
|
||||
@@ -49,11 +60,20 @@ def download(row):
|
||||
'outtmpl': file_
|
||||
}
|
||||
|
||||
with youtube_dl.YoutubeDL(options) as ydl:
|
||||
ydl.download([url])
|
||||
try:
|
||||
with youtube_dl.YoutubeDL(options) as ydl:
|
||||
ydl.download([url])
|
||||
except youtube_dl.utils.DownloadError:
|
||||
logging.warning(f"youtube blocked downloading. ({trie}-{MAX_TRIES})")
|
||||
if trie >= MAX_TRIES:
|
||||
logging.warning("too many tries, returning")
|
||||
logging.warning(f"retrying in {WAIT_BETWEEN_BLOCK} seconds again")
|
||||
time.sleep(WAIT_BETWEEN_BLOCK)
|
||||
return download(row, trie=trie+1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# example isrc that exists on youtube music
|
||||
# example isrc that exists on YouTube music
|
||||
ISRC = "DEUM71500715"
|
||||
result = get_youtube_from_isrc(ISRC)
|
||||
print(result)
|
||||
|
Reference in New Issue
Block a user