Merge branch 'paged-lists'

Conflicts:
	test/test_utils.py
	youtube_dl/extractor/youtube.py
This commit is contained in:
Philipp Hagemeister 2014-01-22 20:00:16 +01:00
commit 65697b3bf3
4 changed files with 92 additions and 25 deletions

View file

@ -6,6 +6,7 @@ import datetime
import email.utils
import errno
import gzip
import itertools
import io
import json
import locale
@ -1164,3 +1165,46 @@ def check_executable(exe, args=[]):
except OSError:
return False
return exe
class PagedList(object):
def __init__(self, pagefunc, pagesize):
self._pagefunc = pagefunc
self._pagesize = pagesize
def getslice(self, start=0, end=None):
res = []
for pagenum in itertools.count(start // self._pagesize):
firstid = pagenum * self._pagesize
nextfirstid = pagenum * self._pagesize + self._pagesize
if start >= nextfirstid:
continue
page_results = list(self._pagefunc(pagenum))
startv = (
start % self._pagesize
if firstid <= start < nextfirstid
else 0)
endv = (
((end - 1) % self._pagesize) + 1
if (end is not None and firstid <= end <= nextfirstid)
else None)
if startv != 0 or endv is not None:
page_results = page_results[startv:endv]
res.extend(page_results)
# A little optimization - if current page is not "full", ie. does
# not contain page_size videos then we can assume that this page
# is the last one - there are no more ids on further pages -
# i.e. no need to query again.
if len(page_results) + startv < self._pagesize:
break
# If we got the whole page, but the next page is not interesting,
# break out early as well
if end == nextfirstid:
break
return res