2017-01-11 18:49:40 +01:00
# coding: utf-8
from __future__ import unicode_literals
2019-04-17 18:29:10 +02:00
import itertools
import re
2017-01-11 18:49:40 +01:00
from . common import InfoExtractor
2017-02-18 23:34:09 +07:00
from . . utils import (
int_or_none ,
2019-04-11 17:11:57 +02:00
remove_end ,
2017-02-18 23:34:09 +07:00
unescapeHTML ,
)
2017-01-11 18:49:40 +01:00
class TVN24IE ( InfoExtractor ) :
2019-04-24 10:31:41 +02:00
_VALID_URL = r ' https?://(?:(?:[^/]+) \ .)?(?:toteraz|tvn24(?:bis)?) \ .pl/(?:[^/]+/)*(?P<id>[^/]+) '
2017-02-18 23:34:09 +07:00
_TESTS = [ {
2017-01-11 18:49:40 +01:00
' url ' : ' http://www.tvn24.pl/wiadomosci-z-kraju,3/oredzie-artura-andrusa,702428.html ' ,
' md5 ' : ' fbdec753d7bc29d96036808275f2130c ' ,
' info_dict ' : {
' id ' : ' 1584444 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' " Święta mają być wesołe, dlatego, ludziska, wszyscy pod jemiołę " ' ,
2019-04-12 13:53:03 +02:00
' description ' : ' Wyjątkowe orędzie Artura Andrusa, jednego z gości Szkła kontaktowego. ' ,
2017-10-03 18:28:13 +02:00
' thumbnail ' : ' re:https?://.*[.]jpeg ' ,
2017-01-11 18:49:40 +01:00
}
2019-04-17 18:29:10 +02:00
} , {
' url ' : ' https://www.tvn24.pl/superwizjer-w-tvn24,149,m/farma-trolli-zarabiaja-na-falszywych-informacjach-i-hejcie,923108.html ' ,
' md5 ' : ' fbdec753d7bc29d96036808275f2130c ' ,
' info_dict ' : {
' title ' : ' " Ludzie to jest, jakby nie patrzeć, też pieniądz " . Farmy trolli zarabiają na fake newsach i hejcie ' ,
' description ' : ' Ponad połowa Polaków wierzy w informacje, które znajduje w mediach społecznościowych. Ten fakt wykorzystują anonimowi twórcy tak zwanych fake newsów, czyli... ' ,
} ,
' playlist_count ' : 4 ,
' playlist ' : [ {
' md5 ' : ' 8b1001e576a81e22fbb605a9e5ca9d65 ' ,
' info_dict ' : {
' id ' : ' 1831060 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Farma trolli. Pierwsza część reportażu ' ,
} ,
} ] ,
2019-04-27 22:35:49 +02:00
} , {
# no OpenGraph title or description
' url ' : ' https://tvnmeteo.tvn24.pl/magazyny/maja-w-ogrodzie,13/odcinki-online,1,1,1,0/zielona-wstazka-wsrod-pagorkow-odc-705-hgtv-odc-5-serii-2019,1831029.html ' ,
' md5 ' : ' 6fc1cdb118e429dd05c7111305caee83 ' ,
' info_dict ' : {
' id ' : ' 1831029 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Zielona wstążka wśród pagórków (odc. 705 /HGTV odc. 5 serii 2019) - Maja w Ogrodzie ' ,
}
2019-04-29 13:14:19 +02:00
} , {
# no data-quality
' url ' : ' https://tvnmeteo.tvn24.pl/informacje-pogoda/swiat,27/kotka-przyjela-cztery-wiewiorki-zaczely-po-niej-biegac-i-skakac,289746,1,0.html ' ,
' md5 ' : ' 691d604adc807a84c769c487762fc1ea ' ,
' info_dict ' : {
' id ' : ' 1840073 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Kotka przyjęła cztery wiewiórki. " Zaczęły po niej biegać i skakać " ' ,
' description ' : ' Kotka o imieniu Pusza, żyjąca w Parku Miniatur w krymskim mieście Bakczysaraj to idealny przykład na to, że matczyna miłość nie zna granic. Zwierzę zao... ' ,
}
2019-04-24 10:31:41 +02:00
} , {
' url ' : ' https://toteraz.pl/zakaz-wyprowadzania-psow-nielegalny-decyzja-sadu-administracyjnego,1838704.html ' ,
' md5 ' : ' 46d127c478834e942b196d584b3ed747 ' ,
' info_dict ' : {
' id ' : ' 1838704 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Zakaz wyprowadzania psów nielegalny. Decyzja Sądu Administracyjnego ' ,
' description ' : ' Okazuje się, że zakaz wprowadzania psów jest nielegalny i należy go traktować wyłącznie w kategoriach prośby. ' ,
}
2017-02-18 23:34:09 +07:00
} , {
' url ' : ' http://fakty.tvn24.pl/ogladaj-online,60/53-konferencja-bezpieczenstwa-w-monachium,716431.html ' ,
' only_matching ' : True ,
} , {
' url ' : ' http://sport.tvn24.pl/pilka-nozna,105/ligue-1-kamil-glik-rozcial-glowe-monaco-tylko-remisuje-z-bastia,716522.html ' ,
' only_matching ' : True ,
} , {
' url ' : ' http://tvn24bis.pl/poranek,146,m/gen-koziej-w-tvn24-bis-wracamy-do-czasow-zimnej-wojny,715660.html ' ,
' only_matching ' : True ,
2017-10-03 18:28:13 +02:00
} , {
' url ' : ' https://www.tvn24.pl/magazyn-tvn24/angie-w-jednej-czwartej-polka-od-szarej-myszki-do-cesarzowej-europy,119,2158 ' ,
' only_matching ' : True ,
2017-02-18 23:34:09 +07:00
} ]
2017-01-11 18:49:40 +01:00
def _real_extract ( self , url ) :
2019-04-17 18:29:10 +02:00
page_id = self . _match_id ( url )
page_id = remove_end ( page_id , ' .html ' )
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
webpage = self . _download_webpage ( url , page_id )
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
VIDEO_ELT_REGEX = r ' (?P<video><div \ b[^>]+ \ bclass= " [^ " ]* \ bvideoPlayer \ b[^ " ]* " [^>]+>) '
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
def extract_videos ( regex = VIDEO_ELT_REGEX , single = False ) :
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
def extract_value ( attr , name , fatal = True ) :
return self . _html_search_regex (
r ' \ bdata- %s =([ " \' ])(?P<val>(?! \ 1).+?) \ 1 ' % attr , video_elt ,
name , group = ' val ' , fatal = fatal )
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
def extract_json ( attr , name , fatal = True ) :
value = extract_value ( attr , name , fatal = fatal ) or ' {} '
return self . _parse_json ( value , video_id or page_id , fatal = fatal )
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
entries = [ ]
iterator = re . finditer ( regex , webpage )
if single :
iterator = itertools . islice ( iterator , 0 , 1 )
for match in iterator :
video_elt = match . group ( ' video ' )
2019-04-27 22:23:24 +02:00
video_id = self . _search_regex (
r ' ^( \ d { 6,})($|_) ' ,
extract_value ( ' video-id ' , ' video id ' ) , ' video id ' )
2019-04-17 18:29:10 +02:00
try :
title = match . group ( ' title ' )
except IndexError :
title = None
title = unescapeHTML ( title )
thumbnail = extract_value ( ' poster ' , ' thumbnail ' , fatal = False )
quality_data = extract_json ( ' quality ' , ' formats ' )
2019-04-29 13:14:19 +02:00
info = {
2019-04-17 18:29:10 +02:00
' id ' : video_id ,
' thumbnail ' : thumbnail ,
' title ' : title ,
2019-04-29 13:14:19 +02:00
}
if quality_data :
info [ ' formats ' ] = formats = [ ]
for format_id , url in quality_data . items ( ) :
formats . append ( {
' url ' : url ,
' format_id ' : format_id ,
' height ' : int_or_none ( format_id . rstrip ( ' p ' ) ) ,
} )
self . _sort_formats ( formats )
else :
info [ ' url ' ] = url = extract_value ( ' src ' , ' video URL ' )
height = self . _search_regex ( ' -([0-9]+)p[.] ' , url , ' format id ' , default = None )
if height :
info . update ( {
' format_id ' : height + ' p ' ,
' height ' : int_or_none ( height ) ,
} )
entries . append ( info )
2019-04-17 18:29:10 +02:00
if not entries :
# provoke RegexNotFoundError
self . _search_regex ( ' x ' , ' ' , ' video elements ' )
return entries
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
if ' /superwizjer-w-tvn24, ' in url :
regex = r ' <a \ b[^>]* \ btitle= " (?P<title>[^ " ]+) " [^>]* \ bclass= " playVideo " > \ s*</a> \ s*(<[^/][^>]*> \ s*)+ ' + VIDEO_ELT_REGEX
entries = extract_videos ( regex = regex )
else :
entries = extract_videos ( single = True )
2017-02-18 23:34:09 +07:00
2019-04-17 18:29:10 +02:00
if len ( entries ) == 1 :
info = entries [ 0 ]
else :
info = {
' video_id ' : page_id ,
' _type ' : ' multi_video ' ,
' entries ' : entries ,
}
if not info . get ( ' title ' ) :
2019-04-27 22:28:29 +02:00
info [ ' title ' ] = ( self . _og_search_title ( webpage , default = None ) or
self . _html_search_regex ( r ' <title>([^<]+) ' , webpage , ' title ' ) )
2019-04-27 22:32:17 +02:00
info [ ' description ' ] = self . _og_search_description ( webpage , default = None )
2019-04-17 18:29:10 +02:00
return info