[Pkg-mozext-commits] [flashgot] 01/04: Imported Upstream version 1.5.6.7+dfsg

Michael Meskes meskes at moszumanska.debian.org
Thu Oct 23 05:48:22 UTC 2014


This is an automated email from the git hooks/post-receive script.

meskes pushed a commit to branch master
in repository flashgot.

commit 5f395793625979d2b19c416a43d9c65b5013c125
Author: Michael Meskes <meskes at debian.org>
Date:   Wed Oct 22 17:12:08 2014 +0200

    Imported Upstream version 1.5.6.7+dfsg
---
 chrome/flashgot.jar!/content/flashgot/DMS.js       |  15 +-
 .../flashgot.jar!/content/flashgot/MediaSniffer.js | 114 +++---
 chrome/flashgot.jar!/content/flashgot/Youtube.js   | 435 +++++++++++++++------
 chrome/flashgot.jar!/content/flashgot/about.xul    |   2 +-
 chrome/flashgot.jar!/content/flashgot/chooser.js   |  12 +
 chrome/flashgot.jar!/content/flashgot/chooser.xul  |   3 +
 chrome/flashgot.jar!/content/flashgot/contents.rdf |   2 +-
 .../content/flashgot/flashgotGalleryBuilder.js     | 110 ++++--
 .../content/flashgot/flashgotOverlay.js            |  50 ++-
 .../locale/af-ZA/flashgot/flashgot.dtd             |   2 +-
 .../locale/be-BY/flashgot/flashgot.dtd             |   2 +-
 .../locale/bg-BG/flashgot/flashgot.dtd             |   2 +-
 .../locale/bn-IN/flashgot/flashgot.dtd             |   2 +-
 .../locale/ca-AD/flashgot/flashgot.dtd             |   2 +-
 .../locale/cs-CZ/flashgot/flashgot.dtd             |   2 +-
 .../locale/da-DK/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/da/flashgot/flashgot.dtd  |   2 +-
 .../flashgot.jar!/locale/de/flashgot/flashgot.dtd  |   2 +-
 .../locale/el-GR/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/el/flashgot/flashgot.dtd  |   2 +-
 .../locale/en-US/flashgot/flashgot.dtd             |   2 +-
 .../locale/es-AR/flashgot/flashgot.dtd             |   2 +-
 .../locale/es-CL/flashgot/flashgot.dtd             |   2 +-
 .../locale/es-ES/flashgot/flashgot.dtd             |   2 +-
 .../locale/et-EE/flashgot/flashgot.dtd             |   2 +-
 .../locale/eu-ES/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/eu/flashgot/flashgot.dtd  |   2 +-
 .../locale/fa-IR/flashgot/flashgot.dtd             |   2 +-
 .../locale/fi-FI/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/fi/flashgot/flashgot.dtd  |   2 +-
 .../flashgot.jar!/locale/fr/flashgot/flashgot.dtd  |  16 +-
 .../locale/gl-ES/flashgot/flashgot.dtd             |   2 +-
 .../locale/he-IL/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/he/flashgot/flashgot.dtd  |   2 +-
 .../locale/hi-IN/flashgot/flashgot.dtd             |   2 +-
 .../locale/hr-HR/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/hu/flashgot/flashgot.dtd  |   2 +-
 .../locale/hy-AM/flashgot/flashgot.dtd             |   2 +-
 .../locale/id-ID/flashgot/flashgot.dtd             |   2 +-
 .../locale/it-IT/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/it/flashgot/flashgot.dtd  |   2 +-
 .../locale/ja-JP/flashgot/flashgot.dtd             |   2 +-
 .../locale/ka-GE/flashgot/flashgot.dtd             |   2 +-
 .../locale/kk-KZ/flashgot/flashgot.dtd             |   2 +-
 .../locale/km-KH/flashgot/flashgot.dtd             |   2 +-
 .../locale/lt-LT/flashgot/flashgot.dtd             |   2 +-
 .../locale/mk-MK/flashgot/flashgot.dtd             |   2 +-
 .../locale/ml-IN/flashgot/flashgot.dtd             |   2 +-
 .../locale/mn-MN/flashgot/flashgot.dtd             |   2 +-
 .../locale/ms-MY/flashgot/flashgot.dtd             |   2 +-
 .../locale/nb-NO/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/nl/flashgot/flashgot.dtd  |   2 +-
 .../flashgot.jar!/locale/pl/flashgot/flashgot.dtd  |   2 +-
 .../locale/pt-BR/flashgot/flashgot.dtd             |   2 +-
 .../locale/pt-PT/flashgot/flashgot.dtd             |   2 +-
 .../locale/ro-RO/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/ru/flashgot/flashgot.dtd  |   2 +-
 .../locale/sk-SK/flashgot/flashgot.dtd             |   2 +-
 .../locale/sl-SI/flashgot/flashgot.dtd             |   2 +-
 .../locale/sq-AL/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/sr/flashgot/flashgot.dtd  |   2 +-
 .../locale/sv-SE/flashgot/flashgot.dtd             |   2 +-
 .../locale/th-TH/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/th/flashgot/flashgot.dtd  |   2 +-
 .../locale/tr-TR/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/tr/flashgot/flashgot.dtd  |   2 +-
 .../locale/uk-UA/flashgot/flashgot.dtd             |   2 +-
 .../flashgot.jar!/locale/uk/flashgot/flashgot.dtd  |   2 +-
 .../flashgot.jar!/locale/vi/flashgot/flashgot.dtd  |   2 +-
 .../locale/zh-CN/flashgot/flashgot.dtd             |   2 +-
 .../locale/zh-TW/flashgot/flashgot.dtd             |   2 +-
 components/flashgotService.js                      |   2 +-
 defaults/preferences/flashgot.js                   |   1 +
 install.js                                         |   2 +-
 install.rdf                                        |   2 +-
 75 files changed, 606 insertions(+), 282 deletions(-)

diff --git a/chrome/flashgot.jar!/content/flashgot/DMS.js b/chrome/flashgot.jar!/content/flashgot/DMS.js
index a271d20..8888bda 100644
--- a/chrome/flashgot.jar!/content/flashgot/DMS.js
+++ b/chrome/flashgot.jar!/content/flashgot/DMS.js
@@ -790,19 +790,26 @@ FlashGotDMX.prototype.createJob = function(links, opType) {
   }
   
   if (this.terminal) {
+    const autoClose = fg.getPref("term.autoClose", -1);
     const title = shellEsc("FlashGot " +  (len > 1 ? "(" + len + ")" : links[0].href));
     const shell = this.unixShell && shellEsc(this.unixShell.path) || '';
     job = 
-      "if [ \"$1\" = \"\" ]; then\n" +
+      "if [ -z \"$FLASHGOT_TERM\" ]; then\n" +
+      "  export FLASHGOT_TERM; FLASHGOT_TERM=1\n" +
+      "  if which flashgot-term >/dev/null 2>&1; then\n" +
+      "     flashgot-term " + title + " " + shell + " \"$0\" && exit\n" +
+      "  fi\n" +
       "  if which gnome-terminal >/dev/null 2>&1; then\n" +
-      "    gnome-terminal -t " + title + " -x " + shell + " \"$0\" term\nexit\n" +
+      "    gnome-terminal -t " + title + " -x " + shell + " \"$0\" && exit\n" +
       "  fi\n" +
       "  if which xterm >/dev/null 2>&1; then\n" +
-      "    xterm -T " + title + " -e " + shell + " \"$0\" term && exit\n" +
+      "    xterm -T " + title + " -e " + shell + " \"$0\" && exit\n" +
       "  fi\n" +
       "fi\n" +
       job +
-      "\nsleep 5";
+        (autoClose < 0
+          ? "\necho -n 'Press any key to exit...' && read k || sleep 5\n"
+          : "\nsleep " + autoClose + "\n");
   }
   
   return job;
diff --git a/chrome/flashgot.jar!/content/flashgot/MediaSniffer.js b/chrome/flashgot.jar!/content/flashgot/MediaSniffer.js
index 80d402b..8f9d5f9 100644
--- a/chrome/flashgot.jar!/content/flashgot/MediaSniffer.js
+++ b/chrome/flashgot.jar!/content/flashgot/MediaSniffer.js
@@ -117,11 +117,23 @@ var MediaSniffer = {
   observe: function (channel, topic, data) {
     if (channel instanceof CI.nsIHttpChannel && Components.isSuccessCode(channel.status)) {
       try {
+        // |extras.window|, when |extras| exists as the "flashgot.media.extras"
+        // property of |channel|, is never null and always an actual (as opposed
+        // to potential - see |yt_win| below) YouTube window - either a top-level
+        // one (i.e. a browser tab/window) if we're on YouTube (e.g. /watch?v=VIDEO_ID),
+        // or a frame/iframe if we're not on YouTube (e.g. a forum/blog with YouTube
+        // embed iframes).
+        // |win| is never null and always a top-level window.
+        // |yt_win| is never null and always a (potential) YouTube window, i.e. either
+        // |win| or |extras.window|.
+        // XXX: All the YouTube-related functions (both in MediaSniffer and in Youtube)
+        // that want a window as an argument expect a YouTube window, i.e. pass them
+        // |yt_win| and not |win|.
         var extras = {}, win, yt_win, media, map, location;
         try {
           if (channel instanceof CI.nsIPropertyBag && channel instanceof CI.nsIWritablePropertyBag) {
             extras = channel.getProperty("flashgot.media.extras").wrappedJSObject || extras;
-            win = extras.window;
+            win = yt_win = extras.window;
             if (win) {
               channel.deleteProperty("flashgot.media.extras");
               win = win.top;
@@ -131,7 +143,7 @@ var MediaSniffer = {
         if (!win) {
           yt_win = DOM.findChannelWindow(channel) || DOM.mostRecentBrowserWindow && DOM.mostRecentBrowserWindow.content;
           if (!yt_win) return;
-          win = extras.window = yt_win.top;
+          win = yt_win.top;
         }
         media = win._flashgotMedia || (win._flashgotMedia = []);
         location = win.location.href.replace(/#.*/, '');
@@ -139,14 +151,18 @@ var MediaSniffer = {
         media._location = location;
         map = media._map || (media._map = {});
 
-        // Youtube iframe (e.g. /embed/VIDEO_ID).
+        // Potential YouTube iframe (e.g. /embed/VIDEO_ID).
         // For top-level windows we use onLocationChange.
-        if (yt_win && yt_win !== win
-          // Ignore iframes on Youtube itself (comments iframe atm).
-          && ! this.parseYoutubeId(win.location.href)
-          && this.checkYoutube(yt_win))
+        if (yt_win !== win
+          // No need to check for YouTube (again) if it's our parsed stream.
+          && ! extras["flashgot::parsed"]
+          // Pass stream URLs through.
+          && ! Youtube.is_stream_url(channel.URI.spec)
+          // Ignore iframes on YouTube itself (comments iframe atm).
+          && ! Youtube.parseVideoId(win.location.href)
+          )
         {
-          return;
+          if (this.checkYoutube(yt_win)) { return; }
         }
 
         // YouTube - 403 Forbidden. Probably the signature algorithm has changed.
@@ -156,8 +172,8 @@ var MediaSniffer = {
           if (extras["flashgot::parsed"] && !win.flashgotRefreshedYoutubeSignature) {
             if (fg.getPref("media.YouTube.decode_signature_func.auto", true)
                 && (win.flashgotRefreshedYoutubeSignature = 
-                      Youtube.refresh_signature_func(win, function() {
-                        MediaSniffer.checkYoutube(win, null, true);
+                      Youtube.refresh_signature_func(yt_win, function() {
+                        MediaSniffer.checkYoutube(yt_win, null, true);
                       })
                    )
                ) {
@@ -165,33 +181,34 @@ var MediaSniffer = {
             }
             
             // Add the "Refresh signature" menu item
-            const YOUTUBE_REFRESH_SIGNATURE_FUNC_URL = "flashgot::Youtube::refresh_signature_func";
-            if (!(YOUTUBE_REFRESH_SIGNATURE_FUNC_URL in map)) {
-              media.push(map[YOUTUBE_REFRESH_SIGNATURE_FUNC_URL] = {
+            if (!(MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL in map)) {
+              media.push(map[MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL] = {
                 parsed: true,
-                originalURL: YOUTUBE_REFRESH_SIGNATURE_FUNC_URL,
+                originalURL: MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL,
                 Youtube: Youtube,
                 MediaSniffer: MediaSniffer,
+                yt_win: yt_win
               });
               this.updateUI(win);
             }
             return;
-            
           }
         }
 
-        // YouTube - for DASH'ed streams (audio/video-only), Content-Type is "application/octet-stream".
+        // YouTube - for DASH streams (audio/video-only), Content-Type is "application/octet-stream".
         var contentType;
         if (Youtube.is_stream_url(channel.URI.spec) && Math.floor(channel.responseStatus / 100) === 2) {
-          if (Object.keys(map).some(function(url){return Youtube.stream_url_equals(url, channel.URI.spec)})) {
-            this._set_current_url(win, channel.URI.spec);
-            return;
-          }
           // Our parsed stream, or a stream requested by the player.
           // Don't use extras.type because it can be remapped (e.g. "mp4" instead of "video/mp4").
           contentType = this.mediaTypesRx.test(channel.contentType)
             ? channel.contentType
             : Youtube.get_stream_content_type(channel.URI.spec);
+          if (Object.keys(map).some(function(url){return Youtube.stream_url_equals(url, channel.URI.spec);})) {
+            if ( ! extras["flashgot::parsed"] && ! /^audio\//.test(contentType)) {
+              this._set_current_url(win, channel.URI.spec);
+            }
+            return;
+          }
         }
         if (!contentType) {
           contentType = channel.contentType;
@@ -206,7 +223,7 @@ var MediaSniffer = {
         if (channel.responseStatus === 204 && contentType.indexOf("video/") === 0 ||
           contentType === "application/x-www-form-urlencoded" && /youtube\.com\/get_video_info\?.*el=embedded/.test(channel.name)
         ) {
-          this.checkYoutube(DOM.findChannelWindow(channel) || DOM.mostRecentBrowserWindow.content, channel.name);
+          this.checkYoutube(yt_win || DOM.findChannelWindow(channel) || DOM.mostRecentBrowserWindow.content, channel.name);
           return;
         }
 
@@ -315,7 +332,7 @@ var MediaSniffer = {
               : (Math.round(contentLength / 1048576)) + "MB";
 
             // Youtube channel hack
-            var doc = win.document;
+            var doc = yt_win.document;
             var node = doc.getElementById("playnav-curvideo-title");
 
             var createStrings = function (title, o) {
@@ -332,12 +349,12 @@ var MediaSniffer = {
               var fname = typeInfo.fname || '';
 
               title = title.replace(/^\s+|\s+$/, '');
-              const unicode = fg.getPref("media.unicode") && /^UTF.?8$/i.test(win.document.characterSet);
+              const unicode = fg.getPref("media.unicode") && /^UTF.?8$/i.test(yt_win.document.characterSet);
               if (title) {
                 const nonWordRx = unicode ? /[\u0000-\u0020\u2000-\u206F\u2E00-\u2E7F]+|[^\w\u0080-\uffff]+/g : /\W+/g;
                 // remove site name from title
                 title = title.replace(new RegExp("\\b(?:" +
-                  (win.location.host || '').split(".").filter(function (s) {return s}).join("|") + ")\\b", 'ig'), '')
+                  (yt_win.location.host || '').split(".").filter(function (s) {return s}).join("|") + ")\\b", 'ig'), '')
                   .replace(/https?:\/{2}/gi, '')
                   .replace(nonWordRx, '_')
                   .replace(/^_+([^_])/g, '$1')
@@ -400,10 +417,8 @@ var MediaSniffer = {
               url = redirect === 2 && (!channel.originalURI || channel.originalURI.spec == url ? null : channel.originalURI.spec);
             }
             this.updateUI(win);
-          } else if (!extras["flashgot::parsed"]) {
-            this._set_current_url(win, url);
           }
-
+          if (!extras["flashgot::parsed"]) { this._set_current_url(win, url); }
         }
       } catch (e) {
         fg.log("MediaSniffer::observe: exception: [" + typeof(e) + "]: " + (e.message || e) + "\n" + (e.stack || new Error().stack));
@@ -477,53 +492,34 @@ var MediaSniffer = {
   onSecurityChange: function () {},
   onProgressChange: function () {},
 
-  checkYoutube: function(w, url, force) {
+  YOUTUBE_REFRESH_SIGNATURE_FUNC_URL: "flashgot::Youtube::refresh_signature_func",
+  // @param w
+  //   a YouTube window - either a top-level window if we're on YouTube.com,
+  //   or an embed iframe if we're on a forum/blog or something.
+  checkYoutube: function(yt_win, url, force) {
     if (!gFlashGotService.getPref("media.YouTube.autodetect", true)) { return false; }
-    var id = this.parseYoutubeId(url || w.location.href);
+    var id = Youtube.parseVideoId(url || yt_win.location.href);
     if (!id) return false;
-    
+
+    var w = yt_win.top;
     var yids = !force && w._flashGotYoutubeIds || (w._flashGotYoutubeIds = []);
-    if (yids.indexOf(id) !== -1) return true;
-    yids.push(id);
+    var sid = String(id);
+    if (yids.indexOf(sid) !== -1) return true;
+    yids.push(sid);
 
-    Youtube.process(w, id, function (data) {
+    Youtube.process(yt_win, id, function (data) {
       if (!data) return;
       var title = data.title;
       data.streams.forEach(function (s) {
         s.title = title;
         s.type = s.type.split(";")[0] || "Media";
-        s.window = w;
+        s.window = yt_win;
         s["flashgot::parsed"] = true;
         MediaSniffer.peek(s.url, s);
       });
     }, fg.isPrivate(w));
     return true;
   },
-  parseYoutubeId: function (url) {
-    var ioService = Components.classes["@mozilla.org/network/io-service;1"]
-      .getService(Components.interfaces.nsIIOService);
-    var uri = ioService.newURI(url, null, null);
-    // Accessing uri.host throws for urls like "about:blank".
-    // Accessing uri.asciiHost doesn't throw.
-    if (!/^https?$/i.test(uri.scheme)) { return null; }
-    if (/(?:^|\.)youtube\.com$/.test(uri.asciiHost)) {
-      var s = uri.path.replace(/#.*$/, "").replace(/^\//, "");
-      // /watch?v=VIDEO_ID
-      if (/^watch\?/.test(s)) { return /[?&]v=([^&]+)/.test(s) ? RegExp.$1 : null; }
-      // /v/VIDEO_ID, /embed/VIDEO_ID
-      if (/^(?:v|embed)\/([^?\/]+)/.test(s)) { return RegExp.$1; }
-      // /get_video_info?video_id=VIDEO_ID, /get_video?video_id=VIDEO_ID
-      if (/^get_video(?:_info)?\?/.test(s)) { return /[?&]video_id=([^&]+)/.test(s) ? RegExp.$1 : null; }
-      // /api_video_info?video_id=VIDEO_ID
-      if (/^api_video_info\?/.test(s)) { return /[?&]video_id=([^&]+)/.test(s) ? RegExp.$1 : null; }
-      return null;
-    }
-    // https://youtube.googleapis.com/v/VIDEO_ID - youtube.com/v/VIDEO_ID redirects here.
-    if ("youtube.googleapis.com" === uri.asciiHost && /^\/v\/([^?#\/]+)/.test(uri.path)) {
-      return RegExp.$1;
-    }
-    return null;
-  },
   peek: function (url, extras, callback) {
     try {
       var xhr = CC["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(CI.nsIXMLHttpRequest);
diff --git a/chrome/flashgot.jar!/content/flashgot/Youtube.js b/chrome/flashgot.jar!/content/flashgot/Youtube.js
index 6316432..0a04887 100644
--- a/chrome/flashgot.jar!/content/flashgot/Youtube.js
+++ b/chrome/flashgot.jar!/content/flashgot/Youtube.js
@@ -25,7 +25,92 @@ var Youtube = function(){
 // Public part.
 var Youtube = {
 
+  VIDEO_ID_TYPE_YOUTUBE: "youtube",
+  VIDEO_ID_TYPE_GOOGLE: "google",
+  parseVideoId: function (url) {
+    var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+      .getService(Components.interfaces.nsIIOService);
+    var uri = ioService.newURI(url, null, null);
+    // Accessing uri.host throws for urls like "about:blank".
+    // Accessing uri.asciiHost doesn't throw.
+    if (!/^https?$/i.test(uri.scheme)) { return null; }
+
+    var rc = {
+      type: this.VIDEO_ID_TYPE_YOUTUBE,
+      value: "",
+      // For MediaSniffer.
+      toString: function(){return this.type + ":" + this.value;}
+    };
+
+    // YouTube.
+    if (/(?:^|\.)youtube\.com$/.test(uri.asciiHost)) {
+      var s = uri.path.replace(/#.*$/, "").replace(/^\//, "");
+      // /watch?v=VIDEO_ID
+      if (/^watch\?/.test(s)) { return /[?&]v=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      // /v/VIDEO_ID, /embed/VIDEO_ID
+      if (/^(?:v|embed)\/([^?\/]+)/.test(s)) { rc.value = RegExp.$1; return rc; }
+      // /get_video_info?video_id=VIDEO_ID, /get_video?video_id=VIDEO_ID
+      if (/^get_video(?:_info)?\?/.test(s)) { return /[?&]video_id=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      // /api_video_info?video_id=VIDEO_ID
+      if (/^api_video_info\?/.test(s)) { return /[?&]video_id=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      return null;
+    }
+    // https://youtube.googleapis.com/v/VIDEO_ID - youtube.com/v/VIDEO_ID redirects here.
+    if ("youtube.googleapis.com" === uri.asciiHost && /^\/v\/([^?#\/]+)/.test(uri.path)) {
+      rc.value = RegExp.$1;
+      return rc;
+    }
+
+    // Google Drive.
+    if (/(?:^|\.)docs\.google\.com$/.test(uri.asciiHost)) {
+      rc.type = this.VIDEO_ID_TYPE_GOOGLE;
+      var s = uri.path.replace(/#.*$/, "").replace(/^\//, "");
+      // /file/d/VIDEO_ID
+      if (/^file\/d\/([^?\/]+)/.test(s)) { rc.value = RegExp.$1; return rc; }
+      // /uc?id=VIDEO_ID
+      if (/^uc\?/.test(s)) { return /[?&]id=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      // /get_video_info?docid=VIDEO_ID
+      if (/^get_video_info\?/.test(s)) { return /[?&]docid=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      return null;
+    }
+    // Google Videos or whatever that thing is - SWF in the "preview"
+    // embed iframe (docs.google.com/file/d/VIDEO_ID/preview) for a file
+    // in Google Drive.
+    if (/(?:^|\.)video\.google\.com$/.test(uri.asciiHost)) {
+      rc.type = this.VIDEO_ID_TYPE_GOOGLE;
+      var s = uri.path.replace(/#.*$/, "").replace(/^\//, "");
+      // /get_player?docid=VIDEO_ID
+      if (/^get_player\?/.test(s)) { return /[?&]docid=([^&]+)/.test(s) ? (rc.value = RegExp.$1, rc) : null; }
+      return null;
+    }
+
+    // embedly.com.
+    if (arguments.callee && arguments.callee.caller && arguments.callee !== arguments.callee.caller
+      && /(?:^|\.)embedly\.com$/.test(uri.asciiHost)
+      && /^\/widgets\/media\.html/.test(uri.path)
+      && /[?&](?:src|url)=([^&#]+)/.test(uri.path)
+      )
+    {
+      return arguments.callee.call(this, decodeURIComponent(RegExp.$1));
+    }
+    return null;
+  },
+
   process: function (w, id, callback, isPrivate) {
+    // Reentrance guard for do_xhr.
+    w["flashgot::Youtube::process::call_cnt"] = (w["flashgot::Youtube::process::call_cnt"] || 0) + 1;
+
+    if (id.type === this.VIDEO_ID_TYPE_GOOGLE) {
+      // Just like with YouTube, in some cases all the stream
+      // data we need is already present in the document.
+      // The problem is that it's not stored in a variable but
+      // inlined as an argument in a function call (_initProjector).
+      // And even if it wasn't, it's just arrays of arrays, without
+      // any named objects, so we'd end up dealing with a bunch of
+      // magic numbers (indices) if we were parsing it, so screw it.
+      return Youtube.do_xhr(w, id, callback, isPrivate);
+    }
+
     // First try to extract the stream data from the document:
     // either from ytplayer.config.args.url_encoded_fmt_stream_map
     // or from the player's flashvars.
@@ -37,7 +122,6 @@ var Youtube = {
     // Or it's not a backdoor and the response contains some kind of
     // an "age-restricted" flag that the client must check?
     // You also can bypass it with /v/VIDEO_ID and /embed/VIDEO_ID.
-    w["flashgot::Youtube::process::call_cnt"] = (w["flashgot::Youtube::process::call_cnt"] || 0) + 1;
     if (w["flashgot::Youtube::process::tid"]) {
       w.clearTimeout(w["flashgot::Youtube::process::tid"]);
       delete w["flashgot::Youtube::process::tid"];
@@ -62,21 +146,17 @@ var Youtube = {
       }
       // <embed/> flashvars
       if (!data && (o = w.document)) {
-        var ids = gFlashGotService.getPref("media.YouTube.flashvars_element_id", "movie_player").split(/\s+/).map(unescape);
-        var attrs = gFlashGotService.getPref("media.YouTube.flashvars_element_attr", "flashvars").split(/\s+/).map(unescape);
-        for (var i = 0, len = ids.length; !data && i !== len; ++i) {
-          let id = ids[i];
-          if (id.length === 0) { continue; }
+        var ids = gFlashGotService.getPref("media.YouTube.flashvars_element_id", "movie_player").split(/\s*,\s*/).map(unescape);
+        var attrs = gFlashGotService.getPref("media.YouTube.flashvars_element_attr", "flashvars").split(/\s*,\s*/).map(unescape);
+        ids.some(function(id){
+          if ( ! id.length) { return; }
           var elm = o.getElementById(id);
-          if (elm === null) { continue; }
-          for (var j = 0, jlen = attrs.length; j !== jlen; ++j) {
-            var attr = attrs[j];
-            if (attr.length !== 0 && (attr = elm.getAttribute(attr))) {
-              data = Youtube.parse(attr);
-              break;
-            }
-          }
-        }
+          return elm !== null && attrs.some(function(attr){
+            return attr.length && (attr = elm.getAttribute(attr))
+              && (data = Youtube.parse(attr)) && data.url_encoded_fmt_stream_map
+              ? data : (data = null);
+          });
+        });
       }
       if (!data) {
         // The document is loaded, but still no data - no point in waiting further
@@ -101,9 +181,12 @@ var Youtube = {
   do_xhr: function (w, id, callback, isPrivate) {
     var call_cnt = w["flashgot::Youtube::process::call_cnt"];
 
+    var url = id.type === this.VIDEO_ID_TYPE_YOUTUBE
+      ? w.location.protocol + "//www.youtube.com/get_video_info?hl=en_US&el=detailpage&video_id="
+        + id.value + "&sts=" + fg.getPref("media.YouTube.decode_signature_func.timestamp", -1)
+      : w.location.protocol + "//docs.google.com/get_video_info?docid=" + id.value;
     var xhr = CC["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(CI.nsIXMLHttpRequest);
-    xhr.open("GET", w.location.protocol + "//www.youtube.com/get_video_info?hl=en_US&el=detailpage&video_id="
-      + id + "&sts=" + fg.getPref("media.YouTube.decode_signature_func.timestamp", -1));
+    xhr.open("GET", url);
     if (isPrivate) {
       fg.privatize(xhr.channel);
     }
@@ -140,7 +223,7 @@ var Youtube = {
     if (data.adaptive_fmts) {
       data.adaptive_fmts.split(",").map(Youtube.parse).forEach(function(o){
         var b = o.itag && o.type && o.url
-          && (o.quality = Youtube._map_itag(Youtube.STREAM_QUALITY_MAP, o.itag, o.size || /*audio*/(Math.round(o.bitrate / 1024) + "k")));
+          && (o.quality = o.size || /*audio*/(Math.round(o.bitrate / 1024) + "k"));
         if (b) {
           o["flashgot::yt_dash"] = o.size ? "video" : "audio";
           streams.push(o);
@@ -184,7 +267,7 @@ var Youtube = {
     }, false);
     xhr.send(null);
 
-    // FIXME: Youtube::process:wait_for_player() relies on the return value.
+    // FIXME: Youtube::process::wait_for_player() relies on the return value.
     // Always returning true means wait_for_player() will never call do_xhr()
     // after it called us.
     return true;
@@ -209,80 +292,162 @@ var Youtube = {
       fg.log("Error creating signature decoder: " + (x.message || x) + "\n" + x.stack);
       return false;
     }
+    // true = use the "XXXp" notation for video ("720p", "480p", "360p", etc.),
+    // false = use Youtube's original notation ("hd720", "large", "medium", etc.).
+    // For audio we always use the "XXXk" notation (e.g. "125k").
     var remap_quality = fg.getPref("media.YouTube.remap_stream_quality", false);
     var remap_type = fg.getPref("media.YouTube.remap_stream_type", false);
-    var quality_sort_order = remap_quality ? Youtube.REMAP_QUALITY_SORT_ORDER : Youtube.QUALITY_SORT_ORDER;
     var type_sort_order = remap_type ? Youtube.REMAP_TYPE_SORT_ORDER : Youtube.TYPE_SORT_ORDER;
+    var audio_quality_granularity = fg.getPref("media.YouTube.audio_quality_granularity", 1) || 1;
     // FIXME: Ignore duplicate itags?
     var ignore_itags = [];
+    // Map<string itag, string dimensions> fmt_list;
+    var fmt_list = {};
+    (data.fmt_list || "").split(",").forEach(function(o){
+      var a = o.split("/");
+      if (a.length < 2 || ! /^\d+x\d+$/.test(a[1])) { return; }
+      fmt_list[a[0]] = a[1];
+    });
+
     streams = streams.filter(function(s) {
       if (ignore_itags.indexOf(s.itag) !== -1) { return false; }
 
       // We're only interested in HTTP streams, no RTMP or something.
       if (!/^https?:\/\//.test(s.url)) { return false; }
 
-      // Save the video ID, for debugging purposes.
-      s["flashgot::video_id"] = data.video_id;
+      // Save the video ID. They started to encode the "id" parameter,
+      // so you can get 2 different IDs for the same stream from 2
+      // embed iframes for the same video.
+      s["flashgot::video_id"] = data.video_id /*YouTube*/ || data.docid /*Google Drive/Videos*/;
+      if (s["flashgot::video_id"]) {
+        s.url += (s.url.indexOf("?") === -1 ? "?" : "&")
+          + "flashgot_video_id=" + encodeURIComponent(s["flashgot::video_id"]);
+      }
 
-      // Tidy the type: "video/3gpp;+codecs="mp4v.20.3,+mp4a.40.2" -> "video/3gpp".
+      // Tidy the type: "video/3gpp;+codecs="mp4v.20.3,+mp4a.40.2"" -> "video/3gpp".
       s.type = s.type.split(";")[0];
 
       // Store unknown itags. Do this before any remapping (type and quality at the moment).
       // This is needed for sorting and for MediaSniffer to get the correct stream content
       // type (because DASH streams are served as "application/octet-stream").
-      if (Youtube._map_itag(Youtube.STREAM_QUALITY_MAP, s.itag, null) == null) {
-        let q = s.quality; // "WxH" for video (e.g. "1920x1080"), "XXXk" for audio (e.g. "125k").
-        s["flashgot::remap_quality_hint"] = s.quality;
-        s["flashgot::remap_type_hint"] = s.type;
-        // Remap video quality to the quality used in url_encoded_fmt_stream_map,
-        // i.e. 1920x1080 -> "hd1080", 1280x720 -> "hd720", 640x360 -> "medium", etc.
-        // Not needed for audio because audio streams never were there.
-        if (s["flashgot::yt_dash"] === "video") {
-          s["flashgot::remap_type_hint"] = s.type.replace(/^video\//, "");
-          if (/^\d+x(\d+)$/.test(q)) {
-            let h = RegExp.$1;
-            s["flashgot::remap_quality_hint"] = h + "p";
-            switch (h) {
-              case "1440":
-              case "1080":
-              case "720":
-                q = "hd" + h;
-                break;
-              case "520":
-              case "480":
-                q = "large";
-                break;
-              case "360":
-                q = "medium";
-                break;
-              default:
-                q = parseInt(q) > 1440 ? "highres" : "small";
-                break;
+      var is_known_itag = true;
+      if (Youtube._map_itag(Youtube.STREAM_TYPE_MAP, s.itag, null) == null) {
+        is_known_itag = false;
+        fg.log("Unknown itag type: " + s.itag + ": type: '" + s.type + "'");
+        s["flashgot::remap_type_hint"] = s.type.replace(/^video\/(?:x-)?/, "").replace(/3gpp$/, "3gp");
+      }
+
+      const SK_MEDIA_TYPE_VIDEO = 0; // "Normal" non-DASH video (has both audio and video tracks).
+      const SK_MEDIA_TYPE_DASH_VIDEO = 1; // DASH video.
+      const SK_MEDIA_TYPE_DASH_AUDIO = 2; // DASH audio.
+      let sort_key = {"media": SK_MEDIA_TYPE_VIDEO, "quality": 0, "3d": 0, "container": 0};
+
+      if (s["flashgot::yt_dash"] === "video") {
+        sort_key["media"] = SK_MEDIA_TYPE_DASH_VIDEO;
+      } else if (s["flashgot::yt_dash"] === "audio") {
+        sort_key["media"] = SK_MEDIA_TYPE_DASH_AUDIO;
+      }
+
+      // Stream quality for sorting: height for video, bitrate for audio.
+      let q = s["flashgot::yt_dash"] !== "audio"
+        ? Youtube._map_itag(Youtube.STREAM_QUALITY_SORT_MAP, s.itag, 0)
+        : Math.round(parseInt(s.quality) / audio_quality_granularity) * audio_quality_granularity;
+      if ( ! q) {
+        is_known_itag = false;
+        fg.log("Unknown itag quality: " + s.itag + ": quality: '" + s.quality + "'");
+
+        // Try whatever crap YouTube feeds us in fmt_list, adaptive_fmts,
+        // and the DASH manifest: "WxH" for video (e.g. "1920x1080"),
+        // "XXXk" for audio (e.g. "125k").
+        // fmt_list and url_encoded_fmt_stream_map aren't always accurate,
+        // e.g. they say "640x360"/"medium" for itag 59 (non-DASH mp4) while
+        // the actual dimensions are 854x480 and 640x480. That's why we keep
+        // our own actual quality (height) map in the preferences.
+        if (/^\d+x(\d+)$/.test(fmt_list[s.itag] || s.quality)) {
+          q = parseInt(RegExp.$1);
+        }
+      }
+      if ( ! q) { q = 0; }
+      // For "non-standard" heights: find a closest "standard" height.
+      // YouTube does that for url_encoded_fmt_stream_map and fmt_list,
+      // e.g. /watch?v=6pxRHBw-k8M - 1280x676 goes as "hd720" in
+      // url_encoded_fmt_stream_map, as "1280x720" in fmt_list,
+      // and as "1280x676" in adaptive_fmts and the DASH manifest.
+      if (q && s["flashgot::yt_dash"] !== "audio") {
+        // XXX: Make the list customizable via a user pref?
+        let STD_RES = [144, 240, 360, 480, 520, 720, 1080, 1440,
+          // http://en.wikipedia.org/wiki/High-definition_video
+          1536, 2160, 2304 /*watch?v=Cx6eaVeYXOs*/, 2540, 3072, 4320];
+        if (STD_RES.indexOf(q) === -1) {
+          let min_diff = -1;
+          let tmp_q = q;
+          STD_RES.forEach(function(o){
+            let diff = Math.abs(o - tmp_q);
+            if (diff > 100) { return; }
+            if (min_diff === -1 || min_diff > diff) {
+              q = o;
+              min_diff = diff;
             }
-          }
+          });
         }
-        fg.log("Unknown itag: " + s.itag + ": quality: '" + s.quality + "' -> '" + q + "', type: '" + s.type + "'");
-        s.quality = q;
+      }
+      sort_key["quality"] = q;
+
+      // Map video streams quality to the quality used in url_encoded_fmt_stream_map,
+      // i.e. "1920x1080" -> "hd1080", "1280x720" -> "hd720", "640x360" -> "medium", etc.
+      // Do this for both DASH and normal (non-DASH) video streams - see the "itag 59"
+      // comment above.
+      if (q && s["flashgot::yt_dash"] !== "audio") {
+        switch (q) {
+          case 520:
+          case 480:
+            s.quality = "large";
+            break;
+          case 360:
+            s.quality = "medium";
+            break;
+          default:
+            s.quality = q >= 720 ? "hd" + q : "small";
+            break;
+        }
+      }
+
+      if ( ! is_known_itag) {
+        s["flashgot::map_quality_sort_key"] = q;
         Youtube.update_itag_map(s);
       }
 
       if (remap_type) { s.type = Youtube.remap_stream_type(s); }
 
-      if (remap_quality) { s.quality = Youtube.remap_stream_quality(s); }
+      // "XXXp" for video (e.g. "720p"), "XXXk" for audio (e.g. "125k").
+      if (remap_quality) { s.quality = q + (s["flashgot::yt_dash"] !== "audio" ? "p" : "k"); }
       // Mark 3D videos.
       // http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs
       if ((s.itag >= 82 && s.itag <= 85) || (s.itag >= 100 && s.itag <= 102)) {
         s.quality += " (3D)";
+        sort_key["3d"] = 1;
       }
 
-      // Build the sort key: order by quality, type.
-      s["flashgot::sort_key"] = (Youtube.get_sort_idx(quality_sort_order, s.quality) << 8)
-        | Youtube.get_sort_idx(type_sort_order, s.type);
-      // For DASH streams: audio goes after video.
-      // So it's actually order by media type (audio or video), quality, container type.
-      if (s["flashgot::yt_dash"] === "audio") {
-        s["flashgot::sort_key"] |= 0x10000;
-      }
+      // Build the sort key.
+      // Sort order: media type, quality desc, 3d, container.
+      // Sort key is a uint32 in the following format:
+      // octet:        3        2        1        0
+      // bit:   76543210 76543210 76543210 76543210
+      // type:        mm qqqqqqqq qqqqqqqq ffffcccc
+      // Legend:
+      //   m - media type - audio or video. See SK_MEDIA_TYPE_*.
+      //   q - quality - height in pixels for video, bitrate in kbps for audio.
+      //   f - 3D flag - 0 for non-3D, 1 for 3D.
+      //   c - container type index from the container sort order.
+      // Convert/clamp to uint16.
+      sort_key["quality"] &= 0xffff;
+      // "Inverse" the quality so that it's sorted in descending order.
+      sort_key["quality"] = 0xffff - sort_key["quality"];
+      sort_key["container"] = type_sort_order.indexOf(s.type) & 0x0f;
+      s["flashgot::sort_key"] = (sort_key["media"] << 24)
+        | (sort_key["quality"] << 8)
+        | (sort_key["3d"] << 4)
+        | sort_key["container"];
 
       // Decode the signature.
       try {
@@ -305,7 +470,11 @@ var Youtube = {
       }
 
       // Add "ratebypass" (speed limit) and "cmbypass" (no idea)
-      // if they're not part of the signature.
+      // if they're not part of the signature. There's also
+      // the "shardbypass" parameter (no idea either).
+      // Also, VLC player on Windows doesn't support HTTPS
+      // ("TLS client plugin not available"), so we need to
+      // fall back to HTTP if possible.
       var idx = s.url.indexOf("?");
       if (idx !== -1 && idx + 1 !== s.url.length) {
         var qs = Youtube.parse(s.url.substr(idx + 1));
@@ -316,6 +485,12 @@ var Youtube = {
           + Object.keys(qs)
             .map(function(p){return encodeURIComponent(p) + "=" + encodeURIComponent(qs[p] || "")})
             .join("&");
+        // VLC player HTTPS workaround.
+        if (fg.getPref("media.YouTube.prefer_http", false)
+          && (sparams.indexOf("requiressl") === -1 || qs.requiressl !== "yes"))
+        {
+          s.url = s.url.replace(/^https:/, "http:");
+        }
       }
 
       ignore_itags.push(s.itag);
@@ -336,9 +511,8 @@ var Youtube = {
       let nl = n.getElementsByTagName("Representation");
       [].forEach.call(nl, function(n){
         let itag = n.getAttribute("id");
-        let quality = Youtube._map_itag(Youtube.STREAM_QUALITY_MAP, itag, null)
-          || (is_audio ? Math.round(n.getAttribute("bandwidth") / 1024) + "k"
-            : n.getAttribute("width") + "x" + n.getAttribute("height"));
+        let quality = is_audio ? Math.round(n.getAttribute("bandwidth") / 1024) + "k"
+            : n.getAttribute("width") + "x" + n.getAttribute("height");
         let elm_url = n.getElementsByTagName("BaseURL")[0];
         if ( ! elm_url) { return; }
         let url = (elm_url.firstChild || {}).nodeValue;
@@ -359,27 +533,15 @@ var Youtube = {
     });
   },
 
-  QUALITY_SORT_ORDER: [],
-  REMAP_QUALITY_SORT_ORDER: [],
   TYPE_SORT_ORDER: [],
   REMAP_TYPE_SORT_ORDER: [],
-  get_sort_idx: function (arr, value) {
-    // Unknown values go to the very end of the list.
-    return arr.indexOf(value) & 0xff;
-  },
 
-  // http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs
-  // Map<String name, Array<string> itags> STREAM_REMAP_QUALITY_MAP;
-  STREAM_REMAP_QUALITY_MAP: {},
   // Map<String name, Array<string> itags> STREAM_REMAP_TYPE_MAP;
   STREAM_REMAP_TYPE_MAP: {},
-  // Map<String name, Array<string> itags> STREAM_QUALITY_MAP;
-  STREAM_QUALITY_MAP: {},
   // Map<String name, Array<string> itags> STREAM_TYPE_MAP;
   STREAM_TYPE_MAP: {},
-  remap_stream_quality: function(stream) {
-    return this._map_itag(this.STREAM_REMAP_QUALITY_MAP, stream.itag, stream.quality);
-  },
+  // Map<String name, Array<string> itags> STREAM_QUALITY_SORT_MAP;
+  STREAM_QUALITY_SORT_MAP: {},
   remap_stream_type: function(stream) {
     return this._map_itag(this.STREAM_REMAP_TYPE_MAP, stream.itag, stream.type);
   },
@@ -400,13 +562,15 @@ var Youtube = {
   },
 
   update_itag_map: function(stream) {
-    var a_q = this.update_itag_map_branch("media.YouTube.itag_map.quality.", stream.itag, stream.quality);
     var a_t = this.update_itag_map_branch("media.YouTube.itag_map.type.", stream.itag, stream.type);
     // Try to find and update the corresponding remapping branch.
-    var r_q = this.update_itag_remap_branch("media.YouTube.itag_remap.quality.", stream.itag, a_q, stream["flashgot::remap_quality_hint"]);
-    if (r_q) { fg.log("Unknown itag remap: " + stream.itag + ": quality: '" + stream.quality + "' -> '" + r_q + "'"); }
     var r_t = this.update_itag_remap_branch("media.YouTube.itag_remap.type.", stream.itag, a_t, stream["flashgot::remap_type_hint"]);
     if (r_t) { fg.log("Unknown itag remap: " + stream.itag + ": type: '" + stream.type + "' -> '" + r_t + "'"); }
+    // Don't care about quality information for audio streams.
+    if (stream["flashgot::yt_dash"] === "audio") { return; }
+    if (stream["flashgot::map_quality_sort_key"]) {
+      this.update_itag_map_branch("media.YouTube.itag_map.quality_sort_key.", stream.itag, stream["flashgot::map_quality_sort_key"]);
+    }
   },
 
   // @return Array<string> the previous value of the ".itags" branch
@@ -449,13 +613,30 @@ var Youtube = {
 
   update_itag_remap_branch: function(branch, itag, itags, remap_hint) {
     try {
-      if ( ! itags || ! itags.length) { return; }
       var pref = Components.classes["@mozilla.org/preferences-service;1"]
         .getService(Components.interfaces.nsIPrefService)
         .getBranch("flashgot." + branch);
-      var a = pref.getChildList("");
+
+      if (remap_hint) {
+        var name_branch_name = remap_hint.replace(/\./g, "_");
+        var values_branch_name = name_branch_name + ".itags";
+        var values;
+        if (pref.getPrefType(values_branch_name) != 0 /*PREF_INVALID*/) {
+          values = this.parsePrefStringList(pref.getCharPref(values_branch_name));
+          if (values.indexOf(remap_hint) !== -1) { return; }
+        } else {
+          values = [];
+        }
+        values.push(itag);
+        pref.setCharPref(name_branch_name, remap_hint);
+        pref.setCharPref(values_branch_name, values.sort(function(l,r){return l-r;}).join(","));
+        return remap_hint;
+      }
+
       // Find the first ".itags" branch that contains the entire |itags| array
       // and put |itag| there.
+      if ( ! itags || ! itags.length) { return; }
+      var a = pref.getChildList("");
       var remap_hint_values;
       for (var i = 0, len = a.length; i !== len; ++i) {
         var c = a[i];
@@ -481,15 +662,6 @@ var Youtube = {
           fg.log("update_itag_remap_branch: c='" + c + "': " + (x.message || x) + "\n" + (x.stack || new Error().stack));
         }
       }
-
-      // No branch found - use the hint.
-      if ( ! remap_hint) { return; }
-      branch = remap_hint.replace(/\./g, "_");
-      if ( ! remap_hint_values) { remap_hint_values = []; }
-      remap_hint_values.push(itag);
-      pref.setCharPref(branch, remap_hint);
-      pref.setCharPref(branch + ".itags", remap_hint_values.sort(function(l,r){return l-r;}).join(","));
-      return remap_hint;
     }
     catch (x) {
       fg.log("update_itag_remap_branch: " + (x.message || x) + "\n" + (x.stack || new Error().stack));
@@ -508,6 +680,7 @@ var Youtube = {
   // (*) "mime" (stream content type, e.g. "video/mp4")
   // (*) those passed in the |extra_keep_params| argument.
   // (*) anything that ends with "bypass" and has the value of "yes".
+  // (*) anything that starts with "flashgot_" (added by us - see process_streams()).
   tidy_stream_url: function (stream, extra_keep_params /*= null*/ ) {
     if (!extra_keep_params) { extra_keep_params = []; }
     var url = stream.url;
@@ -522,7 +695,7 @@ var Youtube = {
     extra_keep_params.forEach(function(p){if (sparams.indexOf(p) === -1) sparams.push(p);});
     var new_qs = [];
     for (var p in qs) {
-      if (sparams.indexOf(p) !== -1 || (/.+bypass$/.test(p) && qs[p] === "yes")) {
+      if (sparams.indexOf(p) !== -1 || (/.+bypass$/.test(p) && qs[p] === "yes") || /^flashgot_/.test(p)) {
         new_qs.push(encodeURIComponent(p) + "=" + encodeURIComponent(qs[p] || ""));
       }
     }
@@ -535,14 +708,6 @@ var Youtube = {
   stream_url_equals: function (url1, url2) {
     if (!this.is_stream_url(url1) || !this.is_stream_url(url2)) { return false; }
 
-    // The |id| parameter is something like the internal video ID:
-    // it's different for two different videos (those with different
-    // "public" video IDs - /watch?v=VIDEO_ID), and it's the same for
-    // all the streams of the same video.
-    var id1 = /[?&]id=([^&]+)/.test(url1) ? RegExp.$1 : "flashgot-id-1";
-    var id2 = /[?&]id=([^&]+)/.test(url2) ? RegExp.$1 : "flashgot-id-2";
-    if (id1 !== id2) { return false; }
-
     // The only thing that allows us to identify a stream is the |itag|
     // parameter, which is a combination of the container type (MP4,
     // FLV, etc.) and the quality (1080p, 1080p 3D, 720p, etc.).
@@ -554,11 +719,43 @@ var Youtube = {
     // the user wants to save the stream from a particular position).
     var begin1 = /[?&]begin=([^&]+)/.test(url1) ? RegExp.$1 : "0";
     var begin2 = /[?&]begin=([^&]+)/.test(url2) ? RegExp.$1 : "0";
-    return begin1 === begin2;
+    if (begin1 !== begin2) { return false; }
+
+    // The |id| parameter is something like the internal video ID:
+    // it's different for two different videos (those with different
+    // "public" video IDs - /watch?v=VIDEO_ID), and it's the same for
+    // all the streams of the same video.
+    // They started to encode the "id" parameter, so you can get
+    // different values for the same streams. So we save the "public"
+    // video ID in process_streams() and use it instead.
+    var id1 = /[?&]flashgot_video_id=([^&]+)/.test(url1) ? RegExp.$1 : null;
+    var id2 = /[?&]flashgot_video_id=([^&]+)/.test(url2) ? RegExp.$1 : null;
+    if (id1 && id2) { return id1 === id2; }
+    id1 = /[?&]id=([^&]+)/.test(url1) ? RegExp.$1 : "flashgot-id-1";
+    id2 = /[?&]id=([^&]+)/.test(url2) ? RegExp.$1 : "flashgot-id-2";
+    if (id1 === id2) { return true; }
+    // So here we are with 2 different encoded IDs.
+    // Apart from giving up right here, our only option is
+    // to compare as many stream properties as we can and
+    // pray for no collisions.
+    // Candidate properties are:
+    // "clen" - content length in bytes.
+    // "dur" - duration in seconds.
+    // "lmt" - last modified time as a unix timestamp in microseconds.
+    return false;
+    var props = ["clen", "dur", "lmt"];
+    var qs1 = this.parse(url1.substr(url1.indexOf("?") + 1));
+    var qs2 = this.parse(url2.substr(url2.indexOf("?") + 1));
+    return props.every(function(p){
+      var p1 = qs1[p];
+      var p2 = qs2[p];
+      return p1 && p2 && p1 === p2;
+    });
   },
 
   is_stream_url: function (url) {
-    return /^[a-z]+:\/\/([^\/]+)\/videoplayback\?/.test(url) && /\.(?:youtube|googlevideo)\.com$/.test(RegExp.$1);
+    return /^https?:\/\/([^\/]+)\/videoplayback\?/.test(url)
+      && /\.(?:youtube|googlevideo|google)\.com(?::[0-9]+)?$/.test(RegExp.$1);
   },
 
   decode_signature: function (params) {
@@ -703,9 +900,9 @@ SortOrderObserver.prototype = {
     try {
       if (topic !== "nsPref:changed" /*NS_PREFBRANCH_PREFCHANGE_TOPIC_ID*/) { return; }
       if (name.length !== 0) { return; }
+      var a = Youtube.parsePrefStringList(branch.getCharPref(name));
       var list = this.list;
       list.length = 0;
-      var a = Youtube.parsePrefStringList(branch.getCharPref(name));
       for (var i = 0, len = a.length; i !== len; ++i) {
         list.push(a[i]);
       }
@@ -716,13 +913,23 @@ SortOrderObserver.prototype = {
   }
 };
 
+
+
+// Drop deprecated preferences.
+try {
+  var pref = Components.classes["@mozilla.org/preferences-service;1"]
+    .getService(Components.interfaces.nsIPrefService)
+    .getBranch("flashgot.media.YouTube.");
+  pref.deleteBranch("itag_map.quality.");
+  pref.deleteBranch("itag_remap.quality.");
+  pref.deleteBranch("quality_sort_order");
+  pref.deleteBranch("remap_quality_sort_order");
+} catch (ignore) {}
+
 Youtube.readItagMap("media.YouTube.itag_map.type.", Youtube.STREAM_TYPE_MAP);
-Youtube.readItagMap("media.YouTube.itag_map.quality.", Youtube.STREAM_QUALITY_MAP);
+Youtube.readItagMap("media.YouTube.itag_map.quality_sort_key.", Youtube.STREAM_QUALITY_SORT_MAP);
 Youtube.readItagMap("media.YouTube.itag_remap.type.", Youtube.STREAM_REMAP_TYPE_MAP);
-Youtube.readItagMap("media.YouTube.itag_remap.quality.", Youtube.STREAM_REMAP_QUALITY_MAP);
-Youtube.readSortOrder("media.YouTube.quality_sort_order", Youtube.QUALITY_SORT_ORDER);
 Youtube.readSortOrder("media.YouTube.type_sort_order", Youtube.TYPE_SORT_ORDER);
-Youtube.readSortOrder("media.YouTube.remap_quality_sort_order", Youtube.REMAP_QUALITY_SORT_ORDER);
 Youtube.readSortOrder("media.YouTube.remap_type_sort_order", Youtube.REMAP_TYPE_SORT_ORDER);
 
 
@@ -799,9 +1006,9 @@ SandboxedSignatureDecoder.prototype = {
 
   decode: function (params) {
     var rc = Components.utils.evalInSandbox(
-       "var params = " + params.toSource() + ";\n" + 
-        this.code_str,
-        this.sandbox);
+      "var params = " + params.toSource() + ";\n" + 
+      this.code_str,
+      this.sandbox);
     
     // No fancy return values - we expect a primitive string value.
     // We don't silently return something that could pass for a signature.
diff --git a/chrome/flashgot.jar!/content/flashgot/about.xul b/chrome/flashgot.jar!/content/flashgot/about.xul
index 9342c7f..95e8192 100644
--- a/chrome/flashgot.jar!/content/flashgot/about.xul
+++ b/chrome/flashgot.jar!/content/flashgot/about.xul
@@ -64,4 +64,4 @@ function browse(url, features) {
 }
 
 
-</script><stringbundleset id="stringbundleset"><stringbundle id="about-strings" src="chrome://flashgot/locale/about.properties"/><stringbundle id="about-stringsFB" src="chrome://flashgot/content/en-US/about.properties"/></stringbundleset><vbox id="clientBox"><vbox id="clientBoxInternal" flex="1"><hbox align="start"><vbox id="logoBox"><image id="logo" src="chrome://flashgot/skin/icon80.png" class="link" tooltiptext="Visit Extension Home Page" onclick="browse('http://flashgot.net')"/></vbo [...]
\ No newline at end of file
+</script><stringbundleset id="stringbundleset"><stringbundle id="about-strings" src="chrome://flashgot/locale/about.properties"/><stringbundle id="about-stringsFB" src="chrome://flashgot/content/en-US/about.properties"/></stringbundleset><vbox id="clientBox"><vbox id="clientBoxInternal" flex="1"><hbox align="start"><vbox id="logoBox"><image id="logo" src="chrome://flashgot/skin/icon80.png" class="link" tooltiptext="Visit Extension Home Page" onclick="browse('http://flashgot.net')"/></vbo [...]
\ No newline at end of file
diff --git a/chrome/flashgot.jar!/content/flashgot/chooser.js b/chrome/flashgot.jar!/content/flashgot/chooser.js
index 210c9bd..3260d33 100644
--- a/chrome/flashgot.jar!/content/flashgot/chooser.js
+++ b/chrome/flashgot.jar!/content/flashgot/chooser.js
@@ -74,6 +74,18 @@ var Chooser = {
         t.open = true;
         t.select();
       }, false);
+      
+      t.popup.addEventListener("select", function() {
+        var i = t.popup.selectedIndex;
+        if (i > -1) t._lastSelectedIndex = i;
+      }, false);
+      t.popup.addEventListener("click", function() {
+        var i = t._lastSelectedIndex;
+        if (i > -1) {
+          var v =  t.controller.getValueAt(i);
+          if (v && v !== t.value) t.value = v;
+        }
+      }, false);
     }, 100);
     
     var sel = null;
diff --git a/chrome/flashgot.jar!/content/flashgot/chooser.xul b/chrome/flashgot.jar!/content/flashgot/chooser.xul
index efc5650..5c85219 100644
--- a/chrome/flashgot.jar!/content/flashgot/chooser.xul
+++ b/chrome/flashgot.jar!/content/flashgot/chooser.xul
@@ -59,11 +59,14 @@
            accesskey="&flashgotDestinationFolder.accesskey;"
            />
 		<hbox>
+				<panel id="flashgot_autocomplete" type="autocomplete" noautofocus="true" />
 			<textbox id="dest" minwidth="400"
 				 onchange="Chooser.folderChanged(this)"
 				 value=""
 				 type="autocomplete"
 				 autocompletesearch="flashgot-autocomplete"
+				 completeselectedindex="true"
+				 autocompletepopup="flashgot_autocomplete"
          flex="1"
 				 />
 			<button id="browse" oncommand="Chooser.browse()" label="&flashgotBrowse;" accesskey="&flashgotBrowse.accesskey;" />
diff --git a/chrome/flashgot.jar!/content/flashgot/contents.rdf b/chrome/flashgot.jar!/content/flashgot/contents.rdf
index 3ed313e..86a2189 100644
--- a/chrome/flashgot.jar!/content/flashgot/contents.rdf
+++ b/chrome/flashgot.jar!/content/flashgot/contents.rdf
@@ -8,7 +8,7 @@
     </RDF:Seq>
 
     <RDF:Description about="urn:mozilla:package:flashgot"
-            chrome:displayName="FlashGot 1.5.6.5"
+            chrome:displayName="FlashGot 1.5.6.7"
             chrome:author="Giorgio Maone (InformAction)"
             chrome:authorURL="http://www.informaction.com/g_maone"
             chrome:name="flashgot"
diff --git a/chrome/flashgot.jar!/content/flashgot/flashgotGalleryBuilder.js b/chrome/flashgot.jar!/content/flashgot/flashgotGalleryBuilder.js
index d777c57..4be99c1 100644
--- a/chrome/flashgot.jar!/content/flashgot/flashgotGalleryBuilder.js
+++ b/chrome/flashgot.jar!/content/flashgot/flashgotGalleryBuilder.js
@@ -89,6 +89,11 @@ FlashGotGalleryBuilder.prototype = {
       if(this.sandbox) {
         try {
           this.expressions = Components.utils.evalInSandbox(this.prefs.getCharPref("buildGallery.expressions"), this.sandbox);
+          // Gecko 31: functions and some other types are not visible by default anymore.
+          // See https://developer.mozilla.org/en-US/docs/Xray_vision
+          if (this.expressions && Components.utils.waiveXrays) {
+            this.expressions = Components.utils.waiveXrays(this.expressions);
+          }
         } catch(ex) {}
         if(typeof(this.expressions)!="object" || !this.expressions) this.expressions = {};
       } else {
@@ -306,12 +311,50 @@ FlashGotGalleryBuilder.prototype = {
   }
 ,
   createExpression: function(text) {
-    expr = { text: text };
-    try {
-      expr.func = Components.utils.evalInSandbox("_f = function() {\n" + text + "\n}", this.sandbox);
-      expr.err = null;
-    } catch(err) {
-      expr.err = err;
+    function create_in_sandbox(text) {
+      var expr = { text: text };
+      try {
+        // Function() creates a named function ("anonymous"),
+        // but gives "better" syntax errors than eval() except
+        // when it's an unmatched closing curly bracket "}".
+        // In the latter case, it gives the line number of the
+        // preceeding parsed contruct, i.e. the parser eats
+        // whitespace without incrementing the line number,
+        // e.g. "return 123;\n}" reports the "virtual" line
+        // number 1 and not 2, and "return 123;\n\n\n\n\n}"
+        // reports the "virtual" line number 1 as well.
+        expr.func = new Function("", text); //eval("(function(){" + text + "\n});");
+        expr.err = null;
+      } catch(err) {
+        expr.err = err;
+      }
+      return expr;
+    }
+    var expr = Components.utils.evalInSandbox(""
+      + "var $f = " + create_in_sandbox + "\n;"
+      + "var $t = String(" + text.toSource() + "\n);" // (new String("abc")) -> "abc".
+      + "$f($t);"
+      , this.sandbox);
+    // Gecko 31: functions and some other types are not visible by default anymore.
+    // See https://developer.mozilla.org/en-US/docs/Xray_vision
+    if (expr && Components.utils.waiveXrays) { expr = Components.utils.waiveXrays(expr); }
+    // Get the source line number and text.
+    // Depends on how buggy the JS parser is - see the comment in the try block.
+    var err = expr && expr.err;
+    if (err && err.lineNumber != null && arguments.callee.caller != null && arguments.callee.caller !== arguments.callee) {
+      // Compile/eval something that gives a syntax error in line 1.
+      var tmpExpr = this.createExpression(":");
+      if (tmpExpr && tmpExpr.err && tmpExpr.err.lineNumber != null) {
+        var lines = text.split(/\r\n|\r|\n/);
+        var sourceLineNumber = Math.min(lines.length - 1, err.lineNumber - tmpExpr.err.lineNumber);
+        var sourceLine = lines[sourceLineNumber];
+        // Ignore trailing empty lines, e.g. "-\n\n\n".
+        for (var i = lines.length; ! sourceLine.length && i-- > 0; ) {
+          sourceLine = lines[sourceLineNumber = i];
+        }
+        expr.errLineNumber = sourceLineNumber + 1;
+        expr.errLineText = sourceLine;
+      }
     }
     return expr;
   }
@@ -389,19 +432,20 @@ FlashGotGalleryBuilder.prototype = {
   }
 ,
   _hilightErrors: function() {
-    const exprList=this.exprListBox;
-    exprList.style.background="white";
-    const ee=this.expressions;
-    var item,expr;
-    for(var j=exprList.getRowCount(); j-->0;) {
-      item=exprList.getItemAtIndex(j);
-      expr=ee[item.label];
-      if(expr) {
-        item.style.color=expr.err?"red":"black";
-        if(item.selected) {
-          document.getElementById("flashgotGB-expr-error-text").value=expr.err;
-          this.exprTextBox.style.color=item.style.color;
-        }
+    const exprList = this.exprListBox;
+    exprList.style.background = "white";
+    const item = exprList.selectedItem;
+    if ( ! item) { return; }
+    const expr = this.expressions[item.label];
+    if ( ! expr) { return; }
+    const err = expr.err;
+    this.exprTextBox.style.color = item.style.color = err ? "red" : "black";
+    const errTextBox = document.getElementById("flashgotGB-expr-error-text");
+    errTextBox.value = err;
+    if (err && expr.errLineNumber) {
+      errTextBox.value += "\nLine: " + expr.errLineNumber;
+      if (expr.errLineText) {
+        errTextBox.value += ":\n" + expr.errLineText + "\n";
       }
     }
   }
@@ -422,11 +466,28 @@ function FlashGotGalleryHTML(builder) {
      exprNames[exprNames.length]=match[1];
   }
   const ee=builder.expressions;
-  
+
   for(name in ee) {
     exprNames[exprNames.length]=name;
     expr=ee[name];
-    this.env[name] = expr.func ? expr.func : function() { throw new Error("["+name+"()]"+" not implemented!"); };
+    this.env[name] = expr.func
+      // FF 32.0.1: transfering (assigning) a function from one sandbox
+      // to another doesn't work: typeof works, but calling it throws
+      // "Permission denied to access object", and accessing its properties
+      // (either explicitly or implicitly, e.g. in a string concatenation)
+      // throws "Permission denied to access property '...'".
+      // Creating a proxy function doesn't work either - |arguments| is
+      // empty:
+      //   function create_proxy_func(expr) { return expr.func.apply(null, arguments); }
+      //   this.env[name] = expr.func ? create_proxy_func(expr) : ...;
+      // So we have 2 options:
+      // 1) create a new function in this sandbox.
+      // 2) use one sandbox for everything: loading the functions from prefs
+      // (FlashGotGalleryBuilder.onload), creating them from the editor text
+      // (FlashGotGalleryBuilder.createExpression), and calling them
+      // (FlashGotGalleryHTML.evalExpressions).
+      ? new Function("", expr.text)
+      : function() { throw new Error("["+name+"()]"+" not implemented!"); };
   }
   
   exprNames=exprNames.sort();
@@ -480,8 +541,8 @@ FlashGotGalleryHTML.prototype = {
     return "\n</div></body>";
   }
 ,
-  _eval: function(ctx, parm) {
-    return Components.utils.evalInSandbox("_func(" + parm + ")", ctx);
+  _eval: function(ctx, name, parm) {
+    return Components.utils.evalInSandbox(name + "(" + parm + ")", ctx);
   }
 ,
   // evaluates macros and javascript functions
@@ -532,8 +593,7 @@ FlashGotGalleryHTML.prototype = {
       subst=match[0];
       if(expr && expr.func) {
         try {
-          ctx._func=expr.func;
-          res = this._eval(ctx, match[2]);
+          res = this._eval(ctx, name, match[2]);
           if(res != null && typeof(res) != "undefined") {
             subst=res;
           }
diff --git a/chrome/flashgot.jar!/content/flashgot/flashgotOverlay.js b/chrome/flashgot.jar!/content/flashgot/flashgotOverlay.js
index 2c09373..f28cae0 100644
--- a/chrome/flashgot.jar!/content/flashgot/flashgotOverlay.js
+++ b/chrome/flashgot.jar!/content/flashgot/flashgotOverlay.js
@@ -694,13 +694,13 @@ var gFlashGot = {
     for (var j = 0; j < m.length; j++) {
       var mo = m[j];
       // Special menu item, used for refreshing YouTube's signature decoding function.
-      // See |YOUTUBE_REFRESH_SIGNATURE_FUNC_URL| in MediaSniffer::observe().
-      if (mo.originalURL === "flashgot::Youtube::refresh_signature_func") {
+      if (mo.MediaSniffer && mo.originalURL === mo.MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL) {
         var mi = mi_refresh_decode_signature_func;
         mi.setAttribute("hidden", "false");
         menu_parsed.parentNode.setAttribute("hidden", "false");
         mi["flashgot::Youtube"] = mo.Youtube;
         mi["flashgot::MediaSniffer"] = mo.MediaSniffer;
+        mi["flashgot::yt_win"] = mo.yt_win;
         continue;
       }
       var mi = this._createMediaMenuItem(mo);
@@ -709,7 +709,12 @@ var gFlashGot = {
         continue;
       }
       mi["flashgot::sort_key"] = mo.sort_key;
-      (mo.yt_dash ? parsed_dash_items : parsed_items).push(mi);
+      if (mo.yt_dash) {
+        mi["flashgot::yt_dash"] = mo.yt_dash;
+        parsed_dash_items.push(mi);
+      } else {
+        parsed_items.push(mi);
+      }
     }
     if (parsed_items.length || parsed_dash_items.length) {
       function mo_cmp(lhs, rhs) { return lhs["flashgot::sort_key"] - rhs["flashgot::sort_key"]; }
@@ -720,7 +725,17 @@ var gFlashGot = {
       }
       if (parsed_dash_items.length) {
         parsed_dash_items.sort(mo_cmp);
-        parsed_dash_items.forEach(function(mi){delete mi["flashgot::sort_key"]; menu_parsed_dash.appendChild(mi);});
+        var show_av_separator = gFlashGotService.getPref("media.YouTube.dash.show_av_separator", true);
+        var prev_type = parsed_dash_items[0]["flashgot::yt_dash"];
+        parsed_dash_items.forEach(function(mi){
+          if (show_av_separator && prev_type !== mi["flashgot::yt_dash"]) {
+            show_av_separator = false;
+            menu_parsed_dash.appendChild(document.createElement("menuseparator"));
+          }
+          delete mi["flashgot::sort_key"];
+          delete mi["flashgot::yt_dash"];
+          menu_parsed_dash.appendChild(mi);
+        });
         menu_parsed_dash.parentNode.setAttribute("hidden", "false");
       }
       this._cb_mediaMenuItem_key_down = false;
@@ -836,8 +851,31 @@ var gFlashGot = {
     return rc;
   },
   Youtube_refresh_signature: function(evt, elm) {
-    var win = document.commandDispatcher.focusedWindow;
-    elm['flashgot::Youtube'].refresh_signature_func(win, function(){elm['flashgot::MediaSniffer'].checkYoutube(win, null, true);}, true);
+    var win = elm['flashgot::yt_win'];
+    var MediaSniffer = elm['flashgot::MediaSniffer'];
+
+    // Remove the "Refresh signature" entry.
+    var media = this.media;
+    delete media._map[MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL];
+    var eidx = -1;
+    media.some(function(entry, idx){
+      if (entry.originalURL === MediaSniffer.YOUTUBE_REFRESH_SIGNATURE_FUNC_URL) {
+        eidx = idx;
+        return true;
+      }
+    });
+    if (eidx !== -1) { media.splice(eidx, 1); }
+
+    elm['flashgot::Youtube'].refresh_signature_func(win, function(){
+      // We're in a frame/iframe, and who knows how many other YouTube
+      // frames are also there (e.g. we're on a forum/blog), so, ideally,
+      // we should reload the top page for all those frames to get reloaded
+      // and rerequested by MediaSniffer.
+      // The problem is that I doubt everyone will like this reloading
+      // behavior.
+      //if (win !== win.top) { return win.top.location.reload(); }
+      MediaSniffer.checkYoutube(win, null, true);
+      }, true);
     evt.preventDefault();
     evt.stopPropagation();
   },
diff --git a/chrome/flashgot.jar!/locale/af-ZA/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/af-ZA/flashgot/flashgot.dtd
index 1e14211..614517f 100644
--- a/chrome/flashgot.jar!/locale/af-ZA/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/af-ZA/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Prosesseer skakels in die agtergrond">
 <!ENTITY flashgotShowLog "Vertoon log…">
 <!ENTITY flashgotClearLog "Vee Log uit">
-<!ENTITY flashgotAbout "Rakende FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Rakende FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Gaan Bevestigings Verby">
 <!ENTITY flashgotGetRightQuick "Gebruik togetright.exe wanneer moontlik">
 <!ENTITY flashgotAutostart "Outo-begin aflaai">
diff --git a/chrome/flashgot.jar!/locale/be-BY/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/be-BY/flashgot/flashgot.dtd
index f7db081..20d3a60 100644
--- a/chrome/flashgot.jar!/locale/be-BY/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/be-BY/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Апрацоўваць спасылкі ў фоне">
 <!ENTITY flashgotShowLog "Паказаць лог">
 <!ENTITY flashgotClearLog "Ачысціць лог">
-<!ENTITY flashgotAbout "Аб FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Аб FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Прапускаць пацверджанні">
 <!ENTITY flashgotGetRightQuick "Выкарыстаць togetright.exe калі магчыма">
 <!ENTITY flashgotAutostart "Аўтаматычна стартаваць загрузкі">
diff --git a/chrome/flashgot.jar!/locale/bg-BG/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/bg-BG/flashgot/flashgot.dtd
index 4aa4286..faabf13 100644
--- a/chrome/flashgot.jar!/locale/bg-BG/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/bg-BG/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обработи линковете в заден план">
 <!ENTITY flashgotShowLog "Покажи Лог-а">
 <!ENTITY flashgotClearLog "Изчисти Лог-а">
-<!ENTITY flashgotAbout "За FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "За FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Пропусни потвърдителните прозорци">
 <!ENTITY flashgotGetRightQuick "Използвай togetright.exe когато е възможно">
 <!ENTITY flashgotAutostart "Автостарт на Даунлоадите">
diff --git a/chrome/flashgot.jar!/locale/bn-IN/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/bn-IN/flashgot/flashgot.dtd
index 44e935e..9d6b3f6 100644
--- a/chrome/flashgot.jar!/locale/bn-IN/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/bn-IN/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/ca-AD/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ca-AD/flashgot/flashgot.dtd
index f958ffb..065249c 100644
--- a/chrome/flashgot.jar!/locale/ca-AD/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ca-AD/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Processar enllaços en segon pla">
 <!ENTITY flashgotShowLog "Mostrar…">
 <!ENTITY flashgotClearLog "Netejar">
-<!ENTITY flashgotAbout "Sobre FlashGot 1.5.6.5…">
+<!ENTITY flashgotAbout "Sobre FlashGot 1.5.6.7…">
 <!ENTITY flashgotDMQuiet "Saltar avisos de confirmació">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe sempre que sigui possible">
 <!ENTITY flashgotAutostart "Iniciar descàrregues automàticament">
diff --git a/chrome/flashgot.jar!/locale/cs-CZ/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/cs-CZ/flashgot/flashgot.dtd
index f168cbb..ee05321 100644
--- a/chrome/flashgot.jar!/locale/cs-CZ/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/cs-CZ/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Zpracovávat odkazy na pozadí">
 <!ENTITY flashgotShowLog "Zobrazit záznam">
 <!ENTITY flashgotClearLog "Smazat záznam">
-<!ENTITY flashgotAbout "O rozšíření FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "O rozšíření FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Přeskočit dotazy s potvrzením">
 <!ENTITY flashgotGetRightQuick "Používat togetright.exe vždy, když je to možné">
 <!ENTITY flashgotAutostart "Automatické stahování">
diff --git a/chrome/flashgot.jar!/locale/da-DK/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/da-DK/flashgot/flashgot.dtd
index 8de1982..01dcc30 100644
--- a/chrome/flashgot.jar!/locale/da-DK/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/da-DK/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Udfør links i baggrunden">
 <!ENTITY flashgotShowLog "Vis log…">
 <!ENTITY flashgotClearLog "Ryd log">
-<!ENTITY flashgotAbout "Om FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Om FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Spring (Confirmation Prompts) over">
 <!ENTITY flashgotGetRightQuick "Brug togetright.exe når det er muligt">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/da/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/da/flashgot/flashgot.dtd
index 32acbe8..28a47d0 100644
--- a/chrome/flashgot.jar!/locale/da/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/da/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Udfør links i baggrunden">
 <!ENTITY flashgotShowLog "Vis log">
 <!ENTITY flashgotClearLog "Ryd log">
-<!ENTITY flashgotAbout "Om FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Om FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Spring bekræftelser over">
 <!ENTITY flashgotGetRightQuick "Brug togetright.exe når det er muligt">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/de/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/de/flashgot/flashgot.dtd
index d994d32..2524124 100644
--- a/chrome/flashgot.jar!/locale/de/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/de/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Links im Hintergrund verarbeiten">
 <!ENTITY flashgotShowLog "Protokoll anzeigen…">
 <!ENTITY flashgotClearLog "Protokoll löschen">
-<!ENTITY flashgotAbout "Über FlashGot 1.5.6.5…">
+<!ENTITY flashgotAbout "Über FlashGot 1.5.6.7…">
 <!ENTITY flashgotDMQuiet "Bestätigungsabfragen überspringen bei">
 <!ENTITY flashgotGetRightQuick "Wann immer möglich togetright.exe verwenden">
 <!ENTITY flashgotAutostart "Downloads automatisch starten">
diff --git a/chrome/flashgot.jar!/locale/el-GR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/el-GR/flashgot/flashgot.dtd
index ea847a4..6f37d55 100644
--- a/chrome/flashgot.jar!/locale/el-GR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/el-GR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Διεργασία δεσμών στο παρασκήνιο">
 <!ENTITY flashgotShowLog "Εμφάνιση αρχείου καταγραφής">
 <!ENTITY flashgotClearLog "Εκκαθάριση αρχείου καταγραφής">
-<!ENTITY flashgotAbout "Περί FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Περί FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Παράκαμψη ειδοποιήσεων επιβεβαίωσης">
 <!ENTITY flashgotGetRightQuick "Χρήση togetright.exe όταν είναι δυνατόν">
 <!ENTITY flashgotAutostart "Αυτόματη εκκίνηση μεταφορτώσεων">
diff --git a/chrome/flashgot.jar!/locale/el/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/el/flashgot/flashgot.dtd
index 71dbd8a..8b2c7ec 100644
--- a/chrome/flashgot.jar!/locale/el/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/el/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Διεργασία δεσμών στο παρασκήνιο">
 <!ENTITY flashgotShowLog "Εμφάνιση αρχείου καταγραφής">
 <!ENTITY flashgotClearLog "Εκκαθάριση αρχείου καταγραφής">
-<!ENTITY flashgotAbout "Περί FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Περί FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Παράκαμψη ειδοποιήσεων επιβεβαίωσης">
 <!ENTITY flashgotGetRightQuick "Χρήση togetright.exe όταν είναι δυνατόν">
 <!ENTITY flashgotAutostart "Αυτόματη εκκίνηση μεταφορτώσεων">
diff --git a/chrome/flashgot.jar!/locale/en-US/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/en-US/flashgot/flashgot.dtd
index 8bcb212..6f49414 100644
--- a/chrome/flashgot.jar!/locale/en-US/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/en-US/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log…">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/es-AR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/es-AR/flashgot/flashgot.dtd
index ce1badd..d5889b1 100644
--- a/chrome/flashgot.jar!/locale/es-AR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/es-AR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Procesar enlaces en segundo plano">
 <!ENTITY flashgotShowLog "Mostrar historial de cambio…">
 <!ENTITY flashgotClearLog "Limpiar historial de cambios">
-<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Omitir mensajes de confirmación">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe siempre que sea posible">
 <!ENTITY flashgotAutostart "Iniciar descargas automáticamente">
diff --git a/chrome/flashgot.jar!/locale/es-CL/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/es-CL/flashgot/flashgot.dtd
index f27d950..527ddaa 100644
--- a/chrome/flashgot.jar!/locale/es-CL/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/es-CL/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Procesar enlaces en segundo plano">
 <!ENTITY flashgotShowLog "Mostrar registro…">
 <!ENTITY flashgotClearLog "Limpiar registro">
-<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.5…">
+<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.7…">
 <!ENTITY flashgotDMQuiet "No mostrar mensajes de confirmación">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe siempre que sea posible">
 <!ENTITY flashgotAutostart "Iniciar descargas automáticamente">
diff --git a/chrome/flashgot.jar!/locale/es-ES/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/es-ES/flashgot/flashgot.dtd
index 052a39b..1b6b5e7 100644
--- a/chrome/flashgot.jar!/locale/es-ES/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/es-ES/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Procesar enlaces en segundo plano">
 <!ENTITY flashgotShowLog "Mostrar registro…">
 <!ENTITY flashgotClearLog "Limpiar registro">
-<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.5…">
+<!ENTITY flashgotAbout "Acerca de FlashGot 1.5.6.7…">
 <!ENTITY flashgotDMQuiet "No mostrar mensajes de confirmación">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe siempre que sea posible">
 <!ENTITY flashgotAutostart "Iniciar descargas automáticamente">
diff --git a/chrome/flashgot.jar!/locale/et-EE/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/et-EE/flashgot/flashgot.dtd
index 5c2ffce..f486b48 100644
--- a/chrome/flashgot.jar!/locale/et-EE/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/et-EE/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Puhasta logi">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/eu-ES/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/eu-ES/flashgot/flashgot.dtd
index 80627bc..6b145f7 100644
--- a/chrome/flashgot.jar!/locale/eu-ES/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/eu-ES/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log…">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/eu/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/eu/flashgot/flashgot.dtd
index 80627bc..6b145f7 100644
--- a/chrome/flashgot.jar!/locale/eu/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/eu/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log…">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/fa-IR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/fa-IR/flashgot/flashgot.dtd
index 9559343..54a0522 100644
--- a/chrome/flashgot.jar!/locale/fa-IR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/fa-IR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "انجام عملیات در پس زمینه">
 <!ENTITY flashgotShowLog "نمایش وقایع">
 <!ENTITY flashgotClearLog "پاک کردن وقایع">
-<!ENTITY flashgotAbout "درباره FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "درباره FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "عدم نمایش پیغامهای تایید">
 <!ENTITY flashgotGetRightQuick "استفاده شود togetright.exe در هر زمان ممکن از">
 <!ENTITY flashgotAutostart "شروع خودکار دریافتی‌ها">
diff --git a/chrome/flashgot.jar!/locale/fi-FI/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/fi-FI/flashgot/flashgot.dtd
index 8641e03..df3fe97 100644
--- a/chrome/flashgot.jar!/locale/fi-FI/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/fi-FI/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Käsittele linkit tausta-ajona">
 <!ENTITY flashgotShowLog "Näytä loki…">
 <!ENTITY flashgotClearLog "Tyhjennä loki">
-<!ENTITY flashgotAbout "Tietoja FlashGot 1.5.6.5:sta">
+<!ENTITY flashgotAbout "Tietoja FlashGot 1.5.6.7:sta">
 <!ENTITY flashgotDMQuiet "Ohita varmennuskyselyt">
 <!ENTITY flashgotGetRightQuick "Käytä togetright.exe:ä aina kun mahdollista">
 <!ENTITY flashgotAutostart "Aloita tiedostojen siirto automaattisesti">
diff --git a/chrome/flashgot.jar!/locale/fi/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/fi/flashgot/flashgot.dtd
index 8641e03..df3fe97 100644
--- a/chrome/flashgot.jar!/locale/fi/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/fi/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Käsittele linkit tausta-ajona">
 <!ENTITY flashgotShowLog "Näytä loki…">
 <!ENTITY flashgotClearLog "Tyhjennä loki">
-<!ENTITY flashgotAbout "Tietoja FlashGot 1.5.6.5:sta">
+<!ENTITY flashgotAbout "Tietoja FlashGot 1.5.6.7:sta">
 <!ENTITY flashgotDMQuiet "Ohita varmennuskyselyt">
 <!ENTITY flashgotGetRightQuick "Käytä togetright.exe:ä aina kun mahdollista">
 <!ENTITY flashgotAutostart "Aloita tiedostojen siirto automaattisesti">
diff --git a/chrome/flashgot.jar!/locale/fr/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/fr/flashgot/flashgot.dtd
index 71efe12..8985d4c 100644
--- a/chrome/flashgot.jar!/locale/fr/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/fr/flashgot/flashgot.dtd
@@ -12,12 +12,12 @@
 <!ENTITY flashgotBuildGallery "Créer une galerie…">
 <!ENTITY flashgotBuildGallery.title "FlashGot - Créer une galerie">
 <!ENTITY flashgotGBVariableURLs "URL variables">
-<!ENTITY flashgotGBSample "Les chaînes de variables sont exprimées sous la forme [début-fin;pas] ou [nom_de_la_fonction(…)], par exemple :">
+<!ENTITY flashgotGBSample "Les chaines de variables sont exprimées sous la forme [début-fin;pas] ou [nom_de_la_fonction(…)], par exemple :">
 <!ENTITY flashgotGBPreview "Aperçu :">
 <!ENTITY flashgotGBContent "Contenu :">
 <!ENTITY flashgotGBReferrer "URL de référence :">
-<!ENTITY flashgotGBSync "Synchroniser les chaînes">
-<!ENTITY flashgotGBRanges "Chaînes">
+<!ENTITY flashgotGBSync "Synchroniser les chaines">
+<!ENTITY flashgotGBRanges "Chaines">
 <!ENTITY flashgotGBExpressions "Fonctions JavaScript">
 <!ENTITY flashgotGeneral "Général">
 <!ENTITY flashgotMenu "Menu">
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Traiter les liens en arrière-plan">
 <!ENTITY flashgotShowLog "Montrer le journal…">
 <!ENTITY flashgotClearLog "Effacer le journal">
-<!ENTITY flashgotAbout "À propos de FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "À propos de FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Ignorer la fenêtre de confirmation">
 <!ENTITY flashgotGetRightQuick "Utiliser togetright.exe quand c'est possible">
 <!ENTITY flashgotAutostart "Démarrer les téléchargements automatiquement">
@@ -54,7 +54,7 @@
 <!ENTITY flashgotDownloads "Téléchargements">
 <!ENTITY flashgotInterceptAll "Intercepter tous les téléchargements">
 <!ENTITY flashgotLog "Journal">
-<!ENTITY flashgotShowFilter "Montrer la boîte de dialogue des filtres">
+<!ENTITY flashgotShowFilter "Montrer la boite de dialogue des filtres">
 <!ENTITY flashgotFilter "Filtre">
 <!ENTITY flashgotHost "Hôte">
 <!ENTITY flashgotRegExp "Expression régulière (RegExp)">
@@ -100,7 +100,7 @@
 <!ENTITY flashgotAllChoosen "Choisir tous les articles par défaut">
 <!ENTITY flashgotAllChoosen.accesskey "c">
 <!ENTITY flashgotShowToolbarButton "Afficher le bouton de la barre d'outils">
-<!ENTITY flashgot.media.formats "Available formats">
-<!ENTITY flashgot.media.refresh_signature_func.label "Refresh signature">
-<!ENTITY flashgot.media.refresh_signature_func.tooltiptext "Try to refresh the signature decoding function">
+<!ENTITY flashgot.media.formats "Formats disponibles">
+<!ENTITY flashgot.media.refresh_signature_func.label "Actualiser la signature">
+<!ENTITY flashgot.media.refresh_signature_func.tooltiptext "Tente d'actualiser la fonction de décodage de signature">
 <!ENTITY flashgot.media.formats.dash "DASH (separate audio and video tracks)">
diff --git a/chrome/flashgot.jar!/locale/gl-ES/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/gl-ES/flashgot/flashgot.dtd
index 76e5838..c0a24d1 100644
--- a/chrome/flashgot.jar!/locale/gl-ES/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/gl-ES/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Procesar as ligazóns en segundo plano">
 <!ENTITY flashgotShowLog "Amosar o rexistro…">
 <!ENTITY flashgotClearLog "Limpar o rexistro">
-<!ENTITY flashgotAbout "Sobre FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Sobre FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Non amosar avisos de confirmación">
 <!ENTITY flashgotGetRightQuick "Empregar togetright.exe sempre que sexa posible">
 <!ENTITY flashgotAutostart "Comezar automaticamente as descargas">
diff --git a/chrome/flashgot.jar!/locale/he-IL/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/he-IL/flashgot/flashgot.dtd
index 55fc0a2..0e6521d 100644
--- a/chrome/flashgot.jar!/locale/he-IL/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/he-IL/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "עבד קישורים ברקע">
 <!ENTITY flashgotShowLog "הראה תיעוד…">
 <!ENTITY flashgotClearLog "נקה תיעוד">
-<!ENTITY flashgotAbout "אודות FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "אודות FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "דלג על אימות Prompts">
 <!ENTITY flashgotGetRightQuick "השתמש בtogetright.exe כל עוד זה אפשרי">
 <!ENTITY flashgotAutostart "התחל הורדות באופן אוטומטי">
diff --git a/chrome/flashgot.jar!/locale/he/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/he/flashgot/flashgot.dtd
index 0893097..b735ad7 100644
--- a/chrome/flashgot.jar!/locale/he/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/he/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "תהליך עיבוד קישורים ברקע">
 <!ENTITY flashgotShowLog "הצג יומן רישום...">
 <!ENTITY flashgotClearLog "נקה את יומן הרישום">
-<!ENTITY flashgotAbout "אודות FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "אודות FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "דלג על בקשות אישור">
 <!ENTITY flashgotGetRightQuick "השתמש ב־ togetright.exe במידת האפשר">
 <!ENTITY flashgotAutostart "הפעלה עצמית של הורדות">
diff --git a/chrome/flashgot.jar!/locale/hi-IN/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/hi-IN/flashgot/flashgot.dtd
index a7bf091..93e3d95 100644
--- a/chrome/flashgot.jar!/locale/hi-IN/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/hi-IN/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/hr-HR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/hr-HR/flashgot/flashgot.dtd
index 158f936..2381876 100644
--- a/chrome/flashgot.jar!/locale/hr-HR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/hr-HR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Obradi veze u pozadini">
 <!ENTITY flashgotShowLog "Prikaži zapis…">
 <!ENTITY flashgotClearLog "Očisti zapis">
-<!ENTITY flashgotAbout "O FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "O FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Preskoči obavijesti koje treba potvrđivati">
 <!ENTITY flashgotGetRightQuick "Koristi togetright.exe kad god je to moguće">
 <!ENTITY flashgotAutostart "Automatski pokreni preuzimanje">
diff --git a/chrome/flashgot.jar!/locale/hu/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/hu/flashgot/flashgot.dtd
index 6d4e8a2..61b0421 100644
--- a/chrome/flashgot.jar!/locale/hu/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/hu/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Linkek feldolgozása a háttérben">
 <!ENTITY flashgotShowLog "Naplófájl olvasása">
 <!ENTITY flashgotClearLog "Naplófájl törlése">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5 névjegye">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7 névjegye">
 <!ENTITY flashgotDMQuiet "Párbeszédablakok átugrása">
 <!ENTITY flashgotGetRightQuick "A togetright.exe használata, ha lehetséges">
 <!ENTITY flashgotAutostart "Letöltések automatikus indítása">
diff --git a/chrome/flashgot.jar!/locale/hy-AM/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/hy-AM/flashgot/flashgot.dtd
index eb447a8..82efae7 100644
--- a/chrome/flashgot.jar!/locale/hy-AM/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/hy-AM/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log…">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/id-ID/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/id-ID/flashgot/flashgot.dtd
index 8c866c8..a0b695f 100644
--- a/chrome/flashgot.jar!/locale/id-ID/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/id-ID/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Proses links di background">
 <!ENTITY flashgotShowLog "Tampilkan Log">
 <!ENTITY flashgotClearLog "Hapus Log">
-<!ENTITY flashgotAbout "Tentang FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Tentang FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Abaikan Dialog Konfirmasi">
 <!ENTITY flashgotGetRightQuick "Gunakan togetright.exe apabila dimungkinkan">
 <!ENTITY flashgotAutostart "Memulai download secara otomatis">
diff --git a/chrome/flashgot.jar!/locale/it-IT/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/it-IT/flashgot/flashgot.dtd
index 26f728a..9ed21e7 100644
--- a/chrome/flashgot.jar!/locale/it-IT/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/it-IT/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Elabora i link in background">
 <!ENTITY flashgotShowLog "Mostra log">
 <!ENTITY flashgotClearLog "Cancella log">
-<!ENTITY flashgotAbout "Informazioni su FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Informazioni su FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Evita le finestre di conferma">
 <!ENTITY flashgotGetRightQuick "Usa togetright.exe quando è possibile">
 <!ENTITY flashgotAutostart "Inizia i download automaticamente">
diff --git a/chrome/flashgot.jar!/locale/it/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/it/flashgot/flashgot.dtd
index 26f728a..9ed21e7 100644
--- a/chrome/flashgot.jar!/locale/it/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/it/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Elabora i link in background">
 <!ENTITY flashgotShowLog "Mostra log">
 <!ENTITY flashgotClearLog "Cancella log">
-<!ENTITY flashgotAbout "Informazioni su FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Informazioni su FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Evita le finestre di conferma">
 <!ENTITY flashgotGetRightQuick "Usa togetright.exe quando è possibile">
 <!ENTITY flashgotAutostart "Inizia i download automaticamente">
diff --git a/chrome/flashgot.jar!/locale/ja-JP/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ja-JP/flashgot/flashgot.dtd
index d542f97..0edf842 100644
--- a/chrome/flashgot.jar!/locale/ja-JP/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ja-JP/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "バックグラウンドで処理">
 <!ENTITY flashgotShowLog "ログを表示">
 <!ENTITY flashgotClearLog "ログをクリア">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5 について">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7 について">
 <!ENTITY flashgotDMQuiet "確認画面をスキップ">
 <!ENTITY flashgotGetRightQuick "可能であれば togetright.exe を使用">
 <!ENTITY flashgotAutostart "ダウンロードを自動で開始する">
diff --git a/chrome/flashgot.jar!/locale/ka-GE/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ka-GE/flashgot/flashgot.dtd
index 29c5b0c..2d03c22 100644
--- a/chrome/flashgot.jar!/locale/ka-GE/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ka-GE/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "ლინკების შესრულება უკანა ფონზე">
 <!ENTITY flashgotShowLog "ლოგის ნახვა…">
 <!ENTITY flashgotClearLog "ლოგის გასუფთავება">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5_ის შესახებ">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7_ის შესახებ">
 <!ENTITY flashgotDMQuiet "დამოწმების გამოტოვება">
 <!ENTITY flashgotGetRightQuick "გამოიყენე togetright.exe როცა შესაძლებელია">
 <!ENTITY flashgotAutostart "გადმოწერის ავტომატურად დაწყება">
diff --git a/chrome/flashgot.jar!/locale/kk-KZ/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/kk-KZ/flashgot/flashgot.dtd
index 148aa30..72331a4 100644
--- a/chrome/flashgot.jar!/locale/kk-KZ/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/kk-KZ/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Сілтемелерді білдіртпей-ақ өңдеу">
 <!ENTITY flashgotShowLog "Лог көрсету…">
 <!ENTITY flashgotClearLog "Логты тазалау">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5 туралы">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7 туралы">
 <!ENTITY flashgotDMQuiet "Растаулар сұранымдарын өткізіп жіберу">
 <!ENTITY flashgotGetRightQuick "Мүмкін болса togetright.exe қолдану">
 <!ENTITY flashgotAutostart "Жүктемелерді автоматты түрде бастау">
diff --git a/chrome/flashgot.jar!/locale/km-KH/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/km-KH/flashgot/flashgot.dtd
index a7bf091..93e3d95 100644
--- a/chrome/flashgot.jar!/locale/km-KH/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/km-KH/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/lt-LT/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/lt-LT/flashgot/flashgot.dtd
index 834ee15..54d30cf 100644
--- a/chrome/flashgot.jar!/locale/lt-LT/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/lt-LT/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/mk-MK/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/mk-MK/flashgot/flashgot.dtd
index 61339ae..71f2e38 100644
--- a/chrome/flashgot.jar!/locale/mk-MK/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/mk-MK/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обработи ги врските во позадина">
 <!ENTITY flashgotShowLog "Покажи го Дневникот…">
 <!ENTITY flashgotClearLog "Исчисти го Дневникот">
-<!ENTITY flashgotAbout "За FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "За FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Прескокни ги Потврдните Прашалници">
 <!ENTITY flashgotGetRightQuick "Користи togetright.exe секогаш кога е возможно">
 <!ENTITY flashgotAutostart "Автоматски стартувај ги симнувањата">
diff --git a/chrome/flashgot.jar!/locale/ml-IN/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ml-IN/flashgot/flashgot.dtd
index 67ffa6f..15108a1 100644
--- a/chrome/flashgot.jar!/locale/ml-IN/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ml-IN/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Process links in background">
 <!ENTITY flashgotShowLog "Show Log...">
 <!ENTITY flashgotClearLog "Clear Log">
-<!ENTITY flashgotAbout "About FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "About FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Skip Confirmation Prompts">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/mn-MN/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/mn-MN/flashgot/flashgot.dtd
index e4cd203..95a3edc 100644
--- a/chrome/flashgot.jar!/locale/mn-MN/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/mn-MN/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Холбоосуудыг ар талд ажиллуулах">
 <!ENTITY flashgotShowLog "Бүртгэл харах…">
 <!ENTITY flashgotClearLog "Бүртгэл цэвэрлэх">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5-ын тухай">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7-ын тухай">
 <!ENTITY flashgotDMQuiet "Баталгаажуулах асуултыг алгасах">
 <!ENTITY flashgotGetRightQuick "Энэ нь боломжтой бол хэдийд ч togetright.exe хэрэглэх">
 <!ENTITY flashgotAutostart "Татцыг шууд эхлэх">
diff --git a/chrome/flashgot.jar!/locale/ms-MY/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ms-MY/flashgot/flashgot.dtd
index d962d2e..fa8ca62 100644
--- a/chrome/flashgot.jar!/locale/ms-MY/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ms-MY/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Proses rangkaian di latarbelakang">
 <!ENTITY flashgotShowLog "Papar Log…">
 <!ENTITY flashgotClearLog "Padam Log">
-<!ENTITY flashgotAbout "Tentang FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Tentang FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Jangkau Prom Pengesahan">
 <!ENTITY flashgotGetRightQuick "Guna togetright.exe seboleh mungkin">
 <!ENTITY flashgotAutostart "Auto-mula Muat Turun">
diff --git a/chrome/flashgot.jar!/locale/nb-NO/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/nb-NO/flashgot/flashgot.dtd
index 99d7e1f..878e996 100644
--- a/chrome/flashgot.jar!/locale/nb-NO/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/nb-NO/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Åpne lenker i bakgrunnen">
 <!ENTITY flashgotShowLog "Vis logg">
 <!ENTITY flashgotClearLog "Tøm logg">
-<!ENTITY flashgotAbout "Om FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Om FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Hopp over bekreftelser">
 <!ENTITY flashgotGetRightQuick "Use togetright.exe whenever it is possible">
 <!ENTITY flashgotAutostart "Autostart downloads">
diff --git a/chrome/flashgot.jar!/locale/nl/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/nl/flashgot/flashgot.dtd
index 5c16d0a..9d51474 100644
--- a/chrome/flashgot.jar!/locale/nl/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/nl/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Koppelingen op de achtergrond verwerken">
 <!ENTITY flashgotShowLog "Log weergeven…">
 <!ENTITY flashgotClearLog "Log wissen">
-<!ENTITY flashgotAbout "Over FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Over FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Vragen om een bevestiging overslaan">
 <!ENTITY flashgotGetRightQuick "Gebruik togetright.exe wanneer mogelijk">
 <!ENTITY flashgotAutostart "Downloads automatisch starten">
diff --git a/chrome/flashgot.jar!/locale/pl/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/pl/flashgot/flashgot.dtd
index 659d8a4..46fabdb 100644
--- a/chrome/flashgot.jar!/locale/pl/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/pl/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Przetwarzaj odnośniki w tle">
 <!ENTITY flashgotShowLog "Pokaż rejestr…">
 <!ENTITY flashgotClearLog "Wyczyść rejestr">
-<!ENTITY flashgotAbout "O FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "O FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Nie wymagaj potwierdzeń">
 <!ENTITY flashgotGetRightQuick "Użyj togetright.exe, jeśli to możliwe">
 <!ENTITY flashgotAutostart "Automatycznie rozpocznij pobieranie">
diff --git a/chrome/flashgot.jar!/locale/pt-BR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/pt-BR/flashgot/flashgot.dtd
index e44febd..3a1f26c 100644
--- a/chrome/flashgot.jar!/locale/pt-BR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/pt-BR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Processar links em segundo plano">
 <!ENTITY flashgotShowLog "Exibir log…">
 <!ENTITY flashgotClearLog "Limpar log">
-<!ENTITY flashgotAbout "Sobre o FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Sobre o FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Executar sem confirmações">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe sempre que possível">
 <!ENTITY flashgotAutostart "Iniciar downloads automaticamente">
diff --git a/chrome/flashgot.jar!/locale/pt-PT/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/pt-PT/flashgot/flashgot.dtd
index 4f19bd9..e310b69 100644
--- a/chrome/flashgot.jar!/locale/pt-PT/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/pt-PT/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Processar links em segundo plano">
 <!ENTITY flashgotShowLog "Exibir Log…">
 <!ENTITY flashgotClearLog "Limpar Log">
-<!ENTITY flashgotAbout "Sobre o FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Sobre o FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Executar Sem Confimações">
 <!ENTITY flashgotGetRightQuick "Usar togetright.exe sempre que possível">
 <!ENTITY flashgotAutostart "Iniciar downloads automaticamente">
diff --git a/chrome/flashgot.jar!/locale/ro-RO/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ro-RO/flashgot/flashgot.dtd
index 7b4bcb5..360425d 100644
--- a/chrome/flashgot.jar!/locale/ro-RO/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ro-RO/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Proceseaza link-urile in fundal">
 <!ENTITY flashgotShowLog "Arata log-ul">
 <!ENTITY flashgotClearLog "Sterge log-ul">
-<!ENTITY flashgotAbout "Despre FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Despre FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Sari peste ferestrele de confimare">
 <!ENTITY flashgotGetRightQuick "Foloseste togetright.exe cand e posibil">
 <!ENTITY flashgotAutostart "Autostart descarcari">
diff --git a/chrome/flashgot.jar!/locale/ru/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/ru/flashgot/flashgot.dtd
index 0560b40..bfaa221 100644
--- a/chrome/flashgot.jar!/locale/ru/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/ru/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обрабатывать ссылки в фоне">
 <!ENTITY flashgotShowLog "Показать журнал">
 <!ENTITY flashgotClearLog "Очистить журнал">
-<!ENTITY flashgotAbout "О FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "О FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Пропускать подтверждения">
 <!ENTITY flashgotGetRightQuick "Использовать togetright.exe, если возможно">
 <!ENTITY flashgotAutostart "Автоматически стартовать закачки">
diff --git a/chrome/flashgot.jar!/locale/sk-SK/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/sk-SK/flashgot/flashgot.dtd
index 94d24c0..cc0682c 100644
--- a/chrome/flashgot.jar!/locale/sk-SK/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/sk-SK/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Spracovávať odkazy na pozadí">
 <!ENTITY flashgotShowLog "Zobraziť záznam">
 <!ENTITY flashgotClearLog "Odstrániť záznam">
-<!ENTITY flashgotAbout "Čo je rozšírenie FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Čo je rozšírenie FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Preskočiť okná s potvrdením">
 <!ENTITY flashgotGetRightQuick "Použiť togetright.exe vždy keď je to možné">
 <!ENTITY flashgotAutostart "Automaticky spustiť sťahovanie">
diff --git a/chrome/flashgot.jar!/locale/sl-SI/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/sl-SI/flashgot/flashgot.dtd
index 4f1d52f..e8d7871 100644
--- a/chrome/flashgot.jar!/locale/sl-SI/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/sl-SI/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Predeluj povezave v ozadju">
 <!ENTITY flashgotShowLog "Pokaži dnevnik …">
 <!ENTITY flashgotClearLog "Počisti dnevnik">
-<!ENTITY flashgotAbout "O razširitvi FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "O razširitvi FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Preskoči potrditvena vprašanja">
 <!ENTITY flashgotGetRightQuick "Uporabi togetright.exe, ko je to mogoče">
 <!ENTITY flashgotAutostart "Samozaženi prenose">
diff --git a/chrome/flashgot.jar!/locale/sq-AL/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/sq-AL/flashgot/flashgot.dtd
index d9a3417..2daf6c2 100644
--- a/chrome/flashgot.jar!/locale/sq-AL/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/sq-AL/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Proceso linket në sfond">
 <!ENTITY flashgotShowLog "Trego">
 <!ENTITY flashgotClearLog "Pastro">
-<!ENTITY flashgotAbout "Informacion mbi FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Informacion mbi FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Kapërceji Nxitjet për Konfirmim">
 <!ENTITY flashgotGetRightQuick "Përdore togetright.exe sa herë të jetë e mundur">
 <!ENTITY flashgotAutostart "Vetënisi shkarkimet">
diff --git a/chrome/flashgot.jar!/locale/sr/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/sr/flashgot/flashgot.dtd
index 19a9371..c7fbb10 100644
--- a/chrome/flashgot.jar!/locale/sr/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/sr/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обради везе у позадини">
 <!ENTITY flashgotShowLog "Прикажи журнал…">
 <!ENTITY flashgotClearLog "Очисти журнал">
-<!ENTITY flashgotAbout "О FlashGot 1.5.6.5-у">
+<!ENTITY flashgotAbout "О FlashGot 1.5.6.7-у">
 <!ENTITY flashgotDMQuiet "Прескочи упите потврда">
 <!ENTITY flashgotGetRightQuick "Користи togetright.exe увек кад је то могуће">
 <!ENTITY flashgotAutostart "Самопокрени преузимања">
diff --git a/chrome/flashgot.jar!/locale/sv-SE/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/sv-SE/flashgot/flashgot.dtd
index 1f372f3..6673808 100644
--- a/chrome/flashgot.jar!/locale/sv-SE/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/sv-SE/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Bearbeta länkar i bakgrunden">
 <!ENTITY flashgotShowLog "Visa logg…">
 <!ENTITY flashgotClearLog "Rensa logg">
-<!ENTITY flashgotAbout "Om FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Om FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Hoppa över bekräftelseförfrågningar">
 <!ENTITY flashgotGetRightQuick "Använd togetright.exe när det är möjligt">
 <!ENTITY flashgotAutostart "Starta nedladdningar automatiskt">
diff --git a/chrome/flashgot.jar!/locale/th-TH/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/th-TH/flashgot/flashgot.dtd
index 7edcc7a..8e544bf 100644
--- a/chrome/flashgot.jar!/locale/th-TH/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/th-TH/flashgot/flashgot.dtd
@@ -33,7 +33,7 @@
 <!ENTITY flashgotBGProcessing "ประมวลผลลิงค์แบบ Background">
 <!ENTITY flashgotShowLog "แสดงล็อก">
 <!ENTITY flashgotClearLog "ล้างล็อก">
-<!ENTITY flashgotAbout "เกี่ยวกับ FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "เกี่ยวกับ FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "ข้ามขั้นตอนการยืนยัน">
 <!ENTITY flashgotGetRightQuick "ใช้ togetright.exe เมื่อเป็นไปได้">
 <!ENTITY flashgotAutostart "เริ่มดาวน์โหลดอัตโนมัติ">
diff --git a/chrome/flashgot.jar!/locale/th/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/th/flashgot/flashgot.dtd
index 7edcc7a..8e544bf 100644
--- a/chrome/flashgot.jar!/locale/th/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/th/flashgot/flashgot.dtd
@@ -33,7 +33,7 @@
 <!ENTITY flashgotBGProcessing "ประมวลผลลิงค์แบบ Background">
 <!ENTITY flashgotShowLog "แสดงล็อก">
 <!ENTITY flashgotClearLog "ล้างล็อก">
-<!ENTITY flashgotAbout "เกี่ยวกับ FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "เกี่ยวกับ FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "ข้ามขั้นตอนการยืนยัน">
 <!ENTITY flashgotGetRightQuick "ใช้ togetright.exe เมื่อเป็นไปได้">
 <!ENTITY flashgotAutostart "เริ่มดาวน์โหลดอัตโนมัติ">
diff --git a/chrome/flashgot.jar!/locale/tr-TR/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/tr-TR/flashgot/flashgot.dtd
index f94da30..6219bce 100644
--- a/chrome/flashgot.jar!/locale/tr-TR/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/tr-TR/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Bağlantıyı arkaplanda işle">
 <!ENTITY flashgotShowLog "Kayıtları Göster…">
 <!ENTITY flashgotClearLog "Kayıtları Temizle">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5 Hakkında">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7 Hakkında">
 <!ENTITY flashgotDMQuiet "Onaylama sorgularını atla">
 <!ENTITY flashgotGetRightQuick "Münkün olduğunda togetright.exe dosyasını kullan">
 <!ENTITY flashgotAutostart "İndirmeleri Otomatik Başlat">
diff --git a/chrome/flashgot.jar!/locale/tr/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/tr/flashgot/flashgot.dtd
index 8a2085c..4074590 100644
--- a/chrome/flashgot.jar!/locale/tr/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/tr/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Bağlantıyı arkaplanda işle">
 <!ENTITY flashgotShowLog "Kayıtları Göster">
 <!ENTITY flashgotClearLog "Kayıtları Temizle">
-<!ENTITY flashgotAbout "FlashGot 1.5.6.5 Hakkında">
+<!ENTITY flashgotAbout "FlashGot 1.5.6.7 Hakkında">
 <!ENTITY flashgotDMQuiet "Onaylama sorgularını atla">
 <!ENTITY flashgotGetRightQuick "Münkün olduğunda togetright.exe dosyasını kullan">
 <!ENTITY flashgotAutostart "İndirmeleri Otomatik Başlat">
diff --git a/chrome/flashgot.jar!/locale/uk-UA/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/uk-UA/flashgot/flashgot.dtd
index 252554a..cfe0031 100644
--- a/chrome/flashgot.jar!/locale/uk-UA/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/uk-UA/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обробляти посилання у фоновому режимі">
 <!ENTITY flashgotShowLog "Показати журнал…">
 <!ENTITY flashgotClearLog "Очистити журнал">
-<!ENTITY flashgotAbout "Про FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Про FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Пропускати підтвердження">
 <!ENTITY flashgotGetRightQuick "Використовувати togetright.exe коли це можливо">
 <!ENTITY flashgotAutostart "Автоматично починати завантаження">
diff --git a/chrome/flashgot.jar!/locale/uk/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/uk/flashgot/flashgot.dtd
index 38af649..40049ce 100644
--- a/chrome/flashgot.jar!/locale/uk/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/uk/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Обробляти посилання у фоновому режимі">
 <!ENTITY flashgotShowLog "Показати журнал…">
 <!ENTITY flashgotClearLog "Очистити журнал">
-<!ENTITY flashgotAbout "Про FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Про FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Пропускати підтвердження">
 <!ENTITY flashgotGetRightQuick "Використовувати togetright.exe коли це можливо">
 <!ENTITY flashgotAutostart "Автоматично починати завантаження">
diff --git a/chrome/flashgot.jar!/locale/vi/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/vi/flashgot/flashgot.dtd
index 430d7b0..8cda8e1 100644
--- a/chrome/flashgot.jar!/locale/vi/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/vi/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "Xử lí các liên kết thuộc hậu cảnh">
 <!ENTITY flashgotShowLog "Hiện lưu kí…">
 <!ENTITY flashgotClearLog "Xóa lưu kí">
-<!ENTITY flashgotAbout "Thông tin về FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "Thông tin về FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "Bỏ qua Hộp thoại Xác nhận">
 <!ENTITY flashgotGetRightQuick "Sử dụng togetright.exe bất cứ khi nào có thể">
 <!ENTITY flashgotAutostart "Tự động khởi chạy các tập tin tải xuống">
diff --git a/chrome/flashgot.jar!/locale/zh-CN/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/zh-CN/flashgot/flashgot.dtd
index 6dc1d00..f77abbf 100644
--- a/chrome/flashgot.jar!/locale/zh-CN/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/zh-CN/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "在后台处理链接">
 <!ENTITY flashgotShowLog "显示日志">
 <!ENTITY flashgotClearLog "清空日志">
-<!ENTITY flashgotAbout "关于 FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "关于 FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "忽略确认提示">
 <!ENTITY flashgotGetRightQuick "尽可能使用“togetrght.exe”">
 <!ENTITY flashgotAutostart "自动下载已监视的文件">
diff --git a/chrome/flashgot.jar!/locale/zh-TW/flashgot/flashgot.dtd b/chrome/flashgot.jar!/locale/zh-TW/flashgot/flashgot.dtd
index 16ba931..4fb59f6 100644
--- a/chrome/flashgot.jar!/locale/zh-TW/flashgot/flashgot.dtd
+++ b/chrome/flashgot.jar!/locale/zh-TW/flashgot/flashgot.dtd
@@ -35,7 +35,7 @@
 <!ENTITY flashgotBGProcessing "在背景處理鏈結">
 <!ENTITY flashgotShowLog "顯示日誌">
 <!ENTITY flashgotClearLog "清除日誌">
-<!ENTITY flashgotAbout "關於 FlashGot 1.5.6.5">
+<!ENTITY flashgotAbout "關於 FlashGot 1.5.6.7">
 <!ENTITY flashgotDMQuiet "略過確認提示">
 <!ENTITY flashgotGetRightQuick "儘可能使用 togetright.exe">
 <!ENTITY flashgotAutostart "自動下載受監視的檔案類型">
diff --git a/components/flashgotService.js b/components/flashgotService.js
index 91940ff..ca8a496 100644
--- a/components/flashgotService.js
+++ b/components/flashgotService.js
@@ -28,7 +28,7 @@ const NS_BINDING_ABORTED = 0x804b0002;
 const EXTENSION_ID = "{19503e42-ca3c-4c27-b1e2-9cdb2170ee34}";
 const EXTENSION_NAME = "FlashGot";
 const CHROME_NAME = "flashgot";
-const VERSION = "1.5.6.5";
+const VERSION = "1.5.6.7";
 const SERVICE_NAME = EXTENSION_NAME + " Service";
 const SERVICE_CTRID = "@maone.net/flashgot-service;1";
 const SERVICE_ID = "{2a55fc5c-7b31-4ee1-ab15-5ee2eb428cbe}";
diff --git a/defaults/preferences/flashgot.js b/defaults/preferences/flashgot.js
index 5904d24..7c1e9e6 100644
--- a/defaults/preferences/flashgot.js
+++ b/defaults/preferences/flashgot.js
@@ -163,3 +163,4 @@ pref("flashgot.dmsopts.pyLoad.autostart", true);
 
 pref("flashgot.java", "");
 pref("flashgot.shredding", false);
+pref("flashgot.term.autoClose", -1);
\ No newline at end of file
diff --git a/install.js b/install.js
index a2bd8c2..768b6e8 100644
--- a/install.js
+++ b/install.js
@@ -1,7 +1,7 @@
 const APP_DISPLAY_NAME = "FlashGot";
 const APP_NAME = "flashgot";
 const APP_PACKAGE = "/informaction/flashgot";
-const APP_VERSION = "1.5.6.5";
+const APP_VERSION = "1.5.6.7";
 
 const APP_PREFS_FILE="defaults/preferences/flashgot.js";
 const APP_XPCOM_SERVICE="components/flashgotService.js";
diff --git a/install.rdf b/install.rdf
index ee5e38f..b91be9a 100644
--- a/install.rdf
+++ b/install.rdf
@@ -5,7 +5,7 @@
  
    <em:id>{19503e42-ca3c-4c27-b1e2-9cdb2170ee34}</em:id>
    <em:name>FlashGot</em:name>
-   <em:version>1.5.6.5</em:version>
+   <em:version>1.5.6.7</em:version>
    <em:description>Enables Firefox, Mozilla Suite, Netscape and Thunderbird to handle single and massive ("all" and "selection") downloads using the most popular external download managers for Windows, Mac OS X, Linux and FreeBSD (dozens currently supported, see Extension's Home Page for details). FlashGot offers also a Build Gallery functionality which helps to synthetize full media galleries in one page, from serial contents originally scattered on several pages, fo [...]
    <em:creator>Giorgio Maone</em:creator>
    <em:type>2</em:type>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/flashgot.git



More information about the Pkg-mozext-commits mailing list