youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

sapo.py (4496B)


      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         }