def download_spotify_playlist_and_queue_and_zip(playlist_name, playlist_id, add_to_playlist, create_zip): songs = get_songs_from_spotify_website(playlist_id) songs_absolute_location = [] print(f"We got {len(songs)} songs from the Spotify playlist") for i, song_of_playlist in enumerate(songs): report_progress(i, len(songs)) # song_of_playlist: string (artist - song) try: track_id = deezer_search( song_of_playlist, TYPE_TRACK)[0]['id'] #[0] can throw IndexError song = get_song_infos_from_deezer_website(TYPE_TRACK, track_id) absolute_filename = download_song_and_get_absolute_filename( TYPE_PLAYLIST, song, playlist_name) songs_absolute_location.append(absolute_filename) except (IndexError, Deezer403Exception, Deezer404Exception) as msg: print(msg) print( f"Could not find Spotify song ({song_of_playlist}) on Deezer?") # return update_mpd_db(songs_absolute_location, add_to_playlist) songs_with_m3u8_file = create_m3u8_file(songs_absolute_location) if create_zip: return [create_zip_file(songs_with_m3u8_file)] return make_song_paths_relative_to_mpd_root(songs_absolute_location)
def test_get_track_infos_from_website(self): song = get_song_infos_from_deezer_website(TYPE_TRACK, "69962764") self.assertIsInstance(song, dict) song_keys = list(song.keys()) for key in known_song_keys: self.assertIn(key, song_keys) self.assertEqual(song["SNG_ID"], "69962764") self.assertEqual(song["ART_NAME"], "The Clash") self.assertEqual(song["SNG_TITLE"], "Should I Stay or Should I Go") self.assertEqual(song["MD5_ORIGIN"], "df51967a8b9b88d079fb0d9f4a0c1c38")
def test_get_album_infos_from_website(self): songs = get_song_infos_from_deezer_website(TYPE_ALBUM, "1434890") self.assertIsInstance(songs, list) self.assertEqual(len(songs), 15) for song in songs: song_keys = list(song.keys()) for key in known_song_keys: self.assertIn(key, song_keys) self.assertEqual(songs[0]["SNG_ID"], "15523769") self.assertEqual(songs[0]["ART_NAME"], "System of a Down") self.assertEqual(songs[0]["SNG_TITLE"], "Prison Song") self.assertEqual(len(songs[14]["MD5_ORIGIN"]), 32) self.assertEqual(songs[1]["SNG_ID"], "15523770") self.assertEqual(songs[1]["ART_NAME"], "System of a Down") self.assertEqual(songs[1]["SNG_TITLE"], "Needles") self.assertEqual(songs[2]["SNG_ID"], "15523772") self.assertEqual(songs[2]["ART_NAME"], "System of a Down") self.assertEqual(songs[2]["SNG_TITLE"], "Deer Dance") self.assertEqual(songs[3]["SNG_ID"], "15523775") self.assertEqual(songs[3]["ART_NAME"], "System of a Down") self.assertEqual(songs[3]["SNG_TITLE"], "Jet Pilot") self.assertEqual(songs[4]["SNG_ID"], "15523778") self.assertEqual(songs[4]["ART_NAME"], "System of a Down") self.assertEqual(songs[4]["SNG_TITLE"], "X") self.assertEqual(songs[5]["SNG_ID"], "15523781") self.assertEqual(songs[5]["ART_NAME"], "System of a Down") self.assertEqual(songs[5]["SNG_TITLE"], "Chop Suey!") self.assertEqual(songs[6]["SNG_ID"], "15523784") self.assertEqual(songs[6]["ART_NAME"], "System of a Down") self.assertEqual(songs[6]["SNG_TITLE"], "Bounce") self.assertEqual(songs[7]["SNG_ID"], "15523788") self.assertEqual(songs[7]["ART_NAME"], "System of a Down") self.assertEqual(songs[7]["SNG_TITLE"], "Forest") self.assertEqual(songs[8]["SNG_ID"], "15523790") self.assertEqual(songs[8]["ART_NAME"], "System of a Down") self.assertEqual(songs[8]["SNG_TITLE"], "ATWA") self.assertEqual(songs[9]["SNG_ID"], "15523791") self.assertEqual(songs[9]["ART_NAME"], "System of a Down") self.assertEqual(songs[9]["SNG_TITLE"], "Science") self.assertEqual(songs[10]["SNG_ID"], "15523792") self.assertEqual(songs[10]["ART_NAME"], "System of a Down") self.assertEqual(songs[10]["SNG_TITLE"], "Shimmy") self.assertEqual(songs[11]["SNG_ID"], "15523793") self.assertEqual(songs[11]["ART_NAME"], "System of a Down") self.assertEqual(songs[11]["SNG_TITLE"], "Toxicity") self.assertEqual(songs[12]["SNG_ID"], "15523796") self.assertEqual(songs[12]["ART_NAME"], "System of a Down") self.assertEqual(songs[12]["SNG_TITLE"], "Psycho") self.assertEqual(songs[13]["SNG_ID"], "15523799") self.assertEqual(songs[13]["ART_NAME"], "System of a Down") self.assertEqual(songs[13]["SNG_TITLE"], "Aerials") self.assertEqual(songs[14]["SNG_ID"], "15523803") self.assertEqual(songs[14]["ART_NAME"], "System of a Down") self.assertEqual(songs[14]["SNG_TITLE"], "Arto")
def download_deezer_album_and_queue_and_zip(album_id, add_to_playlist, create_zip): songs = get_song_infos_from_deezer_website(TYPE_ALBUM, album_id) songs_absolute_location = [] for i, song in enumerate(songs): report_progress(i, len(songs)) assert type(song) == dict absolute_filename = get_absolute_filename(TYPE_ALBUM, song) songs_absolute_location.append(absolute_filename) update_mpd_db(songs_absolute_location, add_to_playlist) if create_zip: return [create_zip_file(songs_absolute_location)] return make_song_paths_relative_to_mpd_root(songs_absolute_location)
def test_download_song_valid(self): song_infos = deezer_search("faber tausendfrankenlang", TYPE_TRACK)[0] song = get_song_infos_from_deezer_website(TYPE_TRACK, song_infos['id']) try: os.remove(test_song) except FileNotFoundError: # if we remove a file that does not exist pass download_song(song, test_song) file_exists = os.path.exists(test_song) self.assertEqual(file_exists, True) file_type = magic.from_file(test_song) self.assertEqual(file_type, "Audio file with ID3 version 2.3.0, contains:MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo") os.remove(test_song)
def test_download_song_valid_flac(self): config['deezer']['flac_quality'] = "True" song_infos = deezer_search("faber tausendfrankenlang", TYPE_TRACK)[0] song = get_song_infos_from_deezer_website(TYPE_TRACK, song_infos['id']) try: os.remove(test_song) except FileNotFoundError: # if we remove a file that does not exist pass download_song(song, test_song) file_exists = os.path.exists(test_song) self.assertEqual(file_exists, True) file_type = magic.from_file(test_song) self.assertEqual(file_type, 'Audio file with ID3 version 2.3.0, contains:FLAC audio bitstream data, 16 bit, stereo, 44.1 kHz, 10062444 samples') os.remove(test_song)
def download_deezer_favorites(user_id: str, add_to_playlist: bool, create_zip: bool): songs_absolute_location = [] output_directory = f"favorites_{user_id}" favorite_songs = get_deezer_favorites(user_id) for i, fav_song in enumerate(favorite_songs): report_progress(i, len(favorite_songs)) try: song = get_song_infos_from_deezer_website(TYPE_TRACK, fav_song) absolute_filename = download_song_and_get_absolute_filename( TYPE_PLAYLIST, song, output_directory) songs_absolute_location.append(absolute_filename) except (IndexError, Deezer403Exception, Deezer404Exception) as msg: print(msg) print(f"Could not find song ({fav_song}) on Deezer?") update_mpd_db(songs_absolute_location, add_to_playlist) songs_with_m3u8_file = create_m3u8_file(songs_absolute_location) if create_zip: return [create_zip_file(songs_with_m3u8_file)] return make_song_paths_relative_to_mpd_root(songs_absolute_location)
def test_get_invalid_album_infos_from_website(self): with self.assertRaises(Deezer404Exception): get_song_infos_from_deezer_website(TYPE_ALBUM, "thisdoesnotexist")
def test_get_album_infos_from_website(self): songs = get_song_infos_from_deezer_website(TYPE_ALBUM, "1434890") self.assertIsInstance(songs, list) self.assertEqual(len(songs), 15) for song in songs: song_keys = list(song.keys()) for key in known_song_keys: self.assertIn(key, song_keys) self.assertEqual(songs[0]["SNG_ID"], "15523769") self.assertEqual(songs[0]["ART_NAME"], "System of a Down") self.assertEqual(songs[0]["SNG_TITLE"], "Prison Song") self.assertEqual(songs[0]["MD5_ORIGIN"], "420dcfb48009fcbc806ba03397c1f651") self.assertEqual(songs[1]["SNG_ID"], "15523770") self.assertEqual(songs[1]["ART_NAME"], "System of a Down") self.assertEqual(songs[1]["SNG_TITLE"], "Needles") self.assertEqual(songs[1]["MD5_ORIGIN"], "19c32852ccef718fc5c6282f1d132e02") self.assertEqual(songs[2]["SNG_ID"], "15523772") self.assertEqual(songs[2]["ART_NAME"], "System of a Down") self.assertEqual(songs[2]["SNG_TITLE"], "Deer Dance") self.assertEqual(songs[2]["MD5_ORIGIN"], "ac8b7cb27c49613789ac006cbcdd154c") self.assertEqual(songs[3]["SNG_ID"], "15523775") self.assertEqual(songs[3]["ART_NAME"], "System of a Down") self.assertEqual(songs[3]["SNG_TITLE"], "Jet Pilot") self.assertEqual(songs[3]["MD5_ORIGIN"], "daff36398802a0d8a0b19b414e0e161f") self.assertEqual(songs[4]["SNG_ID"], "15523778") self.assertEqual(songs[4]["ART_NAME"], "System of a Down") self.assertEqual(songs[4]["SNG_TITLE"], "X") self.assertEqual(songs[4]["MD5_ORIGIN"], "f63415cdf261e4cf1af4373f1e06142c") self.assertEqual(songs[5]["SNG_ID"], "15523781") self.assertEqual(songs[5]["ART_NAME"], "System of a Down") self.assertEqual(songs[5]["SNG_TITLE"], "Chop Suey!") self.assertEqual(songs[5]["MD5_ORIGIN"], "2ea5a63b02e940e24fc8b0e66f5bee4a") self.assertEqual(songs[6]["SNG_ID"], "15523784") self.assertEqual(songs[6]["ART_NAME"], "System of a Down") self.assertEqual(songs[6]["SNG_TITLE"], "Bounce") self.assertEqual(songs[6]["MD5_ORIGIN"], "53bc9a023d71548cbdbdb70ec9836a29") self.assertEqual(songs[7]["SNG_ID"], "15523788") self.assertEqual(songs[7]["ART_NAME"], "System of a Down") self.assertEqual(songs[7]["SNG_TITLE"], "Forest") self.assertEqual(songs[7]["MD5_ORIGIN"], "5eeb6b94ad83f82291d5d28a1f7f6a1d") self.assertEqual(songs[8]["SNG_ID"], "15523790") self.assertEqual(songs[8]["ART_NAME"], "System of a Down") self.assertEqual(songs[8]["SNG_TITLE"], "ATWA") self.assertEqual(songs[8]["MD5_ORIGIN"], "9260b62ed22b9f8c4087a6086e2e2257") self.assertEqual(songs[9]["SNG_ID"], "15523791") self.assertEqual(songs[9]["ART_NAME"], "System of a Down") self.assertEqual(songs[9]["SNG_TITLE"], "Science") self.assertEqual(songs[9]["MD5_ORIGIN"], "3b24c6f38ceda1b1d0411685f44e35dd") self.assertEqual(songs[10]["SNG_ID"], "15523792") self.assertEqual(songs[10]["ART_NAME"], "System of a Down") self.assertEqual(songs[10]["SNG_TITLE"], "Shimmy") self.assertEqual(songs[10]["MD5_ORIGIN"], "cfb0b6287d8e289cabcf8230c7872ec0") self.assertEqual(songs[11]["SNG_ID"], "15523793") self.assertEqual(songs[11]["ART_NAME"], "System of a Down") self.assertEqual(songs[11]["SNG_TITLE"], "Toxicity") self.assertEqual(songs[11]["MD5_ORIGIN"], "2ff5bf53a6369e0b3baf069828251a10") self.assertEqual(songs[12]["SNG_ID"], "15523796") self.assertEqual(songs[12]["ART_NAME"], "System of a Down") self.assertEqual(songs[12]["SNG_TITLE"], "Psycho") self.assertEqual(songs[12]["MD5_ORIGIN"], "ece5a3e11493edc8534fbd8a38040cdf") self.assertEqual(songs[13]["SNG_ID"], "15523799") self.assertEqual(songs[13]["ART_NAME"], "System of a Down") self.assertEqual(songs[13]["SNG_TITLE"], "Aerials") self.assertEqual(songs[13]["MD5_ORIGIN"], "ded406e94f8fe78513e1e4e6e00a7151") self.assertEqual(songs[14]["SNG_ID"], "15523803") self.assertEqual(songs[14]["ART_NAME"], "System of a Down") self.assertEqual(songs[14]["SNG_TITLE"], "Arto") self.assertEqual(songs[14]["MD5_ORIGIN"], "8e43717a1585e8e080a987584d6051c9")
def download_deezer_song_and_queue(track_id, add_to_playlist): song = get_song_infos_from_deezer_website(TYPE_TRACK, track_id) absolute_filename = download_song_and_get_absolute_filename( TYPE_TRACK, song) update_mpd_db(absolute_filename, add_to_playlist) return make_song_paths_relative_to_mpd_root([absolute_filename])