From 46cd65550ccd357e1ba5e33f197e36c828e0b80c Mon Sep 17 00:00:00 2001 From: Shrek Date: Tue, 11 Apr 2017 16:23:19 +0300 Subject: [PATCH 1/2] Added PuhuTV.com extractor Support for downloading videos from free Turkish tv soap opera website puhutv.com. --- youtube_dl/extractor/extractors.py | 1 + youtube_dl/extractor/puhutv.py | 65 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 youtube_dl/extractor/puhutv.py diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 68e1a5cfc..40bd93ea2 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -785,6 +785,7 @@ from .presstv import PressTVIE from .primesharetv import PrimeShareTVIE from .promptfile import PromptFileIE from .prosiebensat1 import ProSiebenSat1IE +from .puhutv import PuhuTvIE from .puls4 import Puls4IE from .pyvideo import PyvideoIE from .qqmusic import ( diff --git a/youtube_dl/extractor/puhutv.py b/youtube_dl/extractor/puhutv.py new file mode 100644 index 000000000..c8116b411 --- /dev/null +++ b/youtube_dl/extractor/puhutv.py @@ -0,0 +1,65 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re +import logging +from .common import InfoExtractor + + +class PuhuTvIE(InfoExtractor): + _VALID_URL = r'https?:\/\/(?:www\.)?puhutv\.com\/(?P[^/]+-izle)(\?[^/?]+)?' + _URL_FORMAT = r'https?:\/\/.+\/mp4\/(?P[0-9]+)p\.mp4.+' + + _TEST = { + 'url': 'https://puhutv.com/isler-gucler-1-bolum-izle', + 'md5': '30f82b1b42645ef0a9de4e6eede7e714', + 'info_dict': { + 'id': 'isler-gucler-1-bolum-izle', + 'title': 'İşler Güçler 1. Sezon 1. Bölüm', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.*\.(JPG|jpg)$', + 'upload_date': '20160719', + 'description': 'Ahmet, başrol oynadığı günlerin özlemini çekmekte, mazideki başarılarının göz ardı edilmesinden şikayet etmektedir. Murat, mesleğinin gereklerini yapmaya çalışırken, kendisini terketmiş olan eski sevgilisiyle beraber çalışmanın zorluklarını yaşamaktadır. Sadi, kapı gibi gümrük memurluğunu oyuncu olmak için bırakmış, para dertleri ve ailevi sorunlarla uğraşmaktadır. Figürasyon yaptığı bir tarihi diziden başka gelir kaynağı olmayan Sadi için \'Meslek Hikayeleri\'nin yayınlanması ve ücretlerini almaları çok önemlidir. \nBu sıra da programın Yapımcısı ve yapım ekibi işleri kolaylaştırmamakta güçleştirmektedir. İlginç aile üyeleri, değişik menajerleri ve olmazsa olmaz komşuları ile üçlümüzün hayatları bütün tuhaflıkları ile devam etmektedir. \'Meslek Hikayeleri\' için çektikleri ve yayınlanmayan bölümler içlerine dert olan üçlü, yayınlanabilecek kalitede bir bölüm için kolları sıvarlar. Ve ellerinden geleni de yaparlar.' + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + display_id = mobj.group('display_id') + + video_data = self._download_json('https://puhutv.com/api/slug/' + str(display_id), display_id)['data'] + video_id = str(video_data['id']) + video_title_name = video_data['title']['name'] + video_title_display_name = video_data['display_name'] + video_title = video_title_name + ' ' + video_title_display_name + + dl_data = self._download_json('https://puhutv.com/api/assets/'+video_id+'/videos', video_id)['data'] + + formats = [] + mp_fmts = [] + for dl in dl_data['videos']: + if (dl['url'].__contains__('playlist.m3u8')): + formats.extend(self._extract_m3u8_formats(dl['url'], str(dl['id']), 'mp4')) + elif (dl['url'].__contains__('/mp4/')): + fmt = str(re.match(self._URL_FORMAT, dl['url']).group('vid_format')) + mp_fmts.append({ + 'url': dl['url'], + 'format_id': 'mp4-' + fmt, + 'height': fmt + }) + mp_fmts.sort(key=lambda x: int(x['height'].replace('p',''))) + formats.extend(mp_fmts) + + # extract video metadata + thumbnail = 'https://' + video_data['content']['images']['wide']['main'] + description = video_data['description'] + upload_date = video_data['created_at'].split('T')[0].replace('-','') + + return { + 'id': display_id, + 'title': video_title, + 'formats': formats, + 'thumbnail': thumbnail, + 'upload_date': upload_date, + 'description': description + } From e46382b41b812200958001451ddbfc340f5fa70a Mon Sep 17 00:00:00 2001 From: Shrek Date: Tue, 11 Apr 2017 16:29:10 +0300 Subject: [PATCH 2/2] Code quality --- youtube_dl/extractor/puhutv.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/youtube_dl/extractor/puhutv.py b/youtube_dl/extractor/puhutv.py index c8116b411..280267932 100644 --- a/youtube_dl/extractor/puhutv.py +++ b/youtube_dl/extractor/puhutv.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import re -import logging + from .common import InfoExtractor @@ -27,33 +27,33 @@ class PuhuTvIE(InfoExtractor): mobj = re.match(self._VALID_URL, url) display_id = mobj.group('display_id') - video_data = self._download_json('https://puhutv.com/api/slug/' + str(display_id), display_id)['data'] - video_id = str(video_data['id']) - video_title_name = video_data['title']['name'] - video_title_display_name = video_data['display_name'] + video_data = self._download_json('https://puhutv.com/api/slug/' + str(display_id), display_id).get('data') + video_id = str(video_data.get('id')) + video_title_name = video_data.get('title').get('name') + video_title_display_name = video_data.get('display_name') video_title = video_title_name + ' ' + video_title_display_name - dl_data = self._download_json('https://puhutv.com/api/assets/'+video_id+'/videos', video_id)['data'] + dl_data = self._download_json('https://puhutv.com/api/assets/' + video_id + '/videos', video_id).get('data') formats = [] mp_fmts = [] - for dl in dl_data['videos']: - if (dl['url'].__contains__('playlist.m3u8')): - formats.extend(self._extract_m3u8_formats(dl['url'], str(dl['id']), 'mp4')) - elif (dl['url'].__contains__('/mp4/')): - fmt = str(re.match(self._URL_FORMAT, dl['url']).group('vid_format')) + for dl in dl_data.get('videos'): + if (dl.get('url').__contains__('playlist.m3u8')): + formats.extend(self._extract_m3u8_formats(dl.get('url'), str(dl.get('id')), 'mp4')) + elif (dl.get('url').__contains__('/mp4/')): + fmt = str(re.match(self._URL_FORMAT, dl.get('url')).group('vid_format')) mp_fmts.append({ - 'url': dl['url'], + 'url': dl.get('url'), 'format_id': 'mp4-' + fmt, 'height': fmt }) - mp_fmts.sort(key=lambda x: int(x['height'].replace('p',''))) + mp_fmts.sort(key=lambda x: int(x.get('height').replace('p', ''))) formats.extend(mp_fmts) # extract video metadata - thumbnail = 'https://' + video_data['content']['images']['wide']['main'] - description = video_data['description'] - upload_date = video_data['created_at'].split('T')[0].replace('-','') + thumbnail = 'https://' + video_data.get('content').get('images').get('wide').get('main') + description = video_data.get('description') + upload_date = video_data.get('created_at').split('T')[0].replace('-', '') return { 'id': display_id,