aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey M. <dstftw@gmail.com>2015-07-23 23:33:54 +0600
committerSergey M. <dstftw@gmail.com>2015-07-23 23:33:54 +0600
commitcdad742700a9a18608a799d86cfe0491e96eaaeb (patch)
treea9f3a17d34342e3229e93789557f0823e9d0aebe
parenta9e8f60ef686eeeb3d31f2e5211ce176dc8f5298 (diff)
parent2929fa0e79dfd3a1366e7e23eb4344bc93dd3a10 (diff)
Merge pull request #6306 from jaimeMF/extract_start_time
[youtube] Extract start_time
-rw-r--r--youtube_dl/extractor/common.py4
-rw-r--r--youtube_dl/extractor/youtube.py20
2 files changed, 23 insertions, 1 deletions
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py
index b9014fc23..1272834c5 100644
--- a/youtube_dl/extractor/common.py
+++ b/youtube_dl/extractor/common.py
@@ -183,6 +183,10 @@ class InfoExtractor(object):
["Sports", "Berlin"]
is_live: True, False, or None (=unknown). Whether this video is a
live stream that goes on instead of a fixed-length video.
+ start_time: Time in seconds where the reproduction should start, as
+ specified in the url.
+ end_time: Time in seconds where the reproduction should end, as
+ specified in the url.
Unless mentioned otherwise, the fields should be Unicode strings.
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index 323681960..229fc3a0f 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -19,6 +19,7 @@ from ..compat import (
compat_urllib_parse,
compat_urllib_parse_unquote,
compat_urllib_parse_unquote_plus,
+ compat_urllib_parse_urlparse,
compat_urllib_request,
compat_urlparse,
compat_str,
@@ -31,6 +32,7 @@ from ..utils import (
get_element_by_id,
int_or_none,
orderedSet,
+ parse_duration,
str_to_int,
unescapeHTML,
unified_strdate,
@@ -317,7 +319,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
IE_NAME = 'youtube'
_TESTS = [
{
- 'url': 'http://www.youtube.com/watch?v=BaW_jenozKc',
+ 'url': 'http://www.youtube.com/watch?v=BaW_jenozKcj&t=1s&end=9',
'info_dict': {
'id': 'BaW_jenozKc',
'ext': 'mp4',
@@ -329,6 +331,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'categories': ['Science & Technology'],
'like_count': int,
'dislike_count': int,
+ 'start_time': 1,
+ 'end_time': 9,
}
},
{
@@ -889,6 +893,18 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'http' if self._downloader.params.get('prefer_insecure', False)
else 'https')
+ start_time = None
+ end_time = None
+ parsed_url = compat_urllib_parse_urlparse(url)
+ for component in [parsed_url.fragment, parsed_url.query]:
+ query = compat_parse_qs(component)
+ if start_time is None and 't' in query:
+ start_time = parse_duration(query['t'][0])
+ if start_time is None and 'start' in query:
+ start_time = parse_duration(query['start'][0])
+ if end_time is None and 'end' in query:
+ end_time = parse_duration(query['end'][0])
+
# Extract original video URL from URL with redirection, like age verification, using next_url parameter
mobj = re.search(self._NEXT_URL_RE, url)
if mobj:
@@ -1256,6 +1272,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'average_rating': float_or_none(video_info.get('avg_rating', [None])[0]),
'formats': formats,
'is_live': is_live,
+ 'start_time': start_time,
+ 'end_time': end_time,
}