def download_playlist(dir, link, list_name, append_pl=False):
    
    if list_name is None:
        list_name = "playlist"
    if list_name == "":
        list_name = "playlist"

    dir_base = dir
    folder = 'mp3-songs'
    directory = '{}/{}'.format(dir_base, folder)
    exists = os.path.exists(directory)
    i = -1
    while exists:
        i += 1
        exists = os.path.exists(directory + str(i))
    if i >= 0:
        folder += str(i)
        directory += str(i)

    os.mkdir(directory)

    print("Beginning download for playlist: {}\nDownloading from link: {}".format(list_name, link))

    if link.find("music.") < 0:
        proc = Process(target=download_yt_direct, args=(link, directory, dir_base, folder, list_name, append_pl))
        proc.start()
        return proc

    playlistId = link[link.find("list=")+5:]
    playlistId_find = playlistId.find("&")
    if playlistId_find > 0:
        playlistId = playlistId[:playlistId_find]
    
    youtube = YTMusic()
    playlist_for_count = youtube.get_playlist(playlistId=playlistId, limit=1)
    playlist = youtube.get_playlist(playlistId=playlistId, limit=playlist_for_count['trackCount'])

    log_str = "--- WHILE OBTAINING PLAYLIST ---\n"
    log_str_orig_len = len(log_str)
    for track in playlist['tracks']:
        videoId = track['videoId']
        if videoId is None:
            log_str += "NOT FOUND: {}.\n".format(track['artists'][0]['name'] + " - " + track['title'])
            query = ""
            for artist in track['artists']:
                query += artist['name'] + " "
            query += track['title']
            search_list = youtube.search(query=query, filter='songs', limit=1, ignore_spelling=True)
            if len(search_list) == 0 or search_list[0]['videoId'] is None:
                query = track['artists'][0]['name'] + " " + track['title']
                search_list = youtube.search(query=query, filter='songs', limit=1, ignore_spelling=True)
                if len(search_list) == 0 or search_list[0]['videoId'] is None:
                    query = track['title']
                    search_list = youtube.search(query=query, filter='songs', limit=1, ignore_spelling=True)
                    if len(search_list) == 0 or search_list[0]['videoId'] is None:
                        search_list = youtube.search(query=query, filter='songs', limit=1, ignore_spelling=False)
            if len(search_list) > 0 and search_list[0]['videoId'] is not None:
                track['videoId'] = search_list[0]['videoId']
                track['artists'] = search_list[0]['artists']
                track['title'] = search_list[0]['title']
                videoId = track['videoId']
                log_str += "REPLACEMENT FOUND: {}.\n".format(track['artists'][0]['name'] + " - " + track['title'])
            else:
                log_str += "NO REPLACEMENT FOUND.\n"

    if len(log_str) == log_str_orig_len:
        log_str = ""
    
    proc = Process(target=download_tracks, args=(playlist, directory, dir_base, folder, list_name, log_str, append_pl))
    proc.start()
    return proc
                        try:
                            check_album = check_album.encode(
                                'ascii', 'ignore').decode('ascii')
                        except:
                            check_album = ''

                # search for song in Youtube Music
                # trying multiple combinations of song, artist, album. filename
                # still cannot get every song in a playlist to successufully return from YTM uploads search

                songDict = songDict1 = songDict2 = songDict3 = list()
                searchFor1 = check_artist + " - "
                if check_album:
                    searchFor1 += check_album + " - "
                    searchFor1 += check_title
                    songDict1 = ytm.search(searchFor1, 'uploads', limit=40)

                searchFor2 = check_artist + " - " + check_title
                songDict2 = ytm.search(searchFor2, 'uploads', limit=40)

                searchFor3 = check_title
                songDict3 = ytm.search(searchFor3, 'uploads', limit=40)

                songDict.extend(songDict1)
                songDict.extend(songDict2)
                songDict.extend(songDict3)

                # scan songDict to find song's id (videoID in YTM)
                sd_find = 0
                for sd in songDict:
                    if sd['resultType'] == 'song' and sd[
Esempio n. 3
0
#!/usr/bin/env python

from ytmusicapi.ytmusic import YTMusic


ytm = YTMusic('headers_auth.json')

searchList = list()

searchList.append("Lee Moses - Hey Joe")
searchList.append("Joe Bataan - CALL MY NAME")
searchList.append("Creep")
searchList.append("H.E.R. - Fight For You")
searchList.append("Ugly Casanova - Barnacles")


for searchFor in searchList:
   
    print("Querying YTMusic for : " + searchFor)
    songDict = ytm.search(searchFor, 'uploads', limit=40)

    print("Result : ")
    print(str(songDict))