diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2010-07-23 18:32:38 +0100 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2010-07-24 12:04:21 +0100 |
commit | 50027abd715acc24978e7830162c70c7e1a05811 (patch) | |
tree | 4fb505872cccba2763933d34bf700c5065104533 /src | |
parent | 8df5efb99c5c2c796fe302613a629f481f1f7bcb (diff) | |
download | totem-50027abd715acc24978e7830162c70c7e1a05811.tar.gz |
Bug 625013 — Can't play "GUADEC 2010 STATE OF THE UNION Teaser"
YouTube changed the page format again, necessitating a change in the way
video URIs are scraped from the playback page. Closes: bgo#625013
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/youtube/totem-youtube.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/src/plugins/youtube/totem-youtube.c b/src/plugins/youtube/totem-youtube.c index 45b27a667..25c62b73e 100644 --- a/src/plugins/youtube/totem-youtube.c +++ b/src/plugins/youtube/totem-youtube.c @@ -388,14 +388,6 @@ impl_deactivate (PeasActivatable *plugin, GObject *totem) g_regex_unref (self->regex); } -static const gchar * -get_fmt_param (TotemYouTubePlugin *self) -{ - if (bacon_video_widget_get_connection_speed (self->bvw) >= 10) - return "&fmt=18"; - return ""; -} - typedef struct { TotemYouTubePlugin *plugin; guint tree_view; @@ -496,29 +488,32 @@ resolve_t_param_cb (GObject *source_object, GAsyncResult *result, TParamData *da video_id = gdata_youtube_video_get_video_id (GDATA_YOUTUBE_VIDEO (data->entry)); - /* Check for the t parameter, which is now in a JavaScript array on the video page */ + /* Check for the fmt_url_map parameter */ g_regex_match (self->regex, contents, 0, &match_info); if (g_match_info_matches (match_info) == TRUE) { - gchar *t_param, *s; - const gchar *fmt_param; - GString *video_uri_string; + gchar *fmt_url_map_escaped, *fmt_url_map; + gchar **mappings, **i; /* We have a match */ - s = g_match_info_fetch (match_info, 1); - t_param = g_uri_unescape_string (s, NULL); - if (t_param == NULL) - t_param = s; - else - g_free (s); - fmt_param = get_fmt_param (self); - - video_uri_string = g_string_new ("http://www.youtube.com/get_video?video_id="); - g_string_append_uri_escaped (video_uri_string, video_id, NULL, TRUE); - g_string_append (video_uri_string, "&t="); - g_string_append_uri_escaped (video_uri_string, t_param, NULL, TRUE); - g_string_append (video_uri_string, fmt_param); - - video_uri = g_string_free (video_uri_string, FALSE); + fmt_url_map_escaped = g_match_info_fetch (match_info, 1); + fmt_url_map = g_uri_unescape_string (fmt_url_map_escaped, NULL); + g_free (fmt_url_map_escaped); + + /* The fmt_url_map parameter is in the following format: + * fmt1|uri1,fmt2|uri2,fmt3|uri3,... + * where fmtN is an identifier for the audio and video encoding and resolution as described here: + * (http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs) and uriN is the playback URI for that format. */ + mappings = g_strsplit (fmt_url_map, ",", 0); + + for (i = mappings; *i != NULL; i++) { + /* For the moment we just take the first format we get */ + gchar **mapping = g_strsplit (*i, "|", 2); + video_uri = g_strdup (mapping[1]); + g_strfreev (mapping); + break; + } + + g_strfreev (mappings); } else { GDataMediaContent *content; @@ -906,7 +901,7 @@ search_button_clicked_cb (GtkButton *button, TotemYouTubePlugin *self) * cycles repeatedly creating new regexes for each video whose t param we resolve. */ /* We're looking for a line of the form: * var swfHTML = (isIE) ? "<object...econds=194&t=vjVQa1PpcFP36LLlIaDqZIG1w6e30b-7WVBgsQLLA3s%3D&rv.6.id=OzLjC6Pm... */ - self->regex = g_regex_new ("swfHTML = .*&t=([^&]+)&", G_REGEX_OPTIMIZE, 0, NULL); + self->regex = g_regex_new ("swfHTML = .*&fmt_url_map=([^&]+)&", G_REGEX_OPTIMIZE, 0, NULL); g_assert (self->regex != NULL); /* Set up the GData service (needed for the tree views' queries) */ |