new updating scheme, based on GH downloads; also, check if not updateable (pip installed)
authorFilippo Valsorda <filippo.valsorda@gmail.com>
Fri, 7 Dec 2012 23:48:07 +0000 (00:48 +0100)
committerFilippo Valsorda <filippo.valsorda@gmail.com>
Fri, 7 Dec 2012 23:48:07 +0000 (00:48 +0100)
youtube_dl/__init__.py
youtube_dl/__main__.py

index 3bb573c166b15667b3829a0f3b054410cadbb9c6..f953f1fb9cdbac7fc727bfb2d77a90792f062dd8 100644 (file)
@@ -24,11 +24,6 @@ __authors__  = (
 
 __license__ = 'Public Domain'
 
-UPDATE_URL = 'https://raw.github.com/rg3/youtube-dl/master/youtube-dl'
-UPDATE_URL_VERSION = 'https://raw.github.com/rg3/youtube-dl/master/LATEST_VERSION'
-UPDATE_URL_EXE = 'https://raw.github.com/rg3/youtube-dl/master/youtube-dl.exe'
-
-
 import getpass
 import optparse
 import os
@@ -46,29 +41,40 @@ from .InfoExtractors import *
 from .PostProcessor import *
 
 def updateSelf(downloader, filename):
-    ''' Update the program file with the latest version from the repository '''
-    # Note: downloader only used for options
+    """Update the program file with the latest version from the repository"""
 
-    if not os.access(filename, os.W_OK):
-        sys.exit('ERROR: no write permissions on %s' % filename)
+    # TODO: at least, check https certificates
 
-    downloader.to_screen(u'Updating to latest version...')
+    from zipimport import zipimporter
 
-    urlv = compat_urllib_request.urlopen(UPDATE_URL_VERSION)
-    newversion = urlv.read().strip()
-    if newversion == __version__:
-        downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
-        return
-    urlv.close()
+    API_URL = "https://api.github.com/repos/rg3/youtube-dl/downloads"
+    BIN_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl"
+    EXE_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl.exe"
+
+    if hasattr(sys, "frozen"): # PY2EXE
+        if not os.access(filename, os.W_OK):
+            sys.exit('ERROR: no write permissions on %s' % filename)
+
+        downloader.to_screen(u'Updating to latest version...')
+
+        urla = compat_urllib_request.urlopen(API_URL)
+        download = filter(lambda x: x["name"] == "youtube-dl.exe", json.loads(urla.read()))
+        if not download:
+            downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
+            return
+        newversion = download[0]["description"].strip()
+        if newversion == __version__:
+            downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
+            return
+        urla.close()
 
-    if hasattr(sys, "frozen"): #py2exe
         exe = os.path.abspath(filename)
         directory = os.path.dirname(exe)
         if not os.access(directory, os.W_OK):
             sys.exit('ERROR: no write permissions on %s' % directory)
 
         try:
-            urlh = compat_urllib_request.urlopen(UPDATE_URL_EXE)
+            urlh = compat_urllib_request.urlopen(EXE_URL)
             newcontent = urlh.read()
             urlh.close()
             with open(exe + '.new', 'wb') as outf:
@@ -91,9 +97,25 @@ del "%s"
         except (IOError, OSError) as err:
             sys.exit('ERROR: unable to overwrite current version')
 
-    else:
+    elif isinstance(globals().get('__loader__'), zipimporter): # UNIX ZIP
+        if not os.access(filename, os.W_OK):
+            sys.exit('ERROR: no write permissions on %s' % filename)
+
+        downloader.to_screen(u'Updating to latest version...')
+
+        urla = compat_urllib_request.urlopen(API_URL)
+        download = [x for x in json.loads(urla.read().decode('utf8')) if x["name"] == "youtube-dl"]
+        if not download:
+            downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
+            return
+        newversion = download[0]["description"].strip()
+        if newversion == __version__:
+            downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
+            return
+        urla.close()
+
         try:
-            urlh = compat_urllib_request.urlopen(UPDATE_URL)
+            urlh = compat_urllib_request.urlopen(BIN_URL)
             newcontent = urlh.read()
             urlh.close()
         except (IOError, OSError) as err:
@@ -105,6 +127,10 @@ del "%s"
         except (IOError, OSError) as err:
             sys.exit('ERROR: unable to overwrite current version')
 
+    else:
+        downloader.to_screen(u'It looks like you installed youtube-dl with pip or setup.py. Please use that to update.')
+        return
+
     downloader.to_screen(u'Updated youtube-dl. Restart youtube-dl to use the new version.')
 
 def parseOpts():
index 7f8410f2a7e4d3d1866459a92a558ae3c41d07c4..7022ea4bec75fb864cd58c3c3c9b5f2a15bc5d7a 100755 (executable)
@@ -7,6 +7,7 @@
 import sys
 
 if __package__ is None and not hasattr(sys, "frozen"):
+    # direct call of __main__.py
     import os.path
     sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))