Download playlist items in reverse order

Series of videos are typically uploaded to YouTube playlists in
chronological order.  By default, these videos are downloaded
latest-to-earliest; this is great for seeing the latest videos in a
series, but prevents streaming video in the order that the videos were
produced.  Add an option to download videos in reverse order,
earliest-to-latest.
This commit is contained in:
Mark Schreiber 2014-07-10 20:11:11 -07:00
parent f4d66a99cf
commit 654d02dc6a
3 changed files with 9 additions and 1 deletions

View File

@ -84,6 +84,7 @@ which means you can modify it, redistribute it or use it however you like.
## Video Selection: ## Video Selection:
--playlist-start NUMBER playlist video to start at (default is 1) --playlist-start NUMBER playlist video to start at (default is 1)
--playlist-end NUMBER playlist video to end at (default is last) --playlist-end NUMBER playlist video to end at (default is last)
--playlist-reverse Download playlist videos in reverse order
--match-title REGEX download only matching titles (regex or --match-title REGEX download only matching titles (regex or
caseless sub-string) caseless sub-string)
--reject-title REGEX skip download for matching titles (regex or --reject-title REGEX skip download for matching titles (regex or

View File

@ -114,6 +114,7 @@ class YoutubeDL(object):
nooverwrites: Prevent overwriting files. nooverwrites: Prevent overwriting files.
playliststart: Playlist item to start at. playliststart: Playlist item to start at.
playlistend: Playlist item to end at. playlistend: Playlist item to end at.
playlistreverse: Download playlist items in reverse order.
matchtitle: Download only matching titles. matchtitle: Download only matching titles.
rejecttitle: Reject downloads for matching titles. rejecttitle: Reject downloads for matching titles.
logger: Log messages to a logging.Logger instance. logger: Log messages to a logging.Logger instance.
@ -623,8 +624,9 @@ class YoutubeDL(object):
self.to_screen( self.to_screen(
"[%s] playlist %s: Downloading %d videos" % "[%s] playlist %s: Downloading %d videos" %
(ie_result['extractor'], playlist, n_entries)) (ie_result['extractor'], playlist, n_entries))
step = -1 if self.params.get('playlistreverse', False) else 1
for i, entry in enumerate(entries, 1): for i, entry in enumerate(entries[::step]):
self.to_screen('[download] Downloading video #%s of %s' % (i, n_entries)) self.to_screen('[download] Downloading video #%s of %s' % (i, n_entries))
extra = { extra = {
'playlist': playlist, 'playlist': playlist,

View File

@ -287,6 +287,10 @@ def parseOpts(overrideArguments=None):
'--playlist-end', '--playlist-end',
dest='playlistend', metavar='NUMBER', default=None, type=int, dest='playlistend', metavar='NUMBER', default=None, type=int,
help='playlist video to end at (default is last)') help='playlist video to end at (default is last)')
selection.add_option(
'--playlist-reverse',
action='store_true',
help='Download playlist videos in reverse order')
selection.add_option('--match-title', dest='matchtitle', metavar='REGEX',help='download only matching titles (regex or caseless sub-string)') selection.add_option('--match-title', dest='matchtitle', metavar='REGEX',help='download only matching titles (regex or caseless sub-string)')
selection.add_option('--reject-title', dest='rejecttitle', metavar='REGEX',help='skip download for matching titles (regex or caseless sub-string)') selection.add_option('--reject-title', dest='rejecttitle', metavar='REGEX',help='skip download for matching titles (regex or caseless sub-string)')
selection.add_option('--max-downloads', metavar='NUMBER', selection.add_option('--max-downloads', metavar='NUMBER',
@ -757,6 +761,7 @@ def _real_main(argv=None):
'progress_with_newline': opts.progress_with_newline, 'progress_with_newline': opts.progress_with_newline,
'playliststart': opts.playliststart, 'playliststart': opts.playliststart,
'playlistend': opts.playlistend, 'playlistend': opts.playlistend,
'playlistreverse': opts.playlist_reverse,
'noplaylist': opts.noplaylist, 'noplaylist': opts.noplaylist,
'logtostderr': opts.outtmpl == '-', 'logtostderr': opts.outtmpl == '-',
'consoletitle': opts.consoletitle, 'consoletitle': opts.consoletitle,