예제 #1
0
class ModelHandler:

    def __init__(self):
        self.spotify_api = SpotifyAPI()
        self.ml = ML()

    def _write_mp3s(self, path, track_dict):
        content = self.spotify_api.get_mp3(track_dict['url'])
        if content:
            write_file(f'{path}/{track_dict["id"]}.mp3', content)

    def write_mp3s(self, tracks_dict, path):
        func = partial(self._write_mp3s, path)
        with Pool(4) as p:
            p.map(func, tracks_dict)

    def create_model(self, uid, tracks_dict):
        if uid not in os.listdir():
            os.mkdir(uid)
            os.mkdir(f"{uid}/liked")
            self.write_mp3s(tracks_dict, f"{uid}/liked")
            self.ml.train_model(f"{uid}/liked", path_to_save=f"{uid}/model", uid=uid)

    def classify_tracks(self, training_tracks, tracks_to_classify, search_term, uid):
        if uid not in os.listdir():
            return None
        if search_term not in os.listdir():
            os.mkdir(search_term)
            self.write_mp3s(training_tracks, f"{search_term}")
            self.ml.train_model(f"{search_term}", path_to_save=f"{search_term}/model")
            file_paths = []
            for track_to_classify in tracks_to_classify:
                file_paths.append(f"{uid}/liked/{track_to_classify['id']}.mp3")
            track_ids = self.ml.classify_tracks(file_paths, f"{search_term}/model", search_term)
        else:
            file_paths = []
            for track_to_classify in tracks_to_classify:
                file_paths.append(f"{uid}/liked/{track_to_classify['id']}.mp3")
            track_ids = self.ml.classify_tracks(file_paths, f"{search_term}/model", search_term)
        return track_ids

    def curated_tracks(self, tracks_to_classify, uid):
        if f"{uid}" not in os.listdir() or "model" not in os.listdir(f"{uid}"):
            return None
        os.mkdir(f'{uid}/tmp')
        self.write_mp3s(tracks_to_classify, f"{uid}/tmp")
        file_paths = []
        for track_to_classify in tracks_to_classify:
            file_paths.append(f"{uid}/tmp/{track_to_classify['id']}.mp3")
        track_ids = self.ml.classify_tracks(file_paths, f"{uid}/model", "liked")
        shutil.rmtree(f'{uid}/tmp')
        return track_ids

    def check_personal_model(self, user_id):
        files = os.listdir()
        if user_id in files and 'model' in os.listdir(user_id):
            return 1
        elif user_id in files and 'model' not in os.listdir(user_id):
            return 0
        else:
            return -1
예제 #2
0
 def test_classify_tracks(self):
     ml = ML()
     ml.classify_tracks(['test_music/514q3otlT6HczfChuLDUSa.mp3'],
                        "tester_model", "test_music")