[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#725142: pu: package totem-plugin-arte/3.2.1-1~wheezy1



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Cyril,

Thank you for this review.

Here is an updated debdiff and some answers to your questions.
The updated full source package is still available on mentors.
http://mentors.debian.net/package/totem-plugin-arte

>> The new package also includes the harden binary that is already
>> in experimental and Ubuntu since many months.
> 
> Please don't include that into proposed updates.

Ok, I dropped this part.


> Version is supposed to be 3.2.1-1~deb7u1 in that case (would be 
> 3.1.2-1+deb7u1 otherwise).

Changed.

>> Totem-plugin-arte is a leaf package and the current Wheezy
>> version is unusable.  IMHO, this looks like a very low risk
>> upgrade.
> 
> Fixing only the actual issues is usually what we prefer, and I see
> no reasons to operate differently here. Tagging moreinfo until a
> cleaned up diff is proposed. ;)

It's the first time I'm trying to push an update to Stable, so I will
do what you think is best.

Though you said the idea of relying on the new upstream version seemed
reasonable in this case, so I'm still trying to go with it for now.

If you want me to revert/change big parts of the upstream code, it may
be better to base the package on an older version.

> ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
> ====
> 
> --- totem-plugin-arte-3.1.2/connection-status.vala	2012-09-15
> 13:40:03.000000000 +0200 +++
> totem-plugin-arte-3.2.1/connection-status.vala	2013-09-22
> 18:09:47.000000000 +0200 @@ -96,7 +96,7 @@ this.is_online = true;
> // online by default }
> 
> -    private void proxy_signal_cb (string sender_name, string
> signal_name, Variant parameters) +    private void proxy_signal_cb
> (GLib.DBusProxy obj, string? sender_name, string signal_name,
> Variant parameters) { if (signal_name == "StateChanged") {
> 
> → Is the '?' between 'string' and 'sender_name' really intended?
> (Sorry, but I'm not learning vala tonight.)

This means sender_name is nullable.
This change allows the plugin to build with valac >= 0.18. It was
actually a bug that the former code built with earlier valac versions.


> -Standards-Version: 3.9.3 +Standards-Version: 3.9.4
> 
> → Noise in stable diffs, never a good idea.

I reverted the standard version bump.


> -Depends: totem (>> 2.90), +Depends: totem (<< 3.5),
> 
> → Given even oldstable has 2.30.2-6, which fulfills the old
> dependency, you could have kept the old dependency (>> 2.90) and
> added the new one (<< 3.5); that would have saved some
> headscratching to the reviewer.

Done.


> ---
> totem-plugin-arte-3.1.2/org.gnome.totem.plugins.arteplus7.gschema.xml
> 2012-09-15 13:40:03.000000000 +0200 +++
> totem-plugin-arte-3.2.1/org.gnome.totem.plugins.arteplus7.gschema.xml
> 2013-09-22 18:09:47.000000000 +0200 @@ -4,6 +4,7 @@ <value
> value="0" nick="Unknown"/> <value value="1" nick="Medium"/> <value
> value="2" nick="High"/> +    <value value="3" nick="Low"/> </enum> 
> <enum id="org.gnome.Totem.arteplus7.language"> <value value="0"
> nick="Unknown"/> @@ -12,7 +13,7 @@ </enum> <schema
> id="org.gnome.Totem.arteplus7" path="/org/gnome/Totem/arteplus7/"> 
> <key name="quality" enum="org.gnome.Totem.arteplus7.quality"> -
> <default>'High'</default> +      <default>'Medium'</default>
> 
> → Changing default settings in stable is never nice. I suspect
> this {could,should} be reverted (unless it's not functional but
> then it shouldn't be proposed in the above enum.

This is a bit more complicated.
First, I can confirm that this default change only affect those that
did not change the setting at any time.

Secondly, if you are a user of arte+7 or of this plugin, you may have
noticed that Arte changed the quality of its feeds. It was during
their big website update that broke totem-plugin-arte.

Basically, the old "Medium" is now "Low", the old "High" is now
"Medium" and there is now a new "ultra high" feed that is now called
"High".
I'm sorry I don't have an actual proof of this (the old feeds are gone
now). That's just what the main developer of the plugin, I and some
users on the French Ubuntu forum noticed.

So, if you trust me into this, the change we are talking about here is
not supposed to change anything for users who did not customized their
settings.  They will get the same actual video quality as before.


If you really don't like it, I can patch it.


Cheers,
Nicolas
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJSTHA1AAoJEF5mTbNeG1+eoxsP/1K35HR+9es4g+69KA4j3CS7
7Q9mq2vdfLO8kDbqHpfI7BN+RJj95XlfF9ZimJpBtIFPlAZkbt04LY024F5OjZEe
tvoqWLcygtKmoNSRt2SfMi4+Y4LMhL1P5u9fXAEP/VeQZMGdGqEfypHxpTlyqkpZ
WlcUrLhcu6XgyPa9Q+5AB6AFZihpwVt/uyRD+BWGeDZj301kEccQ8jhn7Xv8hdoP
mvZsWiZRqnFeljruNmveoDqYeFSdlIrDy9jieDpCoS6fspTBaz7NuFwYGgxRkYNR
hBjtJ+hX9fdiPlVnecWoKJqSZSob4erBxzekWv79CW/8k9p8bFSzrC8pGNy/1sMn
AjbzEpinUSKaZ2erdce7MkOxIzB5JHLrvHfC9U/dt6N6I3+Ak6XPMUlB8R25+8R/
hM6UvF2/kQpSGSyJ/qFWxllsChqVXQrb2oUANwY7KpPBO57cYdA57xJt20HSkZnD
vX+TjtcS1E4ObFfHqX2VElRljUr4iTQKfyWwVbDM29F2UVMCUpyZWTc3KeZSt/Kh
xGl1deIbnWl1UyEFdjXX1y1Dc8O8Wh/tzeMnwCdRkaIWJU8OUjkqLsU09ijef1bG
0tE8EeXSdFIGlwoRy3cOzhsN7dfybbX8du6PA3QG33FbY0zcYU+La2Cr/LH47w3N
1VQMGmDDYtubzm6RIHUN
=xNOD
-----END PGP SIGNATURE-----
diff -Nru totem-plugin-arte-3.1.2/arteparser.vala totem-plugin-arte-3.2.1/arteparser.vala
--- totem-plugin-arte-3.1.2/arteparser.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/arteparser.vala	2013-09-22 18:09:47.000000000 +0200
@@ -28,10 +28,11 @@
 
 using GLib;
 using Soup;
+using Json;
 
 public abstract class ArteParser : GLib.Object
 {
-    public bool has_data { get; protected set; default = false; }
+    public bool has_data { get; protected set; default = false; } // more data available
     protected string xml_fr;
     protected string xml_de;
     protected GLib.SList<Video> videos;
@@ -55,7 +56,7 @@
         return has_data;
     }
 
-    public unowned GLib.SList<Video> parse (Language lang) throws MarkupError, IOError
+    public virtual unowned GLib.SList<Video> parse (Language lang) throws MarkupError, IOError
     {
         videos = new GLib.SList<Video> ();
 
@@ -105,36 +106,127 @@
     }
 }
 
+public class ArteJSONParser : ArteParser
+{
+    private string json_url_fr = "http://www.arte.tv/guide/fr/plus7.json";;
+    private string json_url_de = "http://www.arte.tv/guide/de/plus7.json";;
+
+    public ArteJSONParser ()
+    {
+        reset ();
+    }
+
+    public override void reset ()
+    {
+        has_data = true;
+    }
+
+    public override uint get_error_threshold ()
+    {
+        return 1; // no errors are tolerated
+    }
+
+    public override unowned GLib.SList<Video> parse (Language lang) throws MarkupError, IOError
+    {
+        videos = new GLib.SList<Video> ();
+
+        Soup.Message msg;
+        if (lang == Language.GERMAN) {
+            msg = new Soup.Message ("GET", json_url_de);
+        } else {
+            msg = new Soup.Message ("GET", json_url_fr);
+        }
+
+        Soup.SessionAsync session = create_session ();
+
+        session.send_message (msg);
+
+        if (msg.status_code != Soup.KnownStatusCode.OK) {
+            throw new IOError.HOST_NOT_FOUND ("videos.arte.tv could not be accessed.");
+        }
+
+        var parser = new Json.Parser ();
+
+        try {
+            parser.load_from_data ((string) msg.response_body.flatten ().data, -1);
+        } catch (GLib.Error e) {
+            throw new GLib.MarkupError.PARSE ("Json parsing failed: '%s'", e.message);
+        }
+
+        var root_object = parser.get_root ().get_object ();
+        var video_array = root_object.get_array_member ("videos");
+
+        foreach (var video in video_array.get_elements ()) {
+            var v = video.get_object ();
+            var current_video = new Video();
+
+            current_video.title = v.get_string_member ("title");
+            current_video.page_url = "http://www.arte.tv"; + v.get_string_member ("url");
+            current_video.image_url = v.get_string_member ("image_url");
+            current_video.desc = v.get_string_member ("desc");
+            // TODO current_video.publication_date
+
+            string end_time_str = v.get_string_member ("video_rights_until");
+
+            try {
+                var regex = new Regex ("([0-9]+)[:h]([0-9]+)");
+                MatchInfo match;
+                regex.match(end_time_str, 0, out match);
+                string hours_str = match.fetch(1);
+                string minutes_str = match.fetch(2);
+                int hours = int.parse(hours_str);
+                int minutes = int.parse(minutes_str);
+
+                current_video.offline_date = GLib.TimeVal ();
+                current_video.offline_date.get_current_time ();
+                current_video.offline_date.tv_sec += ((hours * 60 * 60 + minutes * 60));
+            } catch (GLib.RegexError e) {
+                 GLib.warning ("Offline date parsing failed.");
+            }
+
+            videos.append (current_video);
+        }
+
+        has_data = false;
+
+        return videos;
+    }
+}
+
 public class ArteRSSParser : ArteParser
 {
     private Video current_video = null;
     private string current_data = null;
     /* official RSS feeds by topic, contains duplicats, no image urls and offline dates */
     private const string[] feeds_fr = {
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/actualites/index--3188636,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/documentaire/index--3188646,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/decouverte/index--3188644,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/europe/index--3188648,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/geopolitique_histoire/index--3188654,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/societe/index--3188652,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/junior/index--3188656,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/cinema_fiction/index--3188642,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/arts_cultures_spectacles/index--3188640,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/culture_pop_alternative/index--3188638,view,rss.xml";,
-        "http://videos.arte.tv/fr/do_delegate/videos/toutes_les_videos/environnement_science/index--3188650,view,rss.xml";
+        "http://videos.arte.tv/fr/do_delegate/videos/index-3188626,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/arts_cultures_spectacles/index-3188640,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/culture_pop_alternative/index-3188638,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/documentaire/index-3188646,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/europe/index-3188648,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/junior/index-3188656,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/index--3188626,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/actualites/index-3188636,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/cinema_fiction/index-3188642,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/decouverte/index-3188644,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/environnement_science/index-3188650,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/geopolitique_histoire/index-3188654,view,rss.xml";,
+        "http://videos.arte.tv/fr/do_delegate/videos/chaines/societe/index-3188652,view,rss.xml";
     };
     private const string[] feeds_de = {
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/aktuelles/index--3188636,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/dokus/index--3188646,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/entdeckung/index--3188644,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/europa/index--3188648,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/geopolitik_geschichte/index--3188654,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/gesellschaft/index--3188652,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/junior/index--3188656,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/kino_serien/index--3188642,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/kunst_kultur/index--3188640,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/popkultur_musik/index--3188638,view,rss.xml";,
-        "http://videos.arte.tv/de/do_delegate/videos/alle_videos/umwelt_wissenschaft/index--3188650,view,rss.xml";
+        "http://videos.arte.tv/de/do_delegate/videos/index-3188626,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/aktuelles/index-3188636,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/entdeckung/index-3188644,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/geopolitik_geschichte/index-3188654,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/junior/index-3188656,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/kunst_kultur/index-3188640,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/umwelt_wissenschaft/index-3188650,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/index--3188626,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/dokus/index-3188646,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/europe/index-3188648,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/gesellschaft/index-3188652,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/kino_serien/index-3188642,view,rss.xml";,
+        "http://videos.arte.tv/de/do_delegate/videos/themen/popkultur_musik/index-3188638,view,rss.xml";
     };
     private const uint feed_count = 11;
     private uint feed_idx = 0;
diff -Nru totem-plugin-arte-3.1.2/arteplus7.vala totem-plugin-arte-3.2.1/arteplus7.vala
--- totem-plugin-arte-3.1.2/arteplus7.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/arteplus7.vala	2013-09-22 18:09:47.000000000 +0200
@@ -37,7 +37,8 @@
 {
     UNKNOWN = 0,
     MEDIUM,
-    HIGH
+    HIGH,
+    LOW
 }
 
 public enum Language
@@ -98,7 +99,7 @@
     private Totem.Object t;
     private Gtk.Entry search_entry; /* search field with buttons inside */
     private VideoListView tree_view; /* list of movie thumbnails */
-    private ArteParser parsers[2]; /* array of parsers */
+    private ArteParser parsers[3]; /* array of parsers */
     private GLib.Settings settings;
     private GLib.Settings proxy_settings;
     private Cache cache; /* image thumbnail cache */
@@ -106,6 +107,8 @@
     private VideoQuality quality;
     private ConnectionStatus cs;
 
+    private delegate void VoidFunction ();
+
     public ArtePlugin ()
     {
         /* constructor chain up hint */
@@ -153,8 +156,9 @@
         t = object as Totem.Object;
         cache = new Cache (Environment.get_user_cache_dir ()
              + CACHE_PATH_SUFFIX);
-        parsers[0] = new ArteXMLParser ();
-        parsers[1] = new ArteRSSParser ();
+        parsers[0] = new ArteJSONParser ();
+        parsers[1] = new ArteXMLParser ();
+        parsers[2] = new ArteRSSParser ();
         tree_view = new VideoListView (cache);
 
         tree_view.video_selected.connect (callback_video_selected);
@@ -271,30 +275,49 @@
             }
         });
 
-        var quali_radio_medium = new Gtk.RadioButton.with_mnemonic (null, _("_medium"));
+        var quali_radio_low = new Gtk.RadioButton.with_mnemonic (null, _("l_ow"));
+        var quali_radio_medium = new Gtk.RadioButton.with_mnemonic_from_widget (
+                quali_radio_low, _("_medium"));
         var quali_radio_high = new Gtk.RadioButton.with_mnemonic_from_widget (
                 quali_radio_medium, _("_high"));
-        if (quality == VideoQuality.MEDIUM)
-            quali_radio_medium.set_active (true);
-        else
-            quali_radio_high.set_active (true);
+        switch (quality) {
+            case VideoQuality.LOW:
+                quali_radio_low.set_active (true);
+                break;
+            case VideoQuality.MEDIUM:
+                quali_radio_medium.set_active (true);
+                break;
+            default:
+                quali_radio_high.set_active (true);
+                break;
+        }
 
-        quali_radio_medium.toggled.connect (() => {
-            VideoQuality last = quality;
-            if (quali_radio_medium.get_active ())
-                quality = VideoQuality.MEDIUM;
+        /* reusable lambda function */
+        VoidFunction quality_toggle_clicked = () => {
+            VideoQuality last = this.quality;
+            if (quali_radio_low.get_active ())
+                this.quality = VideoQuality.LOW;
+            else if (quali_radio_medium.get_active ())
+                this.quality = VideoQuality.MEDIUM;
             else
-                quality = VideoQuality.HIGH;
+                this.quality = VideoQuality.HIGH;
 
-            if (last != quality) {
-                if (!settings.set_enum ("quality", (int) quality))
+            if (last != this.quality) {
+                if (!settings.set_enum ("quality", (int) this.quality))
                     GLib.warning ("Storing the quality setting failed.");
             }
-        });
+        };
+
+        quali_radio_low.toggled.connect (() => { quality_toggle_clicked(); });
+        quali_radio_medium.toggled.connect (() => { quality_toggle_clicked(); });
+        quali_radio_high.toggled.connect (() => { quality_toggle_clicked(); });
 
         settings.changed["quality"].connect (() => {
             var q = settings.get_enum ("quality");
-            if (q == VideoQuality.MEDIUM) {
+            if (q == VideoQuality.LOW) {
+                quality = VideoQuality.LOW;
+                quali_radio_low.set_active (true);
+            } else if (q == VideoQuality.MEDIUM) {
                 quality = VideoQuality.MEDIUM;
                 quali_radio_medium.set_active (true);
             } else {
@@ -303,7 +326,10 @@
             }
         });
 
-        var langs_label = new Gtk.Label (_("Language:"));
+        var langs_label = new Gtk.Label.with_mnemonic (_("_Language:"));
+        langs_label.set_mnemonic_widget (langs);
+        langs.mnemonic_activate.connect (() => { langs.popup(); return true; });
+
         var langs_box = new Box (Gtk.Orientation.HORIZONTAL, 20);
         langs_box.pack_start (langs_label, false, true, 0);
         langs_box.pack_start (langs, true, true, 0);
@@ -311,6 +337,7 @@
         var quali_label = new Gtk.Label (_("Video quality:"));
         var quali_box = new Box (Gtk.Orientation.HORIZONTAL, 20);
         quali_box.pack_start (quali_label, false, true, 0);
+        quali_box.pack_start (quali_radio_low, false, true, 0);
         quali_box.pack_start (quali_radio_medium, false, true, 0);
         quali_box.pack_start (quali_radio_high, true, true, 0);
 
@@ -491,7 +518,7 @@
             return;
         }
 
-        t.add_to_playlist_and_play (stream_url, title, false);
+        t.add_to_playlist_and_play (stream_url, title);
     }
 
     private void callback_refresh_rss_feed ()
diff -Nru totem-plugin-arte-3.1.2/cache.vala totem-plugin-arte-3.2.1/cache.vala
--- totem-plugin-arte-3.1.2/cache.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/cache.vala	2013-09-22 18:09:47.000000000 +0200
@@ -83,7 +83,7 @@
 
         // download it
         var extractor = new ImageUrlExtractor ();
-        debug ("Download missing image url: %s", v.title);
+        debug ("Extract missing image url: %s", v.title);
         try {
             v.image_url = extractor.get_url (VideoQuality.UNKNOWN, Language.UNKNOWN, v.page_url);
 
diff -Nru totem-plugin-arte-3.1.2/cell-renderer-video.vala totem-plugin-arte-3.2.1/cell-renderer-video.vala
--- totem-plugin-arte-3.1.2/cell-renderer-video.vala	1970-01-01 01:00:00.000000000 +0100
+++ totem-plugin-arte-3.2.1/cell-renderer-video.vala	2013-09-22 18:09:47.000000000 +0200
@@ -0,0 +1,116 @@
+/*
+ * Totem Arte Plugin allows you to watch streams from arte.tv
+ * Copyright (C) 2013 Nicolas Delvaux <contact@nicolas-delvaux.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+ *
+ * The Totem Arte Plugin project hereby grants permission for non-GPL compatible
+ * GStreamer plugins to be used and distributed together with GStreamer, Totem
+ * and Totem Arte Plugin. This permission is above and beyond the permissions
+ * granted by the GPL license by which Totem Arte Plugin is covered.
+ * If you modify this code, you may extend this exception to your version of the
+ * code, but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version.
+ *
+ */
+
+using Gtk;
+
+public class CellRendererVideo : Gtk.CellRenderer
+/**
+ * This is a simple re-implementation of "Totem.CellRendererVideo".
+ * The original widget was removed from Totem since the 3.8 version.
+ */
+
+{
+
+    public Gdk.Pixbuf thumbnail { get; set; }
+    public string title { get; set; }
+
+    public override void get_size (Widget widget, Gdk.Rectangle? cell_area,
+                                   out int x_offset, out int y_offset,
+                                   out int width, out int height)
+    {
+        x_offset = 0;
+        y_offset = 0;
+        if (this.thumbnail != null) {
+            width = this.thumbnail.width;
+            height = this.thumbnail.height + 30;
+        } else {
+            // This is initialization time, nothing to draw
+            // These values have no importance
+            width = 30;
+            height = 30;
+        }
+    }
+
+    public override void render (Cairo.Context ctx, Widget widget,
+                                 Gdk.Rectangle background_area,
+                                 Gdk.Rectangle cell_area,
+                                 CellRendererState flags)
+    {
+
+        if (this.thumbnail == null) {
+            // This is initialization time, nothing to draw
+            return;
+        }
+
+        Gtk.StateFlags state;
+
+        /* Sort out the state (used to draw the title) */
+        if (!this.get_sensitive ()) {
+            state = Gtk.StateFlags.INSENSITIVE;
+        } else if ((flags & Gtk.CellRendererState.SELECTED) == Gtk.CellRendererState.SELECTED) {
+            if (widget.has_focus)
+                state = Gtk.StateFlags.SELECTED;
+            else
+                state = Gtk.StateFlags.ACTIVE;
+        }  else if ((flags & Gtk.CellRendererState.PRELIT) == Gtk.CellRendererState.PRELIT &&
+                widget.get_state_flags () == Gtk.StateFlags.PRELIGHT) {
+            state = Gtk.StateFlags.PRELIGHT;
+        } else {
+            if (widget.get_state_flags () == Gtk.StateFlags.INSENSITIVE)
+                state = Gtk.StateFlags.INSENSITIVE;
+            else
+                state = Gtk.StateFlags.NORMAL;
+        }
+
+
+        /* Draw the title */
+        StyleContext context = widget.get_style_context ();
+        Pango.Layout layout = widget.create_pango_layout (this.title);
+        Pango.FontDescription desc = context.get_font (state);
+
+        desc.set_weight (Pango.Weight.BOLD);
+        layout.set_font_description (desc);
+        layout.set_ellipsize (Pango.EllipsizeMode.END);
+        layout.set_width (cell_area.width * Pango.SCALE);
+        layout.set_alignment (Pango.Alignment.CENTER);
+        context.set_state (state);
+        context.render_layout (ctx,
+                               background_area.x,
+                               background_area.y + this.thumbnail.height + 8,
+                               layout);
+
+
+        /* Draw the thumbnail */
+        Gdk.cairo_set_source_pixbuf (ctx, this.thumbnail,
+                                     (background_area.width - this.thumbnail.width) / 2,
+                                     cell_area.y + 3);
+        Gdk.cairo_rectangle (ctx, cell_area);
+        ctx.fill ();
+
+    }
+}
diff -Nru totem-plugin-arte-3.1.2/ChangeLog totem-plugin-arte-3.2.1/ChangeLog
--- totem-plugin-arte-3.1.2/ChangeLog	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/ChangeLog	2013-09-22 18:09:47.000000000 +0200
@@ -1,3 +1,118 @@
+commit 87ad236096c5e144278f32b439d483e07bde83b2
+Author: Simon Wenner <simon@wenner.ch>
+
+    release 3.2.1
+
+commit 5808864850c43cfa3bf6800a411c3353ace909cd
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Update translations
+
+commit 3f4c4765bd3c48043471a70e8d28b0a6ea589eda
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Do not use the same mnemonics multiple time (in English)
+
+commit f393e9937637440a5a36f5e28f66708204aca6d6
+Author: Simon Wenner <simon@wenner.ch>
+
+    fixed the extraction of https video links
+
+commit 92f59af0fd1f64c99141d3f0abeb7db662924f1f
+Author: Simon Wenner <simon@wenner.ch>
+
+    update NEWS
+
+commit 3ce8665f001fed0fb7dd8952b1857372cfdd3722
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Update and complete translations
+
+commit fd67f9d5c6a96623ac9ecb2eed4318ae9d5e04ee
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Add a mnemonic for the language setting
+
+commit 236157950b791b01bdbe592912fb595bc5fd5dbd
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Try to extract the player URI
+
+commit 8dae7f95651f505337545f0f5bd2cbd3cf81ce74
+Author: Simon Wenner <simon@wenner.ch>
+
+    use MEDIUM as the default quality in the url-extractor too
+
+commit d325ea512f35ac8f48c24e75bc3db14e6dc7386a
+Author: Simon Wenner <simon@wenner.ch>
+
+    add release 3.2.0 news
+
+commit c856f630e9b32063cbb8a65b25e134e905e1c28d
+Author: Simon Wenner <simon@wenner.ch>
+
+    added support for low quality streams, medium is the new default quality
+
+commit 11e2ab67788665df517727b9c142a7062edfb875
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Implement a (simpler) equivalent of "Totem.CellRendererVideo"
+
+commit afc8fdf12efed8c09038b085e78655f4ac061e3e
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Add *.vapi to .gitignore
+
+commit 36686474bd212267415477618bbf518c6a44f45a
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Update the README
+
+commit 81d8d84969dfb35d5e8ea794d41305e9b794286e
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Fix segfaults at startup when the language is set to French
+
+commit 9e94bfff983f2ef4eb2c1ca8c90e7751ce26eac3
+Author: Simon Wenner <simon@wenner.ch>
+
+    added a new additional video feed based on json files. The access is much faster than the xml files.
+
+commit 69f147963ec2432421488be7a98af7dbbeb45722
+Author: Simon Wenner <simon@wenner.ch>
+
+    update the RSS urls. Some are broken, let's hope they get fixed soon.
+
+commit a558b3213b826d46b4ab476c5bbef7b30849b4e4
+Author: Simon Wenner <simon@wenner.ch>
+
+    reimplemented the RTMP stream extractor to fix video playback with the new website
+
+commit 870ff540e0f7ae8e458111995b38e3e7088e9831
+Author: Simon Wenner <simon@wenner.ch>
+
+    release 3.1.3
+
+commit bcd75c06822777432123cbe5229a45a3942b791c
+Author: Simon Wenner <simon@wenner.ch>
+
+    ConnectionStatus: make proxy_signal_cb private again
+
+commit e49acdfafdf626d0c21bac936ad59dbe7e7f9133
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Fix compilation with valac-0.18
+
+commit 7553f2a6eb3bae7acd398d843c5b9004682e5cf0
+Author: Nicolas Delvaux <contact@nicolas-delvaux.org>
+
+    Fix compilation with libtotem 3.6
+
+commit 63d2b34237cffe636b15cdb5173f9f6aef361fd7
+Author: Simon Wenner <simon@wenner.ch>
+
+    release 3.1.2
+
 commit d654a1012ca0a1f2e0a164dd5b7066de95cce2ae
 Author: Simon Wenner <simon@wenner.ch>
 
diff -Nru totem-plugin-arte-3.1.2/connection-status.vala totem-plugin-arte-3.2.1/connection-status.vala
--- totem-plugin-arte-3.1.2/connection-status.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/connection-status.vala	2013-09-22 18:09:47.000000000 +0200
@@ -96,7 +96,7 @@
         this.is_online = true; // online by default
     }
 
-    private void proxy_signal_cb (string sender_name, string signal_name, Variant parameters)
+    private void proxy_signal_cb (GLib.DBusProxy obj, string? sender_name, string signal_name, Variant parameters)
     {
         if (signal_name == "StateChanged")
         {
diff -Nru totem-plugin-arte-3.1.2/debian/changelog totem-plugin-arte-3.2.1/debian/changelog
--- totem-plugin-arte-3.1.2/debian/changelog	2012-09-15 14:15:20.000000000 +0200
+++ totem-plugin-arte-3.2.1/debian/changelog	2013-10-02 20:01:38.000000000 +0200
@@ -1,3 +1,10 @@
+totem-plugin-arte (3.2.1-1~deb7u1) stable; urgency=low
+
+  * New upstream release
+  * Add a patch to build against Totem 3.0 (revert an upstream commit)
+
+ -- Nicolas Delvaux <contact@nicolas-delvaux.org>  Wed, 02 Oct 2013 20:01:20 +0200
+
 totem-plugin-arte (3.1.2-1) unstable; urgency=medium
 
   * New upstream bug-fix only release
diff -Nru totem-plugin-arte-3.1.2/debian/control totem-plugin-arte-3.2.1/debian/control
--- totem-plugin-arte-3.1.2/debian/control	2012-05-06 13:41:04.000000000 +0200
+++ totem-plugin-arte-3.2.1/debian/control	2013-10-02 20:16:10.000000000 +0200
@@ -3,11 +3,12 @@
 Priority: extra
 Maintainer: Nicolas Delvaux <contact@nicolas-delvaux.org>
 Build-Depends: debhelper (>= 8.0.0),
-               libtotem-dev,
+               libtotem-dev (<< 3.5),
                valac-0.16,
                libgtk-3-dev,
                libsoup2.4-dev,
                libpeas-dev (>= 1.2.0),
+               libjson-glib-dev,
                gettext
 Standards-Version: 3.9.3
 Homepage: http://gitorious.org/totem-plugin-arte
@@ -15,6 +16,7 @@
 Package: totem-plugin-arte
 Architecture: any
 Depends: totem (>> 2.90),
+         totem (<< 3.5),
          gstreamer0.10-plugins-bad (>= 0.10.19.3),
          gstreamer0.10-ffmpeg,
          gsettings-desktop-schemas,
diff -Nru totem-plugin-arte-3.1.2/debian/patches/series totem-plugin-arte-3.2.1/debian/patches/series
--- totem-plugin-arte-3.1.2/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ totem-plugin-arte-3.2.1/debian/patches/series	2013-09-09 20:19:31.000000000 +0200
@@ -0,0 +1 @@
+totem-compatibility
diff -Nru totem-plugin-arte-3.1.2/debian/patches/totem-compatibility totem-plugin-arte-3.2.1/debian/patches/totem-compatibility
--- totem-plugin-arte-3.1.2/debian/patches/totem-compatibility	1970-01-01 01:00:00.000000000 +0100
+++ totem-plugin-arte-3.2.1/debian/patches/totem-compatibility	2013-10-02 00:35:24.000000000 +0200
@@ -0,0 +1,18 @@
+Description: Revert upstream commit to build with Totem < 3.6
+
+---
+
+Origin: vendor
+Last-Update: 2013-10-02
+
+--- totem-plugin-arte-3.1.3+git.orig/arteplus7.vala
++++ totem-plugin-arte-3.1.3+git/arteplus7.vala
+@@ -492,7 +492,7 @@ class ArtePlugin : Peas.Activatable, Pea
+             return;
+         }
+ 
+-        t.add_to_playlist_and_play (stream_url, title);
++        t.add_to_playlist_and_play (stream_url, title, false);
+     }
+ 
+     private void callback_refresh_rss_feed ()
diff -Nru totem-plugin-arte-3.1.2/Makefile totem-plugin-arte-3.2.1/Makefile
--- totem-plugin-arte-3.1.2/Makefile	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/Makefile	2013-09-22 18:09:47.000000000 +0200
@@ -1,9 +1,9 @@
 DESTDIR=
-VERSION=3.1.2
+VERSION=3.2.1
 NAME=totem-plugin-arte
 PACKAGE=$(NAME)-$(VERSION)
 VALAC=valac
-VALA_DEPS=--pkg Totem-1.0 --pkg PeasGtk-1.0 --pkg libsoup-2.4 --pkg gtk+-3.0 --pkg gio-2.0
+VALA_DEPS=--pkg Totem-1.0 --pkg PeasGtk-1.0 --pkg libsoup-2.4 --pkg gtk+-3.0 --pkg gio-2.0 --pkg json-glib-1.0
 CC_ARGS=-X -fPIC -X -shared --Xcc="-D GETTEXT_PACKAGE=\"totem-arte\""
 VALA_ARGS=-D DEBUG_MESSAGES $(CC_ARGS) -g
 VALA_SOURCE=\
@@ -12,6 +12,7 @@
 	cache.vala \
 	url-extractor.vala \
 	video.vala \
+	cell-renderer-video.vala \
 	video-list-view.vala \
 	connection-status.vala
 EXTRA_DIST=\
diff -Nru totem-plugin-arte-3.1.2/NEWS totem-plugin-arte-3.2.1/NEWS
--- totem-plugin-arte-3.1.2/NEWS	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/NEWS	2013-09-22 18:09:47.000000000 +0200
@@ -1,3 +1,23 @@
+2013 September 22th - Totem Arte Plugin 3.2.1
+
+Changes since 3.2.0:
+ * Fixed the extraction of https video links
+ * Fixed preferences mnemonics in English
+
+2013 September 10th - Totem Arte Plugin 3.2.0
+
+Changes since 3.1.3:
+ * Fix stream extraction from the new Arte website
+ * Reimplementation of the removed Totem.CellRenderVideo
+ * New and more efficient primary video feed source (JSON)
+ * Support for low quality streams
+ * Minor bug fixes and translation updates
+
+2012 December 9th - Totem Arte Plugin 3.1.3
+
+Changes since 3.1.2:
+ * Fix compilation with Vala 0.18 and Totem 3.6.0
+
 2012 September 15th - Totem Arte Plugin 3.1.2
 
 Changes since 3.1.1:
diff -Nru totem-plugin-arte-3.1.2/org.gnome.totem.plugins.arteplus7.gschema.xml totem-plugin-arte-3.2.1/org.gnome.totem.plugins.arteplus7.gschema.xml
--- totem-plugin-arte-3.1.2/org.gnome.totem.plugins.arteplus7.gschema.xml	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/org.gnome.totem.plugins.arteplus7.gschema.xml	2013-09-22 18:09:47.000000000 +0200
@@ -4,6 +4,7 @@
     <value value="0" nick="Unknown"/>
     <value value="1" nick="Medium"/>
     <value value="2" nick="High"/>
+    <value value="3" nick="Low"/>
   </enum>
   <enum id="org.gnome.Totem.arteplus7.language">
     <value value="0" nick="Unknown"/>
@@ -12,7 +13,7 @@
   </enum>
   <schema id="org.gnome.Totem.arteplus7" path="/org/gnome/Totem/arteplus7/">
     <key name="quality" enum="org.gnome.Totem.arteplus7.quality">
-      <default>'High'</default>
+      <default>'Medium'</default>
       <summary>Quality</summary>
       <description>The video stream quality.</description>
     </key>
diff -Nru totem-plugin-arte-3.1.2/po/arte-totem.pot totem-plugin-arte-3.2.1/po/arte-totem.pot
--- totem-plugin-arte-3.1.2/po/arte-totem.pot	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/po/arte-totem.pot	2013-09-22 18:09:47.000000000 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-02 20:26+0200\n"
+"POT-Creation-Date: 2013-09-20 19:28+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,76 +17,80 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../arteplus7.vala:157
+#: ../arteplus7.vala:176
 msgid "Reload feed"
 msgstr ""
 
-#: ../arteplus7.vala:161
+#: ../arteplus7.vala:180
 msgid "Clear the search text"
 msgstr ""
 
-#: ../arteplus7.vala:190
+#: ../arteplus7.vala:209
 msgid "Arte+7"
 msgstr ""
 
-#: ../arteplus7.vala:228
+#: ../arteplus7.vala:247
 msgid "French"
 msgstr ""
 
-#: ../arteplus7.vala:229
+#: ../arteplus7.vala:248
 msgid "German"
 msgstr ""
 
-#: ../arteplus7.vala:259
+#: ../arteplus7.vala:278
+msgid "l_ow"
+msgstr ""
+
+#: ../arteplus7.vala:280
 msgid "_medium"
 msgstr ""
 
-#: ../arteplus7.vala:261
+#: ../arteplus7.vala:282
 msgid "_high"
 msgstr ""
 
-#: ../arteplus7.vala:291
-msgid "Language:"
+#: ../arteplus7.vala:329
+msgid "_Language:"
 msgstr ""
 
-#: ../arteplus7.vala:296
+#: ../arteplus7.vala:337
 msgid "Video quality:"
 msgstr ""
 
 #. display offline message
-#: ../arteplus7.vala:313
+#: ../arteplus7.vala:355
 msgid "No internet connection."
 msgstr ""
 
 #. display loading message
-#: ../arteplus7.vala:330
+#: ../arteplus7.vala:372
 msgid "Loading..."
 msgstr ""
 
-#: ../arteplus7.vala:389
+#: ../arteplus7.vala:431
 msgid "Markup Parser Error"
 msgstr ""
 
-#: ../arteplus7.vala:390
+#: ../arteplus7.vala:432
 msgid "Sorry, the plugin could not parse the Arte video feed."
 msgstr ""
 
-#: ../arteplus7.vala:392
+#: ../arteplus7.vala:434
 msgid "Network problem"
 msgstr ""
 
-#: ../arteplus7.vala:393
+#: ../arteplus7.vala:435
 msgid ""
 "Sorry, the plugin could not download the Arte video feed.\n"
 "Please verify your network settings and (if any) your proxy settings."
 msgstr ""
 
 #. This video access is restricted
-#: ../arteplus7.vala:461
+#: ../arteplus7.vala:503
 msgid "This video access is restricted"
 msgstr ""
 
-#: ../arteplus7.vala:462
+#: ../arteplus7.vala:504
 msgid ""
 "It seems that, because of its content, this video can only be watched in a "
 "precise time interval.\n"
@@ -95,11 +99,11 @@
 msgstr ""
 
 #. The video is part of the XML/RSS feed but no stream is available yet
-#: ../arteplus7.vala:465
+#: ../arteplus7.vala:507
 msgid "This video is not available yet"
 msgstr ""
 
-#: ../arteplus7.vala:466
+#: ../arteplus7.vala:508
 msgid ""
 "Sorry, the plugin could not find any stream URL.\n"
 "It seems that this video is not available yet, even on the Arte web-player.\n"
@@ -109,17 +113,17 @@
 
 #. Network problems
 #. ExtractionError.EXTRACTION_ERROR or an unspecified error
-#: ../arteplus7.vala:469 ../arteplus7.vala:473
+#: ../arteplus7.vala:511 ../arteplus7.vala:515
 msgid "Video URL Extraction Error"
 msgstr ""
 
-#: ../arteplus7.vala:470
+#: ../arteplus7.vala:512
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Please verify your network settings and (if any) your proxy settings."
 msgstr ""
 
-#: ../arteplus7.vala:474
+#: ../arteplus7.vala:516
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Perhaps this stream is not yet available, you may retry in a few minutes.\n"
diff -Nru totem-plugin-arte-3.1.2/po/de.po totem-plugin-arte-3.2.1/po/de.po
--- totem-plugin-arte-3.1.2/po/de.po	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/po/de.po	2013-09-22 18:09:47.000000000 +0200
@@ -1,78 +1,82 @@
 # I18n file for Arte+7 totem plugin
-# Copyright (C) 2010, 2011, 2012 Simon Wenner <simon@wenner.ch>
+# Copyright (C) 2013 Simon Wenner <simon@wenner.ch>
 # This file is distributed under the same license as the Totem Arte Plugin package.
 # This file was first created by Nicolas Delvaux <contact@nicolas-delvaux.org>, 2010.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: 3.1.0\n"
+"Project-Id-Version: 3.2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-02 20:26+0200\n"
-"PO-Revision-Date: 2012-05-02 20:30+0200\n"
+"POT-Creation-Date: 2013-09-20 19:28+0200\n"
+"PO-Revision-Date: 2012-05-02 22:51+0200\n"
 "Last-Translator: Nicolas Delvaux <contact@nicolas-delvaux.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../arteplus7.vala:157
+#: ../arteplus7.vala:176
 msgid "Reload feed"
 msgstr "Videos aktualisieren"
 
-#: ../arteplus7.vala:161
+#: ../arteplus7.vala:180
 msgid "Clear the search text"
 msgstr "Suchtext löschen"
 
-#: ../arteplus7.vala:190
+#: ../arteplus7.vala:209
 msgid "Arte+7"
 msgstr "Arte+7"
 
-#: ../arteplus7.vala:228
+#: ../arteplus7.vala:247
 msgid "French"
 msgstr "Französisch"
 
-#: ../arteplus7.vala:229
+#: ../arteplus7.vala:248
 msgid "German"
 msgstr "Deutsch"
 
-#: ../arteplus7.vala:259
+#: ../arteplus7.vala:278
+msgid "l_ow"
+msgstr "_niedrig"
+
+#: ../arteplus7.vala:280
 msgid "_medium"
 msgstr "_mittel"
 
-#: ../arteplus7.vala:261
+#: ../arteplus7.vala:282
 msgid "_high"
 msgstr "_hoch"
 
-#: ../arteplus7.vala:291
-msgid "Language:"
-msgstr "Sprache:"
+#: ../arteplus7.vala:329
+msgid "_Language:"
+msgstr "_Sprache:"
 
-#: ../arteplus7.vala:296
+#: ../arteplus7.vala:337
 msgid "Video quality:"
 msgstr "Videoqualität:"
 
 #. display offline message
-#: ../arteplus7.vala:313
+#: ../arteplus7.vala:355
 msgid "No internet connection."
 msgstr "Keine Internetverbindung."
 
 #. display loading message
-#: ../arteplus7.vala:330
+#: ../arteplus7.vala:372
 msgid "Loading..."
 msgstr "Lade..."
 
-#: ../arteplus7.vala:389
+#: ../arteplus7.vala:431
 msgid "Markup Parser Error"
 msgstr "Markup Lesefehler"
 
-#: ../arteplus7.vala:390
+#: ../arteplus7.vala:432
 msgid "Sorry, the plugin could not parse the Arte video feed."
 msgstr "Entschuldigung, das Plugin konnte den Arte-Videofeed nicht lesen."
 
-#: ../arteplus7.vala:392
+#: ../arteplus7.vala:434
 msgid "Network problem"
 msgstr "Verbindungsproblem"
 
-#: ../arteplus7.vala:393
+#: ../arteplus7.vala:435
 msgid ""
 "Sorry, the plugin could not download the Arte video feed.\n"
 "Please verify your network settings and (if any) your proxy settings."
@@ -82,11 +86,11 @@
 "Einstellungen."
 
 #. This video access is restricted
-#: ../arteplus7.vala:461
+#: ../arteplus7.vala:503
 msgid "This video access is restricted"
 msgstr "Dieses Video ist nur eingeschränkt verfügbar"
 
-#: ../arteplus7.vala:462
+#: ../arteplus7.vala:504
 msgid ""
 "It seems that, because of its content, this video can only be watched in a "
 "precise time interval.\n"
@@ -99,11 +103,11 @@
 "Versuchen sie es erneut, z.B. zwischen 23:00 und 5:00 Uhr."
 
 #. The video is part of the XML/RSS feed but no stream is available yet
-#: ../arteplus7.vala:465
+#: ../arteplus7.vala:507
 msgid "This video is not available yet"
 msgstr "Video ist nocht nicht verfügbar"
 
-#: ../arteplus7.vala:466
+#: ../arteplus7.vala:508
 msgid ""
 "Sorry, the plugin could not find any stream URL.\n"
 "It seems that this video is not available yet, even on the Arte web-player.\n"
@@ -118,11 +122,11 @@
 
 #. Network problems
 #. ExtractionError.EXTRACTION_ERROR or an unspecified error
-#: ../arteplus7.vala:469 ../arteplus7.vala:473
+#: ../arteplus7.vala:511 ../arteplus7.vala:515
 msgid "Video URL Extraction Error"
 msgstr "Video URL Extraktionsfehler"
 
-#: ../arteplus7.vala:470
+#: ../arteplus7.vala:512
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Please verify your network settings and (if any) your proxy settings."
@@ -131,7 +135,7 @@
 "Bitte überprüfen sie Ihre Netzwerk- und (falls vorhanden) Proxy-"
 "Einstellungen."
 
-#: ../arteplus7.vala:474
+#: ../arteplus7.vala:516
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Perhaps this stream is not yet available, you may retry in a few minutes.\n"
@@ -177,5 +181,3 @@
 msgid "_Open in Web Browser"
 msgstr "Link im Browser ö_ffnen"
 
-#~ msgid "Arte+7 Plugin Properties"
-#~ msgstr "Arte+7 Plugin-Einstellungen"
diff -Nru totem-plugin-arte-3.1.2/po/fr.po totem-plugin-arte-3.2.1/po/fr.po
--- totem-plugin-arte-3.1.2/po/fr.po	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/po/fr.po	2013-09-22 18:09:47.000000000 +0200
@@ -1,78 +1,82 @@
 # I18n file for Arte+7 totem plugin
-# Copyright (C) 2010, 2011, 2012 Simon Wenner <simon@wenner.ch>
+# Copyright (C) 2013 Simon Wenner <simon@wenner.ch>
 # This file is distributed under the same license as the Totem Arte Plugin package.
 # This file was first created by Nicolas Delvaux <contact@nicolas-delvaux.org>, 2010.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: 3.1.0\n"
+"Project-Id-Version: 3.2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-02 20:26+0200\n"
-"PO-Revision-Date: 2012-05-02 20:28+0200\n"
+"POT-Creation-Date: 2013-09-20 19:28+0200\n"
+"PO-Revision-Date: 2013-09-10 22:44+0200\n"
 "Last-Translator: Nicolas Delvaux <contact@nicolas-delvaux.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../arteplus7.vala:157
+#: ../arteplus7.vala:176
 msgid "Reload feed"
 msgstr "Recharger la liste des vidéos"
 
-#: ../arteplus7.vala:161
+#: ../arteplus7.vala:180
 msgid "Clear the search text"
 msgstr "Effacer le texte recherché"
 
-#: ../arteplus7.vala:190
+#: ../arteplus7.vala:209
 msgid "Arte+7"
 msgstr "Arte+7"
 
-#: ../arteplus7.vala:228
+#: ../arteplus7.vala:247
 msgid "French"
 msgstr "Français"
 
-#: ../arteplus7.vala:229
+#: ../arteplus7.vala:248
 msgid "German"
 msgstr "Allemand"
 
-#: ../arteplus7.vala:259
+#: ../arteplus7.vala:278
+msgid "l_ow"
+msgstr "_basse"
+
+#: ../arteplus7.vala:280
 msgid "_medium"
 msgstr "_moyenne"
 
-#: ../arteplus7.vala:261
+#: ../arteplus7.vala:282
 msgid "_high"
 msgstr "_haute"
 
-#: ../arteplus7.vala:291
-msgid "Language:"
-msgstr "Langageâ?¯:"
+#: ../arteplus7.vala:329
+msgid "_Language:"
+msgstr "_Langage :"
 
-#: ../arteplus7.vala:296
+#: ../arteplus7.vala:337
 msgid "Video quality:"
 msgstr "Qualité vidéo�:"
 
 #. display offline message
-#: ../arteplus7.vala:313
+#: ../arteplus7.vala:355
 msgid "No internet connection."
 msgstr "Pas de connexion Internet."
 
 #. display loading message
-#: ../arteplus7.vala:330
+#: ../arteplus7.vala:372
 msgid "Loading..."
 msgstr "Chargement..."
 
-#: ../arteplus7.vala:389
+#: ../arteplus7.vala:431
 msgid "Markup Parser Error"
 msgstr "Erreur de l'analyseur syntaxique"
 
-#: ../arteplus7.vala:390
+#: ../arteplus7.vala:432
 msgid "Sorry, the plugin could not parse the Arte video feed."
 msgstr "Désolé, le greffon n'a pas pu analyser le flux vidéo Arte."
 
-#: ../arteplus7.vala:392
+#: ../arteplus7.vala:434
 msgid "Network problem"
 msgstr "Problème réseau"
 
-#: ../arteplus7.vala:393
+#: ../arteplus7.vala:435
 msgid ""
 "Sorry, the plugin could not download the Arte video feed.\n"
 "Please verify your network settings and (if any) your proxy settings."
@@ -82,11 +86,11 @@
 "paramètres de votre proxy."
 
 #. This video access is restricted
-#: ../arteplus7.vala:461
+#: ../arteplus7.vala:503
 msgid "This video access is restricted"
 msgstr "L'accès à cette vidéo est restreint"
 
-#: ../arteplus7.vala:462
+#: ../arteplus7.vala:504
 msgid ""
 "It seems that, because of its content, this video can only be watched in a "
 "precise time interval.\n"
@@ -99,11 +103,11 @@
 "Vous pouvez réessayer plus tard, par exemple entre 23h et 5h."
 
 #. The video is part of the XML/RSS feed but no stream is available yet
-#: ../arteplus7.vala:465
+#: ../arteplus7.vala:507
 msgid "This video is not available yet"
 msgstr "Cette vidéo n'est pas encore disponible"
 
-#: ../arteplus7.vala:466
+#: ../arteplus7.vala:508
 msgid ""
 "Sorry, the plugin could not find any stream URL.\n"
 "It seems that this video is not available yet, even on the Arte web-player.\n"
@@ -118,11 +122,11 @@
 
 #. Network problems
 #. ExtractionError.EXTRACTION_ERROR or an unspecified error
-#: ../arteplus7.vala:469 ../arteplus7.vala:473
+#: ../arteplus7.vala:511 ../arteplus7.vala:515
 msgid "Video URL Extraction Error"
 msgstr "Erreur d'extraction de l'URL de la vidéo"
 
-#: ../arteplus7.vala:470
+#: ../arteplus7.vala:512
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Please verify your network settings and (if any) your proxy settings."
@@ -131,7 +135,7 @@
 "Veuillez vérifier les paramètres de votre connexion et (si besoin) les "
 "paramètres de votre proxy."
 
-#: ../arteplus7.vala:474
+#: ../arteplus7.vala:516
 msgid ""
 "Sorry, the plugin could not extract a valid stream URL.\n"
 "Perhaps this stream is not yet available, you may retry in a few minutes.\n"
@@ -176,6 +180,3 @@
 #: ../video-list-view.vala:281
 msgid "_Open in Web Browser"
 msgstr "_Ouvrir dans le navigateur Web"
-
-#~ msgid "Arte+7 Plugin Properties"
-#~ msgstr "Préférences du greffon Arte+7"
diff -Nru totem-plugin-arte-3.1.2/README totem-plugin-arte-3.2.1/README
--- totem-plugin-arte-3.1.2/README	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/README	2013-09-22 18:09:47.000000000 +0200
@@ -7,19 +7,21 @@
 ---------------
 Dependencies:
 ---------------
-Totem >= 3.0
+Totem >= 3.6
 libpeas >= 1.2.0
 Vala >= 0.15.0
 Gtk+-3.0
 libsoup2.4
 libglib >= 2.25.15
+libjson-glib
 gstreamer-plugins-bad >= 0.10.20
 gsettings-desktop-schemas
 Network-Manager (optional)
 
 On Debian or Ubuntu:
-# aptitude install valac-0.16 libgtk3.0-dev libtotem-dev libpeas-dev \
-libsoup2.4-dev gettext gstreamer0.10-plugins-bad gsettings-desktop-schemas
+# aptitude install valac-0.16 libgtk-3-dev libtotem-dev libpeas-dev \
+libsoup2.4-dev gettext gstreamer0.10-plugins-bad gsettings-desktop-schemas \
+libjson-glib-dev
 
 ---------------
 Installation:
diff -Nru totem-plugin-arte-3.1.2/url-extractor.vala totem-plugin-arte-3.2.1/url-extractor.vala
--- totem-plugin-arte-3.1.2/url-extractor.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/url-extractor.vala	2013-09-22 18:09:47.000000000 +0200
@@ -28,6 +28,7 @@
 
 using GLib;
 using Soup;
+using Json;
 
 public errordomain ExtractionError
 {
@@ -82,88 +83,77 @@
     public string get_url (VideoQuality q, Language lang, string page_url)
             throws ExtractionError
     {
-        string regexp, url;
+        string regexp;
         debug ("Initial Page URL:\t\t'%s'", page_url);
 
-        /* Setup the language string */
-        string lang_str = "fr";
-        if (lang == Language.GERMAN)
-            lang_str = "de";
-
-        /* Setup quality string */
-        string quali_str = "hd";
-        if (q == VideoQuality.MEDIUM)
-            quali_str = "sd";
-
-        /* Get the Arte Flash player URI */
-        // Example:
-        // var url_player = "http://videos.arte.tv/blob/web/i18n/view/player_9-3188338-data-4807088.swf";;
-        regexp = "var url_player = \"(http://.*.swf)\";";
-        var flash_player_uri = extract_string_from_page (page_url, regexp);
-        debug ("Extract Flash player URI:\t'%s'", flash_player_uri);
-        if (flash_player_uri == null)
+        /* JSON uri */
+        regexp = "arte_vp_url=\"(https?://.*.json)\">";
+        var json_uri = extract_string_from_page (page_url, regexp);
+        debug ("Extract JSON URI:\t'%s'", json_uri);
+        if (json_uri == null)
             throw new ExtractionError.EXTRACTION_FAILED ("Video URL Extraction Error");
 
-        /* Get the Flash XML data */
-        // Example:
-        // vars_player.videorefFileUrl = "http://videos.arte.tv/de/do_delegate/videos/geheimnisvolle_pflanzen-3219416,view,asPlayerXml.xml";;
-        regexp = "videorefFileUrl = \"(http://.*.xml)\";";
-        url = extract_string_from_page (page_url, regexp);
-        debug ("Extract Flash Videoref:\t'%s'", url);
 
-        if (url == null)
-            throw new ExtractionError.EXTRACTION_FAILED ("Video URL Extraction Error");
+        /* download and parse the main JSON file */
+        var message = new Soup.Message ("GET", json_uri);
+        this.session.send_message (message);
 
-        /* Get the language specific flash XML data */
-        // Example:
-        // <video lang="de" ref="http://videos.arte.tv/de/do_delegate/videos/geheimnisvolle_pflanzen-3219418,view,asPlayerXml.xml"/>
-        // <video lang="fr" ref="http://videos.arte.tv/fr/do_delegate/videos/secrets_de_plantes-3219420,view,asPlayerXml.xml"/>
-        regexp = "video lang=\"" + lang_str + "\" ref=\"(http://.*.xml)\"";
-        url = extract_string_from_page (url, regexp);
-        debug ("Extract Flash Lang Videoref:\t'%s'", url);
+        string rtmp_uri = null;
 
-        if (url == null)
-            throw new ExtractionError.EXTRACTION_FAILED ("Video URL Extraction Error");
+        // TODO detect if a video is only availabe after 23:00
+
+        try {
+            var parser = new Json.Parser ();
+            parser.load_from_data ((string) message.response_body.flatten ().data, -1);
 
-        /* Get the RTMP uri. */
-        // Example:
-        // <url quality="hd">rtmp://artestras.fcod.llnwd.net/a3903/o35/MP4:geo/videothek/EUR_DE_FR/arteprod/A7_SGT_ENC_08_037778-021-B_PG_HQ_FR?h=7258f52f54eb0d320f6650e647432f03</url>
-        // <url quality="sd">rtmp://artestras.fcod.llnwd.net/a3903/o35/MP4:geo/videothek/EUR_DE_FR/arteprod/A7_SGT_ENC_06_037778-021-B_PG_MQ_FR?h=76c529bce0f034e74dc92a14549d6a4e</url>
-        regexp = "quality=\"" + quali_str + "\">(rtmp://.*)</url>";
-        var rtmp_uri = extract_string_from_page (url, regexp);
-        debug ("Extract RTMP URI:\t\t'%s'", rtmp_uri);
-
-        /* sometimes only one quality level is available */
-        if (rtmp_uri == null) {
-            if (q == VideoQuality.HIGH) {
-                q = VideoQuality.MEDIUM;
-                quali_str = "sd";
-                GLib.warning ("No high quality stream available. Fallback to medium quality.");
-            } else if (q == VideoQuality.MEDIUM) {
-                q = VideoQuality.HIGH;
-                quali_str = "hd";
-                GLib.warning ("No medium quality stream available. Fallback to high quality.");
+            var root_object = parser.get_root ().get_object ();
+            var player_object = root_object.get_object_member ("videoJsonPlayer");
+            var streams_object = player_object.get_object_member ("VSR");
+            Json.Object video_object;
+
+            switch (q) {
+                case VideoQuality.LOW:
+                    video_object = streams_object.get_object_member ("RTMP_LQ_1");
+                    break;
+                case VideoQuality.HIGH:
+                    video_object = streams_object.get_object_member ("RTMP_SQ_1");
+                    break;
+                default: // MEDIUM is the default
+                    video_object = streams_object.get_object_member ("RTMP_MQ_1"); // or "RTMP_EQ_1" ?
+                    break;
             }
-            regexp = "quality=\"" + quali_str + "\">(rtmp://.*)</url>";
-            rtmp_uri = extract_string_from_page (url, regexp);
-            debug ("Extract RTMP URI:\t\t'%s'", rtmp_uri);
 
-            if (rtmp_uri == null)
-                throw new ExtractionError.STREAM_NOT_READY ("This video is not available yet");
+            string streamer = video_object.get_string_member ("streamer");
+            string url = video_object.get_string_member ("url");
+            debug ("Streamer base:\t'%s'", streamer);
+            debug ("Streamer path:\t'%s'", url);
+
+            rtmp_uri = streamer + "mp4:" + url;
+
+        } catch (Error e) {
+            throw new ExtractionError.EXTRACTION_FAILED ("Video URL Extraction Error");
         }
 
-        /* detect videos with temporal restrictions */
-        if (rtmp_uri.has_suffix ("/carton_23h_fr.mp4") || rtmp_uri.has_suffix ("/carton_23h_de.mp4"))
-            throw new ExtractionError.ACCESS_RESTRICTED ("This video is not available currently");
-
-        /* Build the stream URI
-         * To prevent regular disconnections (and so to keep the plugin usable),
-         * we need to pass the Flash player uri to GStreamer.
-         * We do that by appending it to the stream uri.
-         * (see the librtmp manual for more information) */
-        // Example:
-        // rtmp://artestras.fcod.llnwd.net/a3903/o35/MP4:geo/videothek/EUR_DE_FR/arteprod/A7_SGT_ENC_08_042143-002-A_PG_HQ_FR?h=d7878fae5c9726844d22da78e05f764e swfVfy=1 swfUrl=http://videos.arte.tv/blob/web/i18n/view/player_9-3188338-data-4807088.swf
-        string stream_uri = rtmp_uri + " swfVfy=1 swfUrl=" + flash_player_uri;
+
+        // Try to figure out the player URI
+        string player_uri;
+        try {
+            regexp = "content=\"(http.*.swf)\\?";
+            var embeded_uri = "http://player.arte.tv/v2/index.php?json_url="; + json_uri + "&config=arte_tvguide";
+            player_uri = extract_string_from_page (embeded_uri, regexp);
+            debug ("Extract player URI:\t'%s'", player_uri);
+            if (player_uri == null) {
+                throw new ExtractionError.EXTRACTION_FAILED ("Player URL Extraction Error");
+            }
+        } catch (Error e) {
+            // Do not abort and try to play the video with a known old player URI.
+            // The server does not seems to always check the player validity, so it may work anyway.
+            debug ("Failed to extract the flash player URI! Trying to fallback...");
+            player_uri = "http://www.arte.tv/playerv2/jwplayer5/mediaplayer.5.7.1894.swf";;
+        }
+
+
+        string stream_uri = rtmp_uri + " swfVfy=1 swfUrl=" + player_uri;
         debug ("Build stream URI:\t\t'%s'", stream_uri);
 
         return stream_uri;
diff -Nru totem-plugin-arte-3.1.2/video-list-view.vala totem-plugin-arte-3.2.1/video-list-view.vala
--- totem-plugin-arte-3.1.2/video-list-view.vala	2012-09-15 13:40:03.000000000 +0200
+++ totem-plugin-arte-3.2.1/video-list-view.vala	2013-09-22 18:09:47.000000000 +0200
@@ -51,7 +51,7 @@
         cache = c;
 
         /* setup cell style */
-        var renderer = new Totem.CellRendererVideo (false);
+        var renderer = new CellRendererVideo ();
         insert_column_with_attributes (0, "", renderer,
                 "thumbnail", Col.IMAGE,
                 "title", Col.NAME, null);

Attachment: totem-plugin-arte+pu.diff.sig
Description: PGP signature


Reply to: