]> Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/sapo.py
debian/control: Verify compliance with Policy 4.1.4 (no changes needed).
[youtubedl] / youtube_dl / extractor / sapo.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import re
5
6 from .common import InfoExtractor
7 from ..utils import (
8 parse_duration,
9 unified_strdate,
10 )
11
12
13 class SapoIE(InfoExtractor):
14 IE_DESC = 'SAPO Vídeos'
15 _VALID_URL = r'https?://(?:(?:v2|www)\.)?videos\.sapo\.(?:pt|cv|ao|mz|tl)/(?P<id>[\da-zA-Z]{20})'
16
17 _TESTS = [
18 {
19 'url': 'http://videos.sapo.pt/UBz95kOtiWYUMTA5Ghfi',
20 'md5': '79ee523f6ecb9233ac25075dee0eda83',
21 'note': 'SD video',
22 'info_dict': {
23 'id': 'UBz95kOtiWYUMTA5Ghfi',
24 'ext': 'mp4',
25 'title': 'Benfica - Marcas na Hitória',
26 'description': 'md5:c9082000a128c3fd57bf0299e1367f22',
27 'duration': 264,
28 'uploader': 'tiago_1988',
29 'upload_date': '20080229',
30 'categories': ['benfica', 'cabral', 'desporto', 'futebol', 'geovanni', 'hooijdonk', 'joao', 'karel', 'lisboa', 'miccoli'],
31 },
32 },
33 {
34 'url': 'http://videos.sapo.pt/IyusNAZ791ZdoCY5H5IF',
35 'md5': '90a2f283cfb49193fe06e861613a72aa',
36 'note': 'HD video',
37 'info_dict': {
38 'id': 'IyusNAZ791ZdoCY5H5IF',
39 'ext': 'mp4',
40 'title': 'Codebits VII - Report',
41 'description': 'md5:6448d6fd81ce86feac05321f354dbdc8',
42 'duration': 144,
43 'uploader': 'codebits',
44 'upload_date': '20140427',
45 'categories': ['codebits', 'codebits2014'],
46 },
47 },
48 {
49 'url': 'http://v2.videos.sapo.pt/yLqjzPtbTimsn2wWBKHz',
50 'md5': 'e5aa7cc0bdc6db9b33df1a48e49a15ac',
51 'note': 'v2 video',
52 'info_dict': {
53 'id': 'yLqjzPtbTimsn2wWBKHz',
54 'ext': 'mp4',
55 'title': 'Hipnose Condicionativa 4',
56 'description': 'md5:ef0481abf8fb4ae6f525088a6dadbc40',
57 'duration': 692,
58 'uploader': 'sapozen',
59 'upload_date': '20090609',
60 'categories': ['condicionativa', 'heloisa', 'hipnose', 'miranda', 'sapo', 'zen'],
61 },
62 },
63 ]
64
65 def _real_extract(self, url):
66 mobj = re.match(self._VALID_URL, url)
67 video_id = mobj.group('id')
68
69 item = self._download_xml(
70 'http://rd3.videos.sapo.pt/%s/rss2' % video_id, video_id).find('./channel/item')
71
72 title = item.find('./title').text
73 description = item.find('./{http://videos.sapo.pt/mrss/}synopse').text
74 thumbnail = item.find('./{http://search.yahoo.com/mrss/}content').get('url')
75 duration = parse_duration(item.find('./{http://videos.sapo.pt/mrss/}time').text)
76 uploader = item.find('./{http://videos.sapo.pt/mrss/}author').text
77 upload_date = unified_strdate(item.find('./pubDate').text)
78 view_count = int(item.find('./{http://videos.sapo.pt/mrss/}views').text)
79 comment_count = int(item.find('./{http://videos.sapo.pt/mrss/}comment_count').text)
80 tags = item.find('./{http://videos.sapo.pt/mrss/}tags').text
81 categories = tags.split() if tags else []
82 age_limit = 18 if item.find('./{http://videos.sapo.pt/mrss/}m18').text == 'true' else 0
83
84 video_url = item.find('./{http://videos.sapo.pt/mrss/}videoFile').text
85 video_size = item.find('./{http://videos.sapo.pt/mrss/}videoSize').text.split('x')
86
87 formats = [{
88 'url': video_url,
89 'ext': 'mp4',
90 'format_id': 'sd',
91 'width': int(video_size[0]),
92 'height': int(video_size[1]),
93 }]
94
95 if item.find('./{http://videos.sapo.pt/mrss/}HD').text == 'true':
96 formats.append({
97 'url': re.sub(r'/mov/1$', '/mov/39', video_url),
98 'ext': 'mp4',
99 'format_id': 'hd',
100 'width': 1280,
101 'height': 720,
102 })
103
104 self._sort_formats(formats)
105
106 return {
107 'id': video_id,
108 'title': title,
109 'description': description,
110 'thumbnail': thumbnail,
111 'duration': duration,
112 'uploader': uploader,
113 'upload_date': upload_date,
114 'view_count': view_count,
115 'comment_count': comment_count,
116 'categories': categories,
117 'age_limit': age_limit,
118 'formats': formats,
119 }