Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions src/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,23 +63,29 @@ def __init__(self, master):
variable=self._overwrite, onvalue=1, offvalue=0)
self._cb_overwrite.grid(row=2, column=0, columnspan=1, sticky=W+E, padx=2, pady=2)

self.reverse = BooleanVar()
self._cb_reverse = ttk.Checkbutton(master, text='Oldest First',
variable=self.reverse, onvalue=True, offvalue=False)
self._cb_reverse.grid(row=2, column=1, columnspan=1, sticky=W+E, padx=2, pady=2)
self.reverse.trace_add('write', self._on_reverse_toggle)

self._activate_last_n = IntVar()
self._cb_activate_last_n = ttk.Checkbutton(master, text='Download only last ',
variable=self._activate_last_n, onvalue=1, offvalue=0,
command=self._toggle_last_n)
self._cb_activate_last_n.grid(row=2, column=1, columnspan=1, sticky=W+E, padx=2, pady=2)
self._cb_activate_last_n.grid(row=2, column=2, columnspan=1, sticky=W+E, padx=2, pady=2)
self._last_n = StringVar(value="1")
self._sb_last_n = ttk.Spinbox(master, from_=1, to=50000, textvariable=self._last_n)
self._sb_last_n.configure(state=DISABLED)
self._sb_last_n.grid(row=2, column=2, sticky=W+E, padx=2, pady=2)
self._sb_last_n.grid(row=2, column=3, sticky=W+E, padx=2, pady=2)
self._label_episodes = ttk.Label(master, text='episodes')
self._label_episodes.grid(row=2, column=3, padx=2, sticky=W)
self._label_episodes.grid(row=2, column=4, padx=2, sticky=W)

self._prefix = StringVar()
self._cb_prefix = ttk.Combobox(master, textvariable=self._prefix)
self._cb_prefix['values'] = ('No prefix', 'Date prefix', 'Date+Time prefix')
self._cb_prefix.current(0)
self._cb_prefix.grid(row=2, column=4, columnspan=1, sticky=W+E, padx=2, pady=2)
self._cb_prefix.grid(row=2, column=5, columnspan=1, sticky=W+E, padx=2, pady=2)

self._btn_fetch = ttk.Button(master, text='Fetch', command=self.fetch)
self._btn_fetch.grid(row=2, column=7, columnspan=1, sticky=W+E, padx=2, pady=2)
Expand Down Expand Up @@ -134,6 +140,15 @@ def _clean_text_box(self):
except TclError as exc:
logging.warning('Can\'t clean text ({})'.format(exc))

def _on_reverse_toggle(self, *args):
try:
if self.reverse.get():
self._cb_activate_last_n.configure(text='Download only first ')
else:
self._cb_activate_last_n.configure(text='Download only last ')
except Exception:
pass

def _update_dl_with_fields(self):
self._dl._url = self._entry_rss.get()
self._dl.folder(self._entry_folder.get())
Expand All @@ -144,6 +159,7 @@ def _update_dl_with_fields(self):
if self._cb_prefix.current() == 2:
prefix = Prefix.DATE_TIME
self._dl.prefix(prefix)
self._dl._reverse = bool(self.reverse.get())
self._dl.last_n(0 if self._activate_last_n.get() == 0 else int(self._last_n.get()))

def _switch_action(self, action: bool):
Expand Down
17 changes: 13 additions & 4 deletions src/bulk_downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,20 +197,22 @@ def __str__(self) -> str:

class BulkDownloader:
def __init__(self, url: str, folder: str = None, last_n: int = 0, overwrite: bool = True,
prefix: Prefix = Prefix.NO_PREFIX):
prefix: Prefix = Prefix.NO_PREFIX, reverse: bool = False):
"""
Constructor of the bulkdownloader
@param url: URL of the RSS feed or web directory
@param folder: Folder where to save the MP3s
@param last_n: Only download the last N episodes, all if N = 0
@param overwrite: Overwrite already downloaded files
@param prefix: Prefix added for each file name
@param reverse: Download episodes in reverse order
"""
self._url = url
self._folder = folder
self._last_n = last_n
self._overwrite = overwrite
self._prefix = prefix
self._reverse = reverse

def last_n(self, n: int = None):
"""
Expand Down Expand Up @@ -297,6 +299,10 @@ def list_mp3(self, cb: Callback = None, verbose: bool = False) -> List[Episode]:
if self._page_is_rss(page):
logging.info('Processing RSS document')
to_download = self._get_episodes_to_download_from_rss(page)

if self._reverse:
to_download.reverse()

# We trim the list if needed
if 0 < self._last_n < len(to_download):
to_download = to_download[0:self._last_n]
Expand Down Expand Up @@ -401,21 +407,22 @@ def _page_is_rss(page):
return False


def download_mp3s(url: str, folder: str, last_n: int, overwrite: bool = True, prefix: Prefix = Prefix.NO_PREFIX):
def download_mp3s(url: str, folder: str, last_n: int, overwrite: bool = True, prefix: Prefix = Prefix.NO_PREFIX, reverse: bool = False):
"""
Will create a BulkDownloader and download all the mp3s from an URL to the folder
@param url: Directory/RSS url
@param folder: Where to save the MP3s
@param last_n: Only download the last N episodes, all if N = 0
@param overwrite: Overwrite existing files
@param prefix: Prefix type for each file
@param reverse: Download episodes in reverse order
"""
logging.info('Downloading mp3s from {} to {}'.format(url, folder))
if overwrite:
logging.info('Already existing file will be overwritten')
else:
logging.info('Already existing file won\'t be overwritten')
bulk_downloader = BulkDownloader(url, folder, last_n, overwrite, prefix)
bulk_downloader = BulkDownloader(url, folder, last_n, overwrite, prefix, reverse)
bulk_downloader.download_mp3()


Expand Down Expand Up @@ -445,6 +452,8 @@ def main() -> int:
help='Only download the last N episodes, if N=0, download all the episodes')
parser.add_argument('--prefix', dest='prefix', type=Prefix.from_string, choices=list(Prefix),
default=Prefix.NO_PREFIX, help='Prefix for the filename')
parser.add_argument('-r','--reverse', dest='reverse', action='store_true',
help='Download episodes in reverse order')
args = parser.parse_args()

if args.version:
Expand All @@ -455,7 +464,7 @@ def main() -> int:
return 1

try:
download_mp3s(args.url, args.folder, int(args.last_n), args.overwrite, args.prefix)
download_mp3s(args.url, args.folder, int(args.last_n), args.overwrite, args.prefix, args.reverse)
except Exception as exc:
logging.error(exc)
return 1
Expand Down