@@ -551,36 +551,85 @@ def reload_feeds(self) -> None:
551551 t = threading .Thread (target = self .database .reload , args = [self ])
552552 t .start ()
553553
554+ def reload_selected_feed (self , feed : Feed ) -> None :
555+ """Reloads the selected feed.
556+
557+ This method starts the reloading in a new un-managed thread.
558+ """
559+ t = threading .Thread (target = self .database .reload , args = [self , [feed ]])
560+ t .start ()
561+
554562 def save_episodes (self , feed = None , episode = None ) -> None :
555563 """Save a feed or episode.
556564
557- If the user is saving an episode and the episode is already saved, this
558- method will instead ask the user if they would like to delete the
559- downloaded episode. However, if the user is saving a feed, there is no
560- prompt to delete episodes, even if some are downloaded. In this case,
561- downloaded episodes are simply skipped.
562-
563565 Exactly one of either feed or episode must be given.
564566
565567 Args:
566568 feed: (optional) a feed to download all episodes of
567- episode: (optional) an episode to download or delete
569+ episode: (optional) an episode to download
568570 """
569571 assert (feed is None or episode is None ) and (feed is not episode )
570572
571573 if feed is not None :
574+ num_saved = 0
575+ num_to_save = 0
572576 for episode in self .database .episodes (feed ):
573577 if not episode .downloaded :
574- self ._download_queue .add (episode )
578+ num_to_save += 1
579+
580+ if num_to_save == 0 :
581+ return
582+
583+ should_delete = self ._get_y_n (
584+ "Are you sure you want to download %d"
585+ " episodes from this feed? (y/n): " % num_to_save )
586+ if should_delete :
587+ for episode in self .database .episodes (feed ):
588+ if not episode .downloaded :
589+ self ._download_queue .add (episode )
590+ else :
591+ if not episode .downloaded :
592+ self ._download_queue .add (episode )
593+
594+ def delete_episodes (self , feed = None , episode = None ) -> None :
595+ """Delete a downloaded episode, or all of those from a feed.
596+
597+ Exactly one of either feed or episode must be given.
598+
599+ Args:
600+ feed: (optional) a feed to delete all episodes of
601+ episode: (optional) an episode or delete
602+ """
603+ assert (feed is None or episode is None ) and (feed is not episode )
604+
605+ if feed is not None :
606+ num_deleted = 0
607+ num_to_delete = 0
608+ for episode in self .database .episodes (feed ):
609+ if episode .downloaded :
610+ num_to_delete += 1
611+
612+ if num_to_delete == 0 :
613+ return
614+
615+ should_delete = self ._get_y_n (
616+ "Are you sure you want to delete %d downloaded"
617+ " episodes from this feed? (y/n): " % num_to_delete )
618+ if should_delete :
619+ for episode in self .database .episodes (feed ):
620+ if episode .downloaded :
621+ episode .delete (self )
622+ num_deleted += 1
623+ self .menus_valid = False
624+ self .change_status (
625+ "Successfully deleted %d episodes" % num_deleted )
575626 else :
576627 if episode .downloaded :
577628 should_delete = self ._get_y_n (
578629 "Are you sure you want to delete the downloaded"
579630 " episode? (y/n): " )
580631 if should_delete :
581632 episode .delete (self )
582- else :
583- self ._download_queue .add (episode )
584633
585634 def filter_menu (self , menu : Menu ) -> None :
586635 menu .filter_text = self ._get_input_str ("Filter: " )
0 commit comments