]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/zdf.py
2 from __future__
import unicode_literals
6 from . common
import InfoExtractor
13 def extract_from_xml_url ( ie
, video_id
, xml_url
):
14 doc
= ie
._ download
_ xml
(
16 note
= 'Downloading video info' ,
17 errnote
= 'Failed to download video info' )
19 title
= doc
. find ( './/information/title' ). text
20 description
= doc
. find ( './/information/detail' ). text
21 duration
= int ( doc
. find ( './/details/lengthSec' ). text
)
22 uploader_node
= doc
. find ( './/details/originChannelTitle' )
23 uploader
= None if uploader_node
is None else uploader_node
. text
24 uploader_id_node
= doc
. find ( './/details/originChannelId' )
25 uploader_id
= None if uploader_id_node
is None else uploader_id_node
. text
26 upload_date
= unified_strdate ( doc
. find ( './/details/airtime' ). text
)
28 def xml_to_format ( fnode
):
29 video_url
= fnode
. find ( 'url' ). text
30 is_available
= 'http://www.metafilegenerator' not in video_url
32 format_id
= fnode
. attrib
[ 'basetype' ]
33 format_m
= re
. match ( r
'''(?x)
34 (?P<vcodec>[^_]+)_(?P<acodec>[^_]+)_(?P<container>[^_]+)_
35 (?P<proto>[^_]+)_(?P<index>[^_]+)_(?P<indexproto>[^_]+)
38 ext
= format_m
. group ( 'container' )
39 proto
= format_m
. group ( 'proto' ). lower ()
41 quality
= fnode
. find ( './quality' ). text
42 abr
= int ( fnode
. find ( './audioBitrate' ). text
) // 1000
43 vbr_node
= fnode
. find ( './videoBitrate' )
44 vbr
= None if vbr_node
is None else int ( vbr_node
. text
) // 1000
46 width_node
= fnode
. find ( './width' )
47 width
= None if width_node
is None else int_or_none ( width_node
. text
)
48 height_node
= fnode
. find ( './height' )
49 height
= None if height_node
is None else int_or_none ( height_node
. text
)
56 'format_id' : format_id
+ '-' + quality
,
59 'acodec' : format_m
. group ( 'acodec' ),
60 'vcodec' : format_m
. group ( 'vcodec' ),
65 'filesize' : int_or_none ( fnode
. find ( './filesize' ). text
),
66 'format_note' : format_note
,
68 '_available' : is_available
,
71 format_nodes
= doc
. findall ( './/formitaeten/formitaet' )
72 formats
= list ( filter (
73 lambda f
: f
[ '_available' ],
74 map ( xml_to_format
, format_nodes
)))
75 ie
._ sort
_ formats
( formats
)
80 'description' : description
,
83 'uploader_id' : uploader_id
,
84 'upload_date' : upload_date
,
89 class ZDFIE ( InfoExtractor
):
90 _VALID_URL
= r
'^https?://www\.zdf\.de/ZDFmediathek(?P<hash>#)?/(.*beitrag/(?:video/)?)(?P<id>[0-9]+)(?:/[^/?]+)?(?:\?.*)?'
93 'url' : 'http://www.zdf.de/ZDFmediathek/beitrag/video/2037704/ZDFspezial---Ende-des-Machtpokers--?bc=sts;stt' ,
97 'title' : 'ZDFspezial - Ende des Machtpokers' ,
98 'description' : 'Union und SPD haben sich auf einen Koalitionsvertrag geeinigt. Aber was bedeutet das für die Bürger? Sehen Sie hierzu das ZDFspezial "Ende des Machtpokers - Große Koalition für Deutschland".' ,
100 'uploader' : 'spezial' ,
101 'uploader_id' : '225948' ,
102 'upload_date' : '20131127' ,
104 'skip' : 'Videos on ZDF.de are depublicised in short order' ,
107 def _real_extract ( self
, url
):
108 video_id
= self
._ match
_ id
( url
)
110 xml_url
= 'http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?ak=web&id= %s ' % video_id
111 return extract_from_xml_url ( self
, video_id
, xml_url
)