rootshellz / Beatporter

Scrape Beatport charts and add songs to Spotify playlists
MIT License
35 stars 6 forks source link

Adding most popular matching track when no track matches duration is a bad idea... #20

Open lorenzolamasse opened 1 week ago

lorenzolamasse commented 1 week ago

Hi,

Made a slight modif in my local base to avoid adding a random matching track when there is no track matching the exact duration. It's mostly the case with remixes and extended versions that are not (yet) available on Spotify. I personally prefer skipping these tracks instead of adding a random version of them:

def best_of_multiple_matches(source_track, found_tracks):
    counter = 1
    duration_matches = [
        0,
    ]
    for track in found_tracks:
        print("\t\t\t[+] Match {}: {}".format(counter, track["id"]))
        if do_durations_match(source_track["duration_ms"], track["duration_ms"]):
            duration_matches[0] += 1
            duration_matches.append(track)
        counter += 1
    if duration_matches[0] == 1:
        best_track = duration_matches.pop()["id"]
        print(
            "\t\t\t[+] Only one exact match with matching duration, going with that one: {}".format(
                best_track
            )
        )
        return best_track
    else:
        if duration_matches[0] == 0:
            print("No track with matching duration, ignoring track !")
        else:

            # TODO: Popularity does not always yield the correct result
            best_track = most_popular_track(found_tracks)
            print(
                "\t\t\t[+] Multiple exact matches with matching durations, going with the most popular one: {}".format(
                best_track
                )
                )
            return best_track
lorenzolamasse commented 1 week ago

Modified a slight bit as well the duration matching as it happens quite often to have around 1 seconds of duration difference between platforms:

def do_durations_match(source_track_duration, found_track_duration):
    if abs(source_track_duration - found_track_duration) < 1000:
        print("\t\t\t\t[+] Durations match")
        return True
    else:
        print("\t\t\t\t[!] Durations do not match")
        return False