]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/zdf.py
829f002cf02f9c908a5057ab3c6b20f520e2f2ea
5 from . common
import InfoExtractor
12 class ZDFIE ( InfoExtractor
):
13 _VALID_URL
= r
'^https?://www\.zdf\.de/ZDFmediathek(?P<hash>#)?/(.*beitrag/(?:video/)?)(?P<video_id>[0-9]+)(?:/[^/?]+)?(?:\?.*)?'
16 u
"url" : u
"http://www.zdf.de/ZDFmediathek/beitrag/video/2037704/ZDFspezial---Ende-des-Machtpokers--?bc=sts;stt" ,
17 u
"file" : u
"2037704.webm" ,
19 u
"upload_date" : u
"20131127" ,
20 u
"description" : u
"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 \" ." ,
21 u
"uploader" : u
"spezial" ,
22 u
"title" : u
"ZDFspezial - Ende des Machtpokers"
24 u
"skip" : u
"Videos on ZDF.de are depublicised in short order" ,
27 def _real_extract ( self
, url
):
28 mobj
= re
. match ( self
._ VALID
_U RL
, url
)
29 video_id
= mobj
. group ( 'video_id' )
31 xml_url
= u
'http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?ak=web&id= %s ' % video_id
32 doc
= self
._ download
_ xml
(
34 note
= u
'Downloading video info' ,
35 errnote
= u
'Failed to download video info' )
37 title
= doc
. find ( './/information/title' ). text
38 description
= doc
. find ( './/information/detail' ). text
39 uploader_node
= doc
. find ( './/details/originChannelTitle' )
40 uploader
= None if uploader_node
is None else uploader_node
. text
41 duration_str
= doc
. find ( './/details/length' ). text
42 duration_m
= re
. match ( r
'''(?x)^
44 :(?P<minutes>[0-9] {2} )
45 :(?P<seconds>[0-9] {2} )
50 ( int ( duration_m
. group ( 'hours' )) * 60 * 60 ) +
51 ( int ( duration_m
. group ( 'minutes' )) * 60 ) +
52 int ( duration_m
. group ( 'seconds' ))
57 upload_date
= unified_strdate ( doc
. find ( './/details/airtime' ). text
)
59 def xml_to_format ( fnode
):
60 video_url
= fnode
. find ( 'url' ). text
61 is_available
= u
'http://www.metafilegenerator' not in video_url
63 format_id
= fnode
. attrib
[ 'basetype' ]
64 format_m
= re
. match ( r
'''(?x)
65 (?P<vcodec>[^_]+)_(?P<acodec>[^_]+)_(?P<container>[^_]+)_
66 (?P<proto>[^_]+)_(?P<index>[^_]+)_(?P<indexproto>[^_]+)
69 ext
= format_m
. group ( 'container' )
70 proto
= format_m
. group ( 'proto' ). lower ()
72 quality
= fnode
. find ( './quality' ). text
73 abr
= int ( fnode
. find ( './audioBitrate' ). text
) // 1000
74 vbr
= int ( fnode
. find ( './videoBitrate' ). text
) // 1000
81 'format_id' : format_id
+ u
'-' + quality
,
84 'acodec' : format_m
. group ( 'acodec' ),
85 'vcodec' : format_m
. group ( 'vcodec' ),
88 'width' : int_or_none ( fnode
. find ( './width' ). text
),
89 'height' : int_or_none ( fnode
. find ( './height' ). text
),
90 'filesize' : int_or_none ( fnode
. find ( './filesize' ). text
),
91 'format_note' : format_note
,
93 '_available' : is_available
,
96 format_nodes
= doc
. findall ( './/formitaeten/formitaet' )
97 formats
= list ( filter (
98 lambda f
: f
[ '_available' ],
99 map ( xml_to_format
, format_nodes
)))
101 self
._ sort
_ formats
( formats
)
107 'description' : description
,
108 'uploader' : uploader
,
109 'duration' : duration
,
110 'upload_date' : upload_date
,