Skip to content

Commit 364b825

Browse files
authored
Merge pull request #18 from casualsnek/development
Handle unavailable tracks properly
2 parents 5735587 + 10632f6 commit 364b825

File tree

4 files changed

+48
-34
lines changed

4 files changed

+48
-34
lines changed

gui/mainui.py

+29-22
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ def dl_progress_update(data):
2424
progress = data[2]
2525
try:
2626
if status is not None:
27-
if 'failed' == status.lower() or 'cancelled' == status.lower():
27+
if status.lower() in ['failed', 'cancelled', 'unavailable']:
2828
downloads_status[media_id]["btn"]['cancel'].hide()
29-
downloads_status[media_id]["btn"]['retry'].show()
29+
if status.lower() != "unavailable":
30+
downloads_status[media_id]["btn"]['retry'].show()
3031
if 'downloading' == status.lower():
3132
downloads_status[media_id]["btn"]['cancel'].show()
3233
downloads_status[media_id]["btn"]['retry'].hide()
@@ -52,7 +53,7 @@ def dl_progress_update(data):
5253

5354

5455
def retry_all_failed_downloads():
55-
for dl_id in failed_downloads.keys():
56+
for dl_id in list(failed_downloads.keys()):
5657
downloads_status[dl_id]["status_label"].setText("Waiting")
5758
downloads_status[dl_id]["btn"]['cancel'].show()
5859
downloads_status[dl_id]["btn"]['retry'].hide()
@@ -62,12 +63,12 @@ def retry_all_failed_downloads():
6263

6364
def cancel_all_downloads():
6465
for did in downloads_status.keys():
66+
print('Trying to cancel : ', did)
6567
try:
66-
if downloads_status[did]['progress_bar'].value() < 95:
67-
if did not in cancel_list:
68-
cancel_list[did] = {}
68+
if downloads_status[did]['progress_bar'].value() < 95 and did not in cancel_list:
69+
cancel_list[did] = {}
6970
except (KeyError, RuntimeError):
70-
pass
71+
logger.info('Cannot cancel media id: {did}, this might have been cleared')
7172

7273

7374
class MainWindow(QMainWindow):
@@ -251,6 +252,23 @@ def __toggle_advanced(self):
251252

252253
def __add_item_to_downloads(self, item):
253254
# Create progress status
255+
if item['item_id'] in downloads_status:
256+
# If the item is in download status dictionary, it's not cleared from view
257+
logger.info('The media: {item["item"]} was already in view')
258+
if item['item_id'] in cancel_list:
259+
logger.info('The media: {item["item"]} was being cancelled, preventing cancellation !')
260+
cancel_list.pop(item['item_id'])
261+
elif item['item_id'] in failed_downloads:
262+
dl_id = item['item_id']
263+
logger.info('The media: {item["item"]} had failed to download, re-downoading ! !')
264+
downloads_status[dl_id]["status_label"].setText("Waiting")
265+
downloads_status[dl_id]["btn"]['cancel'].show()
266+
downloads_status[dl_id]["btn"]['retry'].hide()
267+
download_queue.put(failed_downloads[dl_id].copy())
268+
failed_downloads.pop(dl_id)
269+
else:
270+
logger.info('The media: {item["item"]} is already in queue and is being downloaded, ignoring.. !')
271+
return None
254272
pbar = QProgressBar()
255273
pbar.setValue(0)
256274
cancel_btn = QPushButton()
@@ -654,21 +672,10 @@ def __mass_action_dl(self, result_type):
654672

655673
def rem_complete_from_table(self):
656674
logger.info('Clearing complete downloads')
657-
complete_ids = []
658-
for dl_id in downloads_status.keys():
659-
try:
660-
logger.info(f"Checking download status for media id: {dl_id}, "
661-
f"{downloads_status[dl_id]['progress_bar'].value()}")
662-
if downloads_status[dl_id]['progress_bar'].value() == 100 or \
663-
downloads_status[dl_id]['status_label'].text().lower() == 'cancelled':
664-
logger.info(f'ID: {dl_id} is complete or cancelled')
665-
complete_ids.append(dl_id)
666-
except (RuntimeError, AttributeError):
667-
logger.info(f"Checking download status for media id: {dl_id}, Runtime error->Removing")
668-
complete_ids.append(dl_id)
669675
rows = self.tbl_dl_progress.rowCount()
670676
for i in range(rows):
671-
id_val = self.tbl_dl_progress.item(i, 0).text()
672-
if id_val in complete_ids:
677+
progress = self.tbl_dl_progress.item(i, 5).value()
678+
status = self.tbl_dl_progress.item(i, 4).text()
679+
if progress == 100 or status in ['cancelled', 'unavailable']:
673680
self.tbl_dl_progress.removeRow(i)
674-
downloads_status.pop(id_val)
681+
downloads_status.pop(self.tbl_dl_progress.item(i, 0).text())

runtimedata.py

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
downloads_status = {}
2626
playlist_m3u_queue = {}
2727
downloaded_data = {}
28+
unavailable = set()
2829

2930
loglevel = int(os.environ.get("LOG_LEVEL", 20))
3031

worker/downloader.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from librespot.audio.decoders import AudioQuality, VorbisOnlyAudioQuality
88
from librespot.metadata import TrackId, EpisodeId
99
from otsconfig import config
10-
from runtimedata import get_logger, cancel_list, failed_downloads
10+
from runtimedata import get_logger, cancel_list, failed_downloads, unavailable
1111
from utils.spotify import check_premium, get_song_info, convert_audio_format, set_music_thumbnail, set_audio_tags, \
1212
get_episode_info, get_track_lyrics
1313

@@ -30,9 +30,11 @@ def download_track(self, session, track_id_str, extra_paths="", force_album_form
3030
f"Downloading track by id '{track_id_str}', extra_paths: '{extra_paths}', "
3131
f"extra_path_as_root: '{extra_path_as_root}' ")
3232
if trk_track_id_str in cancel_list:
33+
logger.info(f'The media : {trk_track_id_str} was cancelled !')
3334
self.progress.emit([trk_track_id_str, "Cancelled", [0, 100]])
3435
cancel_list.pop(trk_track_id_str)
3536
failed_downloads[trk_track_id_str] = {}
37+
self.__last_cancelled = True
3638
return False
3739
skip_existing_file = True
3840
chunk_size = config.get("chunk_size")
@@ -67,13 +69,15 @@ def download_track(self, session, track_id_str, extra_paths="", force_album_form
6769
return False
6870
try:
6971
if not is_playable:
70-
self.progress.emit([trk_track_id_str, "Unavailable", None])
7172
logger.error(f"Track is unavailable, track id '{trk_track_id_str}'")
73+
self.progress.emit([trk_track_id_str, "Unavailable", [0, 100]])
74+
self.__last_cancelled = True
7275
return False
7376
else:
7477
if os.path.isfile(filename) and os.path.getsize(filename) and skip_existing_file:
7578
self.progress.emit([trk_track_id_str, "Already exists", [100, 100],
7679
filename, f'{name} [{_artist} - {album_name}:{release_year}].mp3'])
80+
unavailable.add(trk_track_id_str)
7781
logger.info(f"File already exists, Skipping download for track by id '{trk_track_id_str}'")
7882
self.__last_cancelled = True
7983
return True

worker/utility.py

+12-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import time
33
from PyQt5.QtCore import QObject, pyqtSignal
44
from otsconfig import config
5-
from runtimedata import get_logger, playlist_m3u_queue, downloaded_data, session_pool
5+
from runtimedata import get_logger, playlist_m3u_queue, downloaded_data, session_pool, unavailable
66
from utils.spotify import get_album_tracks, get_album_name, get_artist_albums, get_show_episodes, get_episode_info, \
77
get_song_info, get_tracks_from_playlist, get_playlist_data
88

@@ -17,22 +17,24 @@ class PlayListMaker(QObject):
1717
def run(self):
1818
logger.info('Playlist m3u8 builder is running....')
1919
while not self.__stop:
20-
play_queue = playlist_m3u_queue.copy()
21-
ddc = downloaded_data.copy()
22-
for play_id in play_queue:
20+
ddc = set(downloaded_data.keys()).difference(unavailable)
21+
for play_id in list(playlist_m3u_queue.keys()):
2322
logger.info(f'Playlist m3u8 checking ID {play_id}')
24-
if set(play_queue[play_id]['tracks']).intersection(set(ddc.keys())) == set(
25-
play_queue[play_id]['tracks']):
23+
if set(playlist_m3u_queue[play_id]['tracks']).intersection(ddc) == set(
24+
playlist_m3u_queue[play_id]['tracks']):
2625
logger.info(f'Playlist {play_id} has all items ready, making m3u8 playlist at: '
2726
f'{{play_queue[play_id]["filename"]}}!')
2827
# Write the m3u8 header
29-
os.makedirs(os.path.dirname(play_queue[play_id]['filename']), exist_ok=True)
30-
with open(play_queue[play_id]['filename'], 'w') as f:
28+
os.makedirs(os.path.dirname(playlist_m3u_queue[play_id]['filename']), exist_ok=True)
29+
with open(playlist_m3u_queue[play_id]['filename'], 'w') as f:
3130
f.write('#EXTM3U\n')
3231
tid = 1
33-
for track_id in play_queue[play_id]['tracks']:
32+
for track_id in playlist_m3u_queue[play_id]['tracks']:
3433
logger.info(f'Playlist: {play_id}, adding track: {track_id} to m3u8')
35-
with open(play_queue[play_id]['filename'], 'a') as f:
34+
if track_id in unavailable:
35+
logger.info(f'Playlist: {play_id}, track: {track_id} unavailable for adding, skipping')
36+
continue
37+
with open(playlist_m3u_queue[play_id]['filename'], 'a') as f:
3638
f.write(
3739
f'#EXTINF:{tid}, {downloaded_data[track_id]["media_name"]}\n'
3840
f'{downloaded_data[track_id]["media_path"]}\n'

0 commit comments

Comments
 (0)