97 lines
3 KiB
Python
97 lines
3 KiB
Python
import common
|
|
import os
|
|
import fnmatch
|
|
import json
|
|
from fuzzywuzzy import fuzz
|
|
|
|
|
|
def get_local_library(root_dir):
|
|
music_extensions = ('*.mp3', '*.flac', '*.wav', '*.aac', '*.ogg', '*.m4a')
|
|
music_files_map = {}
|
|
for dir_path, dir_names, filenames in os.walk(root_dir):
|
|
for pattern in music_extensions:
|
|
for filename in fnmatch.filter(filenames, pattern):
|
|
song_name = os.path.splitext(filename)[0]
|
|
relative_path = os.path.relpath(os.path.join(dir_path, filename), root_dir)
|
|
music_files_map[song_name] = relative_path
|
|
return music_files_map
|
|
|
|
|
|
def get_matched(pattern, patterns):
|
|
result = {}
|
|
for target_pattern in patterns:
|
|
similarity_score = fuzz.token_set_ratio(pattern, target_pattern)
|
|
result[target_pattern] = similarity_score / 100
|
|
|
|
sorted_results = sorted(result.items(), key=lambda item: item[1], reverse=True)
|
|
return sorted_results
|
|
|
|
|
|
def resolve_tracks(source_patterns, target_patterns):
|
|
from tqdm import tqdm
|
|
|
|
pattern_map = {}
|
|
|
|
total = len(source_patterns)
|
|
with tqdm(total=total, desc='Progress') as pbar:
|
|
for pattern in source_patterns:
|
|
res = get_matched(pattern, target_patterns)
|
|
matched = {"score": 0, "items": []}
|
|
if len(res) and res[0][1] > 0.9:
|
|
matched['items'] = res[0:min(len(res), 2)]
|
|
matched['score'] = res[0][1]
|
|
pattern_map[pattern] = matched
|
|
pbar.update(1)
|
|
|
|
return pattern_map
|
|
|
|
|
|
def resolver1(local_library):
|
|
track_descriptions = common.get_data("tracks")
|
|
|
|
source_patterns = []
|
|
for track in track_descriptions:
|
|
artists = common.get_artists_str(track['track']['artists'])
|
|
pattern = f"{track['track']['name']} {artists}"
|
|
source_patterns.append(pattern)
|
|
|
|
target_patterns = [local for _, local in local_library.items()]
|
|
|
|
pattern_map = resolve_tracks(source_patterns, target_patterns)
|
|
|
|
with open('prefetched/resolved.json', 'w') as file:
|
|
json.dump(pattern_map, file, indent=2)
|
|
|
|
|
|
def resolver2(local_library):
|
|
found_tracks = common.get_data("local_library_on_spotify")
|
|
track_descriptions = common.get_data("tracks")
|
|
|
|
user_tracks_ids = {track['track']['id']: track for track in track_descriptions}
|
|
|
|
resolved_map = {}
|
|
|
|
for name, found in found_tracks.items():
|
|
if not len(found):
|
|
continue
|
|
track_id = found[0]['id']
|
|
if track_id in user_tracks_ids:
|
|
resolved_map[name] = track_id
|
|
|
|
with open('prefetched/resolved2.json', 'w') as file:
|
|
json.dump(resolved_map, file, indent=2)
|
|
|
|
def resolve(root_directory):
|
|
local_library = get_local_library(root_directory)
|
|
with open('prefetched/local_library.json', 'w') as file:
|
|
json.dump(local_library, file, indent=2)
|
|
|
|
resolver2(local_library)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# root_directory = "/mnt/main/data/music/raw"
|
|
#root_directory = input("root: ")
|
|
resolve("/mnt/main/data/music/raw")
|
|
|
|
|