120 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# encoding: utf-8
							 | 
						||
| 
								 | 
							
								from __future__ import unicode_literals
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import re
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .common import InfoExtractor
							 | 
						||
| 
								 | 
							
								from ..utils import (
							 | 
						||
| 
								 | 
							
								    parse_duration,
							 | 
						||
| 
								 | 
							
								    unified_strdate,
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SapoIE(InfoExtractor):
							 | 
						||
| 
								 | 
							
								    IE_DESC = 'SAPO Vídeos'
							 | 
						||
| 
								 | 
							
								    _VALID_URL = r'https?://(?:(?:v2|www)\.)?videos\.sapo\.(?:pt|cv|ao|mz|tl)/(?P<id>[\da-zA-Z]{20})'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    _TESTS = [
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            'url': 'http://videos.sapo.pt/UBz95kOtiWYUMTA5Ghfi',
							 | 
						||
| 
								 | 
							
								            'md5': '79ee523f6ecb9233ac25075dee0eda83',
							 | 
						||
| 
								 | 
							
								            'note': 'SD video',
							 | 
						||
| 
								 | 
							
								            'info_dict': {
							 | 
						||
| 
								 | 
							
								                'id': 'UBz95kOtiWYUMTA5Ghfi',
							 | 
						||
| 
								 | 
							
								                'ext': 'mp4',
							 | 
						||
| 
								 | 
							
								                'title': 'Benfica - Marcas na Hitória',
							 | 
						||
| 
								 | 
							
								                'description': 'md5:c9082000a128c3fd57bf0299e1367f22',
							 | 
						||
| 
								 | 
							
								                'duration': 264,
							 | 
						||
| 
								 | 
							
								                'uploader': 'tiago_1988',
							 | 
						||
| 
								 | 
							
								                'upload_date': '20080229',
							 | 
						||
| 
								 | 
							
								                'categories': ['benfica', 'cabral', 'desporto', 'futebol', 'geovanni', 'hooijdonk', 'joao', 'karel', 'lisboa', 'miccoli'],
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            'url': 'http://videos.sapo.pt/IyusNAZ791ZdoCY5H5IF',
							 | 
						||
| 
								 | 
							
								            'md5': '90a2f283cfb49193fe06e861613a72aa',
							 | 
						||
| 
								 | 
							
								            'note': 'HD video',
							 | 
						||
| 
								 | 
							
								            'info_dict': {
							 | 
						||
| 
								 | 
							
								                'id': 'IyusNAZ791ZdoCY5H5IF',
							 | 
						||
| 
								 | 
							
								                'ext': 'mp4',
							 | 
						||
| 
								 | 
							
								                'title': 'Codebits VII - Report',
							 | 
						||
| 
								 | 
							
								                'description': 'md5:6448d6fd81ce86feac05321f354dbdc8',
							 | 
						||
| 
								 | 
							
								                'duration': 144,
							 | 
						||
| 
								 | 
							
								                'uploader': 'codebits',
							 | 
						||
| 
								 | 
							
								                'upload_date': '20140427',
							 | 
						||
| 
								 | 
							
								                'categories': ['codebits', 'codebits2014'],
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            'url': 'http://v2.videos.sapo.pt/yLqjzPtbTimsn2wWBKHz',
							 | 
						||
| 
								 | 
							
								            'md5': 'e5aa7cc0bdc6db9b33df1a48e49a15ac',
							 | 
						||
| 
								 | 
							
								            'note': 'v2 video',
							 | 
						||
| 
								 | 
							
								            'info_dict': {
							 | 
						||
| 
								 | 
							
								                'id': 'yLqjzPtbTimsn2wWBKHz',
							 | 
						||
| 
								 | 
							
								                'ext': 'mp4',
							 | 
						||
| 
								 | 
							
								                'title': 'Hipnose Condicionativa 4',
							 | 
						||
| 
								 | 
							
								                'description': 'md5:ef0481abf8fb4ae6f525088a6dadbc40',
							 | 
						||
| 
								 | 
							
								                'duration': 692,
							 | 
						||
| 
								 | 
							
								                'uploader': 'sapozen',
							 | 
						||
| 
								 | 
							
								                'upload_date': '20090609',
							 | 
						||
| 
								 | 
							
								                'categories': ['condicionativa', 'heloisa', 'hipnose', 'miranda', 'sapo', 'zen'],
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def _real_extract(self, url):
							 | 
						||
| 
								 | 
							
								        mobj = re.match(self._VALID_URL, url)
							 | 
						||
| 
								 | 
							
								        video_id = mobj.group('id')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        item = self._download_xml(
							 | 
						||
| 
								 | 
							
								            'http://rd3.videos.sapo.pt/%s/rss2' % video_id, video_id).find('./channel/item')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        title = item.find('./title').text
							 | 
						||
| 
								 | 
							
								        description = item.find('./{http://videos.sapo.pt/mrss/}synopse').text
							 | 
						||
| 
								 | 
							
								        thumbnail = item.find('./{http://search.yahoo.com/mrss/}content').get('url')
							 | 
						||
| 
								 | 
							
								        duration = parse_duration(item.find('./{http://videos.sapo.pt/mrss/}time').text)
							 | 
						||
| 
								 | 
							
								        uploader = item.find('./{http://videos.sapo.pt/mrss/}author').text
							 | 
						||
| 
								 | 
							
								        upload_date = unified_strdate(item.find('./pubDate').text)
							 | 
						||
| 
								 | 
							
								        view_count = int(item.find('./{http://videos.sapo.pt/mrss/}views').text)
							 | 
						||
| 
								 | 
							
								        comment_count = int(item.find('./{http://videos.sapo.pt/mrss/}comment_count').text)
							 | 
						||
| 
								 | 
							
								        tags = item.find('./{http://videos.sapo.pt/mrss/}tags').text
							 | 
						||
| 
								 | 
							
								        categories = tags.split() if tags else []
							 | 
						||
| 
								 | 
							
								        age_limit = 18 if item.find('./{http://videos.sapo.pt/mrss/}m18').text == 'true' else 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        video_url = item.find('./{http://videos.sapo.pt/mrss/}videoFile').text
							 | 
						||
| 
								 | 
							
								        video_size = item.find('./{http://videos.sapo.pt/mrss/}videoSize').text.split('x')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        formats = [{
							 | 
						||
| 
								 | 
							
								            'url': video_url,
							 | 
						||
| 
								 | 
							
								            'ext': 'mp4',
							 | 
						||
| 
								 | 
							
								            'format_id': 'sd',
							 | 
						||
| 
								 | 
							
								            'width': int(video_size[0]),
							 | 
						||
| 
								 | 
							
								            'height': int(video_size[1]),
							 | 
						||
| 
								 | 
							
								        }]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if item.find('./{http://videos.sapo.pt/mrss/}HD').text == 'true':
							 | 
						||
| 
								 | 
							
								            formats.append({
							 | 
						||
| 
								 | 
							
								                'url': re.sub(r'/mov/1$', '/mov/39', video_url),
							 | 
						||
| 
								 | 
							
								                'ext': 'mp4',
							 | 
						||
| 
								 | 
							
								                'format_id': 'hd',
							 | 
						||
| 
								 | 
							
								                'width': 1280,
							 | 
						||
| 
								 | 
							
								                'height': 720,
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self._sort_formats(formats)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return {
							 | 
						||
| 
								 | 
							
								            'id': video_id,
							 | 
						||
| 
								 | 
							
								            'title': title,
							 | 
						||
| 
								 | 
							
								            'description': description,
							 | 
						||
| 
								 | 
							
								            'thumbnail': thumbnail,
							 | 
						||
| 
								 | 
							
								            'duration': duration,
							 | 
						||
| 
								 | 
							
								            'uploader': uploader,
							 | 
						||
| 
								 | 
							
								            'upload_date': upload_date,
							 | 
						||
| 
								 | 
							
								            'view_count': view_count,
							 | 
						||
| 
								 | 
							
								            'comment_count': comment_count,
							 | 
						||
| 
								 | 
							
								            'categories': categories,
							 | 
						||
| 
								 | 
							
								            'age_limit': age_limit,
							 | 
						||
| 
								 | 
							
								            'formats': formats,
							 | 
						||
| 
								 | 
							
								        }
							 |