2016-10-02 19:39:18 +08:00
# coding: utf-8
2014-01-30 13:13:57 +08:00
from __future__ import unicode_literals
2013-09-09 03:55:11 +08:00
import re
2013-09-24 03:41:54 +08:00
import json
2013-09-09 03:55:11 +08:00
from . common import InfoExtractor
2015-07-19 23:54:12 +08:00
from . . compat import compat_urlparse
2014-12-13 19:24:42 +08:00
from . . utils import (
2014-09-17 00:47:59 +08:00
clean_html ,
2014-12-13 19:24:42 +08:00
ExtractorError ,
2014-09-17 00:47:59 +08:00
int_or_none ,
2014-12-13 19:24:42 +08:00
parse_duration ,
2015-04-05 01:02:04 +08:00
determine_ext ,
2013-09-09 03:55:11 +08:00
)
2016-07-06 23:37:54 +08:00
from . dailymotion import (
DailymotionIE ,
DailymotionCloudIE ,
)
2013-09-09 03:55:11 +08:00
2013-09-10 21:50:34 +08:00
class FranceTVBaseInfoExtractor ( InfoExtractor ) :
2014-09-17 00:47:59 +08:00
def _extract_video ( self , video_id , catalogue ) :
info = self . _download_json (
' http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/?idDiffusion= %s &catalogue= %s '
% ( video_id , catalogue ) ,
video_id , ' Downloading video JSON ' )
if info . get ( ' status ' ) == ' NOK ' :
raise ExtractorError (
' %s returned error: %s ' % ( self . IE_NAME , info [ ' message ' ] ) , expected = True )
2014-11-25 02:37:20 +08:00
allowed_countries = info [ ' videos ' ] [ 0 ] . get ( ' geoblocage ' )
if allowed_countries :
georestricted = True
geo_info = self . _download_json (
' http://geo.francetv.fr/ws/edgescape.json ' , video_id ,
' Downloading geo restriction info ' )
country = geo_info [ ' reponse ' ] [ ' geo_info ' ] [ ' country_code ' ]
if country not in allowed_countries :
raise ExtractorError (
' The video is not available from your location ' ,
expected = True )
else :
georestricted = False
2014-09-17 00:47:59 +08:00
formats = [ ]
for video in info [ ' videos ' ] :
if video [ ' statut ' ] != ' ONLINE ' :
continue
video_url = video [ ' url ' ]
if not video_url :
continue
format_id = video [ ' format ' ]
2015-04-05 01:02:04 +08:00
ext = determine_ext ( video_url )
if ext == ' f4m ' :
2014-11-25 02:37:20 +08:00
if georestricted :
# See https://github.com/rg3/youtube-dl/issues/3963
# m3u8 urls work fine
continue
2014-09-17 00:47:59 +08:00
f4m_url = self . _download_webpage (
2015-07-19 23:45:49 +08:00
' http://hdfauth.francetv.fr/esi/TA?url= %s ' % video_url ,
2014-09-17 00:47:59 +08:00
video_id , ' Downloading f4m manifest token ' , fatal = False )
if f4m_url :
2015-07-19 23:51:06 +08:00
formats . extend ( self . _extract_f4m_formats (
2016-03-20 15:00:46 +08:00
f4m_url + ' &hdcore=3.7.0&plugin=aasp-3.7.0.39.44 ' ,
video_id , f4m_id = format_id , fatal = False ) )
2015-04-05 01:02:04 +08:00
elif ext == ' m3u8 ' :
2016-03-20 15:00:46 +08:00
formats . extend ( self . _extract_m3u8_formats (
video_url , video_id , ' mp4 ' , entry_protocol = ' m3u8_native ' ,
m3u8_id = format_id , fatal = False ) )
2014-09-17 00:47:59 +08:00
elif video_url . startswith ( ' rtmp ' ) :
formats . append ( {
' url ' : video_url ,
' format_id ' : ' rtmp- %s ' % format_id ,
' ext ' : ' flv ' ,
} )
else :
2016-03-20 15:00:46 +08:00
if self . _is_valid_url ( video_url , video_id , format_id ) :
formats . append ( {
' url ' : video_url ,
' format_id ' : format_id ,
} )
2014-09-17 00:47:59 +08:00
self . _sort_formats ( formats )
2013-09-10 21:50:34 +08:00
2015-09-02 00:37:42 +08:00
title = info [ ' titre ' ]
subtitle = info . get ( ' sous_titre ' )
if subtitle :
title + = ' - %s ' % subtitle
2016-03-20 14:44:04 +08:00
title = title . strip ( )
2015-09-02 00:37:42 +08:00
2015-10-26 22:11:09 +08:00
subtitles = { }
2015-10-26 22:35:28 +08:00
subtitles_list = [ {
2015-10-28 15:22:04 +08:00
' url ' : subformat [ ' url ' ] ,
' ext ' : subformat . get ( ' format ' ) ,
} for subformat in info . get ( ' subtitles ' , [ ] ) if subformat . get ( ' url ' ) ]
2015-10-26 22:35:28 +08:00
if subtitles_list :
subtitles [ ' fr ' ] = subtitles_list
2015-10-26 22:11:09 +08:00
2014-07-28 20:37:13 +08:00
return {
' id ' : video_id ,
2015-09-02 00:37:42 +08:00
' title ' : title ,
2014-09-17 00:47:59 +08:00
' description ' : clean_html ( info [ ' synopsis ' ] ) ,
' thumbnail ' : compat_urlparse . urljoin ( ' http://pluzz.francetv.fr ' , info [ ' image ' ] ) ,
2015-07-19 00:43:42 +08:00
' duration ' : int_or_none ( info . get ( ' real_duration ' ) ) or parse_duration ( info [ ' duree ' ] ) ,
2014-09-17 00:47:59 +08:00
' timestamp ' : int_or_none ( info [ ' diffusion ' ] [ ' timestamp ' ] ) ,
2014-07-28 20:37:13 +08:00
' formats ' : formats ,
2015-10-26 22:11:09 +08:00
' subtitles ' : subtitles ,
2014-07-28 20:37:13 +08:00
}
2013-09-10 21:50:34 +08:00
class PluzzIE ( FranceTVBaseInfoExtractor ) :
2014-01-30 13:13:57 +08:00
IE_NAME = ' pluzz.francetv.fr '
2015-10-27 23:43:29 +08:00
_VALID_URL = r ' https?://(?:m \ .)?pluzz \ .francetv \ .fr/videos/(?P<id>.+?) \ .html '
2013-09-09 03:55:11 +08:00
2013-09-18 04:49:43 +08:00
# Can't use tests, videos expire in 7 days
2013-09-09 03:55:11 +08:00
def _real_extract ( self , url ) :
2015-10-27 23:43:29 +08:00
display_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , display_id )
video_id = self . _html_search_meta (
' id_video ' , webpage , ' video id ' , default = None )
if not video_id :
video_id = self . _search_regex (
2015-10-28 15:22:04 +08:00
r ' data-diffusion=[ " \' ]( \ d+) ' , webpage , ' video id ' )
2015-10-27 23:43:29 +08:00
2014-09-17 00:47:59 +08:00
return self . _extract_video ( video_id , ' Pluzz ' )
2013-09-09 03:55:11 +08:00
2013-09-10 21:50:34 +08:00
class FranceTvInfoIE ( FranceTVBaseInfoExtractor ) :
2014-01-30 13:13:57 +08:00
IE_NAME = ' francetvinfo.fr '
2016-08-11 22:42:55 +08:00
_VALID_URL = r ' https?://(?:www|mobile|france3-regions) \ .francetvinfo \ .fr/(?:[^/]+/)*(?P<title>[^/?#&.]+) '
2013-09-09 03:55:11 +08:00
2014-05-16 21:51:01 +08:00
_TESTS = [ {
2014-01-30 13:13:57 +08:00
' url ' : ' http://www.francetvinfo.fr/replay-jt/france-3/soir-3/jt-grand-soir-3-lundi-26-aout-2013_393427.html ' ,
' info_dict ' : {
2014-05-16 21:51:01 +08:00
' id ' : ' 84981923 ' ,
2016-03-20 15:00:46 +08:00
' ext ' : ' mp4 ' ,
2014-01-30 13:13:57 +08:00
' title ' : ' Soir 3 ' ,
2014-09-17 00:47:59 +08:00
' upload_date ' : ' 20130826 ' ,
' timestamp ' : 1377548400 ,
2015-10-26 22:35:45 +08:00
' subtitles ' : {
' fr ' : ' mincount:2 ' ,
} ,
2013-09-10 21:50:34 +08:00
} ,
2016-03-20 15:00:46 +08:00
' params ' : {
# m3u8 downloads
' skip_download ' : True ,
} ,
2014-05-16 21:51:01 +08:00
} , {
' url ' : ' http://www.francetvinfo.fr/elections/europeennes/direct-europeennes-regardez-le-debat-entre-les-candidats-a-la-presidence-de-la-commission_600639.html ' ,
' info_dict ' : {
' id ' : ' EV_20019 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Débat des candidats à la Commission européenne ' ,
' description ' : ' Débat des candidats à la Commission européenne ' ,
} ,
' params ' : {
' skip_download ' : ' HLS (reqires ffmpeg) '
2014-09-17 00:47:59 +08:00
} ,
' skip ' : ' Ce direct est terminé et sera disponible en rattrapage dans quelques minutes. ' ,
2015-06-21 21:31:33 +08:00
} , {
' url ' : ' http://www.francetvinfo.fr/economie/entreprises/les-entreprises-familiales-le-secret-de-la-reussite_933271.html ' ,
' md5 ' : ' f485bda6e185e7d15dbc69b72bae993e ' ,
' info_dict ' : {
2016-03-20 15:00:46 +08:00
' id ' : ' NI_173343 ' ,
2015-06-21 21:31:33 +08:00
' ext ' : ' mp4 ' ,
' title ' : ' Les entreprises familiales : le secret de la réussite ' ,
' thumbnail ' : ' re:^https?://.* \ .jpe?g$ ' ,
2016-03-20 15:00:46 +08:00
' timestamp ' : 1433273139 ,
' upload_date ' : ' 20150602 ' ,
} ,
' params ' : {
# m3u8 downloads
' skip_download ' : True ,
} ,
2016-03-20 14:44:04 +08:00
} , {
' url ' : ' http://france3-regions.francetvinfo.fr/bretagne/cotes-d-armor/thalassa-echappee-breizh-ce-venredi-dans-les-cotes-d-armor-954961.html ' ,
' md5 ' : ' f485bda6e185e7d15dbc69b72bae993e ' ,
' info_dict ' : {
' id ' : ' NI_657393 ' ,
2016-03-20 15:00:46 +08:00
' ext ' : ' mp4 ' ,
2016-03-20 14:44:04 +08:00
' title ' : ' Olivier Monthus, réalisateur de " Bretagne, le choix de l’ Armor " ' ,
' description ' : ' md5:a3264114c9d29aeca11ced113c37b16c ' ,
' thumbnail ' : ' re:^https?://.* \ .jpe?g$ ' ,
' timestamp ' : 1458300695 ,
' upload_date ' : ' 20160318 ' ,
} ,
' params ' : {
' skip_download ' : True ,
} ,
2016-07-06 23:37:54 +08:00
} , {
# Dailymotion embed
' url ' : ' http://www.francetvinfo.fr/politique/notre-dame-des-landes/video-sur-france-inter-cecile-duflot-denonce-le-regard-meprisant-de-patrick-cohen_1520091.html ' ,
' md5 ' : ' ee7f1828f25a648addc90cb2687b1f12 ' ,
' info_dict ' : {
' id ' : ' x4iiko0 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' NDDL, référendum, Brexit : Cécile Duflot répond à Patrick Cohen ' ,
' description ' : ' Au lendemain de la victoire du " oui " au référendum sur l \' aéroport de Notre-Dame-des-Landes, l \' ancienne ministre écologiste est l \' invitée de Patrick Cohen. Plus d \' info : https://www.franceinter.fr/emissions/le-7-9/le-7-9-27-juin-2016 ' ,
' timestamp ' : 1467011958 ,
' upload_date ' : ' 20160627 ' ,
' uploader ' : ' France Inter ' ,
' uploader_id ' : ' x2q2ez ' ,
} ,
' add_ie ' : [ ' Dailymotion ' ] ,
2016-08-11 22:42:55 +08:00
} , {
' url ' : ' http://france3-regions.francetvinfo.fr/limousin/emissions/jt-1213-limousin ' ,
' only_matching ' : True ,
2014-05-16 21:51:01 +08:00
} ]
2013-09-10 21:50:34 +08:00
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
page_title = mobj . group ( ' title ' )
webpage = self . _download_webpage ( url , page_title )
2015-06-21 21:31:33 +08:00
dmcloud_url = DailymotionCloudIE . _extract_dmcloud_url ( webpage )
if dmcloud_url :
2016-07-06 23:37:54 +08:00
return self . url_result ( dmcloud_url , DailymotionCloudIE . ie_key ( ) )
dailymotion_urls = DailymotionIE . _extract_urls ( webpage )
if dailymotion_urls :
return self . playlist_result ( [
self . url_result ( dailymotion_url , DailymotionIE . ie_key ( ) )
for dailymotion_url in dailymotion_urls ] )
2015-06-21 21:31:33 +08:00
2014-09-17 00:47:59 +08:00
video_id , catalogue = self . _search_regex (
2016-03-20 14:44:04 +08:00
( r ' id-video=([^@]+@[^ " ]+) ' ,
r ' <a[^>]+href= " (?:https?:)?//videos \ .francetv \ .fr/video/([^@]+@[^ " ]+) " ' ) ,
webpage , ' video id ' ) . split ( ' @ ' )
2014-09-17 00:47:59 +08:00
return self . _extract_video ( video_id , catalogue )
2013-09-24 03:28:33 +08:00
2013-12-06 03:45:53 +08:00
class FranceTVIE ( FranceTVBaseInfoExtractor ) :
2014-01-30 13:13:57 +08:00
IE_NAME = ' francetv '
IE_DESC = ' France 2, 3, 4, 5 and Ô '
2015-07-19 00:41:34 +08:00
_VALID_URL = r ''' (?x)
https ? : / /
( ? :
( ? : www \. ) ? france [ 2345 o ] \. fr /
( ? :
2015-07-20 03:03:43 +08:00
emissions / [ ^ / ] + / ( ? : videos | diffusions ) |
emission / [ ^ / ] + |
2015-07-19 23:50:25 +08:00
videos |
jt
2015-07-19 00:41:34 +08:00
)
/ |
embed \. francetv \. fr / \? ue =
)
( ? P < id > [ ^ / ? ] + )
'''
2013-09-24 03:28:33 +08:00
2013-12-06 03:45:53 +08:00
_TESTS = [
# france2
{
2014-01-30 13:13:57 +08:00
' url ' : ' http://www.france2.fr/emissions/13h15-le-samedi-le-dimanche/videos/75540104 ' ,
2014-09-17 00:47:59 +08:00
' md5 ' : ' c03fc87cb85429ffd55df32b9fc05523 ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
2014-09-17 00:47:59 +08:00
' id ' : ' 109169362 ' ,
' ext ' : ' flv ' ,
' title ' : ' 13h15, le dimanche... ' ,
' description ' : ' md5:9a0932bb465f22d377a449be9d1a0ff7 ' ,
' upload_date ' : ' 20140914 ' ,
' timestamp ' : 1410693600 ,
2013-12-06 03:45:53 +08:00
} ,
2013-09-24 03:28:33 +08:00
} ,
2013-12-06 03:45:53 +08:00
# france3
{
2014-01-30 13:13:57 +08:00
' url ' : ' http://www.france3.fr/emissions/pieces-a-conviction/diffusions/13-11-2013_145575 ' ,
2014-09-17 00:47:59 +08:00
' md5 ' : ' 679bb8f8921f8623bd658fa2f8364da0 ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
' id ' : ' 000702326_CAPP_PicesconvictionExtrait313022013_120220131722_Au ' ,
2014-09-17 00:47:59 +08:00
' ext ' : ' mp4 ' ,
2014-01-30 13:13:57 +08:00
' title ' : ' Le scandale du prix des médicaments ' ,
' description ' : ' md5:1384089fbee2f04fc6c9de025ee2e9ce ' ,
2014-09-17 00:47:59 +08:00
' upload_date ' : ' 20131113 ' ,
' timestamp ' : 1384380000 ,
2013-12-06 03:45:53 +08:00
} ,
2013-09-24 03:28:33 +08:00
} ,
2013-12-06 03:45:53 +08:00
# france4
{
2014-01-30 13:13:57 +08:00
' url ' : ' http://www.france4.fr/emissions/hero-corp/videos/rhozet_herocorp_bonus_1_20131106_1923_06112013172108_F4 ' ,
2014-09-17 00:47:59 +08:00
' md5 ' : ' a182bf8d2c43d88d46ec48fbdd260c1c ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
' id ' : ' rhozet_herocorp_bonus_1_20131106_1923_06112013172108_F4 ' ,
2014-09-17 00:47:59 +08:00
' ext ' : ' mp4 ' ,
2014-01-30 13:13:57 +08:00
' title ' : ' Hero Corp Making of - Extrait 1 ' ,
' description ' : ' md5:c87d54871b1790679aec1197e73d650a ' ,
2014-09-17 00:47:59 +08:00
' upload_date ' : ' 20131106 ' ,
' timestamp ' : 1383766500 ,
2013-12-06 03:45:53 +08:00
} ,
} ,
# france5
{
2015-09-02 00:42:43 +08:00
' url ' : ' http://www.france5.fr/emissions/c-a-dire/videos/quels_sont_les_enjeux_de_cette_rentree_politique__31-08-2015_908948?onglet=tous&page=1 ' ,
' md5 ' : ' f6c577df3806e26471b3d21631241fd0 ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
2015-09-02 00:42:43 +08:00
' id ' : ' 123327454 ' ,
2014-09-17 00:47:59 +08:00
' ext ' : ' flv ' ,
2015-09-02 00:39:26 +08:00
' title ' : ' C à dire ?! - Quels sont les enjeux de cette rentrée politique ? ' ,
2015-09-02 00:42:43 +08:00
' description ' : ' md5:4a0d5cb5dce89d353522a84462bae5a4 ' ,
' upload_date ' : ' 20150831 ' ,
' timestamp ' : 1441035120 ,
2013-12-06 03:45:53 +08:00
} ,
} ,
# franceo
{
2015-07-19 23:53:09 +08:00
' url ' : ' http://www.franceo.fr/jt/info-soir/18-07-2015 ' ,
' md5 ' : ' 47d5816d3b24351cdce512ad7ab31da8 ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
2015-07-19 23:53:09 +08:00
' id ' : ' 125377621 ' ,
2014-09-17 00:47:59 +08:00
' ext ' : ' flv ' ,
2015-07-19 23:53:09 +08:00
' title ' : ' Infô soir ' ,
' description ' : ' md5:01b8c6915a3d93d8bbbd692651714309 ' ,
' upload_date ' : ' 20150718 ' ,
' timestamp ' : 1437241200 ,
' duration ' : 414 ,
2013-12-06 03:45:53 +08:00
} ,
} ,
2015-07-19 00:41:34 +08:00
{
# francetv embed
' url ' : ' http://embed.francetv.fr/?ue=8d7d3da1e3047c42ade5a5d7dfd3fc87 ' ,
' info_dict ' : {
' id ' : ' EV_30231 ' ,
' ext ' : ' flv ' ,
' title ' : ' Alcaline, le concert avec Calogero ' ,
2015-07-19 23:53:54 +08:00
' description ' : ' md5:61f08036dcc8f47e9cfc33aed08ffaff ' ,
2015-07-19 00:41:34 +08:00
' upload_date ' : ' 20150226 ' ,
' timestamp ' : 1424989860 ,
2015-07-19 00:43:42 +08:00
' duration ' : 5400 ,
2015-07-19 00:41:34 +08:00
} ,
} ,
{
' url ' : ' http://www.france4.fr/emission/highlander/diffusion-du-17-07-2015-04h05 ' ,
' only_matching ' : True ,
} ,
{
' url ' : ' http://www.franceo.fr/videos/125377617 ' ,
' only_matching ' : True ,
}
2013-12-06 03:45:53 +08:00
]
2013-09-24 03:28:33 +08:00
def _real_extract ( self , url ) :
2015-07-19 00:41:34 +08:00
video_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , video_id )
2014-09-17 00:47:59 +08:00
video_id , catalogue = self . _html_search_regex (
2016-02-19 00:09:21 +08:00
r ' (?:href=|player \ .setVideo \ ( \ s*) " http://videos? \ .francetv \ .fr/video/([^@]+@[^ " ]+) " ' ,
2014-09-17 00:47:59 +08:00
webpage , ' video ID ' ) . split ( ' @ ' )
return self . _extract_video ( video_id , catalogue )
2013-09-24 03:41:54 +08:00
class GenerationQuoiIE ( InfoExtractor ) :
2014-01-30 13:13:57 +08:00
IE_NAME = ' france2.fr:generation-quoi '
2015-02-01 22:06:55 +08:00
_VALID_URL = r ' https?://generation-quoi \ .france2 \ .fr/portrait/(?P<id>[^/?#]+) '
2013-09-24 03:41:54 +08:00
_TEST = {
2014-01-30 13:13:57 +08:00
' url ' : ' http://generation-quoi.france2.fr/portrait/garde-a-vous ' ,
' info_dict ' : {
2015-02-01 22:06:55 +08:00
' id ' : ' k7FJX8VBcvvLmX4wA5Q ' ,
' ext ' : ' mp4 ' ,
2014-01-30 13:13:57 +08:00
' title ' : ' Génération Quoi - Garde à Vous ' ,
' uploader ' : ' Génération Quoi ' ,
2013-09-24 03:41:54 +08:00
} ,
2014-01-30 13:13:57 +08:00
' params ' : {
2013-09-24 03:41:54 +08:00
# It uses Dailymotion
2014-01-30 13:13:57 +08:00
' skip_download ' : True ,
2013-09-24 03:41:54 +08:00
} ,
}
def _real_extract ( self , url ) :
2015-02-01 22:06:55 +08:00
display_id = self . _match_id ( url )
info_url = compat_urlparse . urljoin ( url , ' /medias/video/ %s .json ' % display_id )
info_json = self . _download_webpage ( info_url , display_id )
2013-09-24 03:41:54 +08:00
info = json . loads ( info_json )
return self . url_result ( ' http://www.dailymotion.com/video/ %s ' % info [ ' id ' ] ,
2014-11-24 04:39:15 +08:00
ie = ' Dailymotion ' )
2014-01-08 23:16:34 +08:00
class CultureboxIE ( FranceTVBaseInfoExtractor ) :
2014-01-30 13:13:57 +08:00
IE_NAME = ' culturebox.francetvinfo.fr '
2014-07-19 18:47:50 +08:00
_VALID_URL = r ' https?://(?:m \ .)?culturebox \ .francetvinfo \ .fr/(?P<name>.*?)( \ ?|$) '
2014-01-08 23:16:34 +08:00
_TEST = {
2015-04-05 00:50:13 +08:00
' url ' : ' http://culturebox.francetvinfo.fr/live/musique/musique-classique/le-livre-vermeil-de-montserrat-a-la-cathedrale-delne-214511 ' ,
2015-04-05 01:06:16 +08:00
' md5 ' : ' 9b88dc156781c4dbebd4c3e066e0b1d6 ' ,
2014-01-30 13:13:57 +08:00
' info_dict ' : {
2015-04-05 00:50:13 +08:00
' id ' : ' EV_50111 ' ,
2015-04-05 01:06:16 +08:00
' ext ' : ' flv ' ,
2015-04-05 00:50:13 +08:00
' title ' : " Le Livre Vermeil de Montserrat à la Cathédrale d ' Elne " ,
' description ' : ' md5:f8a4ad202e8fe533e2c493cc12e739d9 ' ,
' upload_date ' : ' 20150320 ' ,
' timestamp ' : 1426892400 ,
' duration ' : 2760.9 ,
} ,
2014-01-08 23:16:34 +08:00
}
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
name = mobj . group ( ' name ' )
2015-04-05 00:43:34 +08:00
2014-01-08 23:16:34 +08:00
webpage = self . _download_webpage ( url , name )
2015-04-05 00:43:34 +08:00
if " >Ce live n ' est plus disponible en replay< " in webpage :
raise ExtractorError ( ' Video %s is not available ' % name , expected = True )
2014-09-17 00:47:59 +08:00
video_id , catalogue = self . _search_regex (
r ' " http://videos \ .francetv \ .fr/video/([^@]+@[^ " ]+) " ' , webpage , ' video id ' ) . split ( ' @ ' )
return self . _extract_video ( video_id , catalogue )