@ -5,6 +5,7 @@ import json
import traceback
import traceback
import hashlib
import hashlib
import os
import os
import platform
import subprocess
import subprocess
import sys
import sys
from zipimport import zipimporter
from zipimport import zipimporter
@ -32,7 +33,10 @@ def rsa_verify(message, signature, key):
def update_self ( to_screen , verbose , opener ) :
def update_self ( to_screen , verbose , opener ) :
""" Update the program file with the latest version from the repository """
"""
Update the program file with the latest version from the repository
Returns whether the program should terminate
"""
JSON_URL = ' https://api.github.com/repos/pukkandan/yt-dlp/releases/latest '
JSON_URL = ' https://api.github.com/repos/pukkandan/yt-dlp/releases/latest '
@ -48,7 +52,7 @@ def update_self(to_screen, verbose, opener):
to_screen ( ' Current Build Hash %s ' % sha256sum ( ) )
to_screen ( ' Current Build Hash %s ' % sha256sum ( ) )
if not isinstance ( globals ( ) . get ( ' __loader__ ' ) , zipimporter ) and not hasattr ( sys , ' frozen ' ) :
if not isinstance ( globals ( ) . get ( ' __loader__ ' ) , zipimporter ) and not hasattr ( sys , ' frozen ' ) :
to_screen ( ' It looks like you installed y outube-dlc with a package manager, pip, setup.py or a tarball. Please use that to update.' )
to_screen ( ' It looks like you installed y t-dlp with a package manager, pip, setup.py or a tarball. Please use that to update.' )
return
return
# Download and check versions info
# Download and check versions info
@ -62,25 +66,28 @@ def update_self(to_screen, verbose, opener):
to_screen ( ' Visit https://github.com/pukkandan/yt-dlp/releases/latest ' )
to_screen ( ' Visit https://github.com/pukkandan/yt-dlp/releases/latest ' )
return
return
version_id = version_info [ ' tag_name ' ]
if version_id == __version__ :
to_screen ( ' youtube-dlc is up-to-date ( ' + __version__ + ' ) ' )
return
def version_tuple ( version_str ) :
def version_tuple ( version_str ) :
return tuple ( map ( int , version_str . split ( ' . ' ) ) )
return tuple ( map ( int , version_str . split ( ' . ' ) ) )
version_id = version_info [ ' tag_name ' ]
if version_tuple ( __version__ ) > = version_tuple ( version_id ) :
if version_tuple ( __version__ ) > = version_tuple ( version_id ) :
to_screen ( ' y outube-dlc is up to date (%s ) ' % __version__ )
to_screen ( ' y t-dlp is up to date (%s ) ' % __version__ )
return
return
to_screen ( ' Updating to version ' + version_id + ' ... ' )
to_screen ( ' Updating to version ' + version_id + ' ... ' )
version = {
def get_bin_info ( bin_or_exe , version ) :
' bin ' : next ( i for i in version_info [ ' assets ' ] if i [ ' name ' ] == ' youtube-dlc ' ) ,
labels = {
' exe ' : next ( i for i in version_info [ ' assets ' ] if i [ ' name ' ] == ' youtube-dlc.exe ' ) ,
' zip_3 ' : ' ' ,
' exe_x86 ' : next ( i for i in version_info [ ' assets ' ] if i [ ' name ' ] == ' youtube-dlc_x86.exe ' ) ,
' zip_2 ' : ' ' ,
}
# 'zip_2': '_py2',
' exe_64 ' : ' .exe ' ,
' exe_32 ' : ' _x86.exe ' ,
}
label = labels [ ' %s _ %s ' % ( bin_or_exe , version ) ]
return next (
i for i in version_info [ ' assets ' ]
if i [ ' name ' ] in ( ' yt-dlp %s ' % label , ' youtube-dlc %s ' % label ) )
# sys.executable is set to the full pathname of the exe-file for py2exe
# sys.executable is set to the full pathname of the exe-file for py2exe
# though symlinks are not followed so that we need to do this manually
# though symlinks are not followed so that we need to do this manually
@ -100,10 +107,11 @@ def update_self(to_screen, verbose, opener):
return
return
try :
try :
urlh = opener . open ( version [ ' exe ' ] [ ' browser_download_url ' ] )
arch = platform . architecture ( ) [ 0 ] [ : 2 ]
urlh = opener . open ( get_bin_info ( ' exe ' , arch ) [ ' browser_download_url ' ] )
newcontent = urlh . read ( )
newcontent = urlh . read ( )
urlh . close ( )
urlh . close ( )
except ( IOError , OSError ):
except ( IOError , OSError , StopIteration ):
if verbose :
if verbose :
to_screen ( encode_compat_str ( traceback . format_exc ( ) ) )
to_screen ( encode_compat_str ( traceback . format_exc ( ) ) )
to_screen ( ' ERROR: unable to download latest version ' )
to_screen ( ' ERROR: unable to download latest version ' )
@ -127,7 +135,7 @@ def update_self(to_screen, verbose, opener):
echo . Waiting for file handle to be closed . . .
echo . Waiting for file handle to be closed . . .
ping 127.0 .0 .1 - n 5 - w 1000 > NUL
ping 127.0 .0 .1 - n 5 - w 1000 > NUL
move / Y " %s .new " " %s " > NUL
move / Y " %s .new " " %s " > NUL
echo . Updated y outube- dlc to version % s .
echo . Updated y t- dlp to version % s .
)
)
@start / b " " cmd / c del " %% ~f0 " & exit / b
@start / b " " cmd / c del " %% ~f0 " & exit / b
''' % (exe, exe, version_id))
''' % (exe, exe, version_id))
@ -143,10 +151,11 @@ def update_self(to_screen, verbose, opener):
# Zip unix package
# Zip unix package
elif isinstance ( globals ( ) . get ( ' __loader__ ' ) , zipimporter ) :
elif isinstance ( globals ( ) . get ( ' __loader__ ' ) , zipimporter ) :
try :
try :
urlh = opener . open ( version [ ' bin ' ] [ ' browser_download_url ' ] )
py_ver = platform . python_version ( ) [ 0 ]
urlh = opener . open ( get_bin_info ( ' zip ' , py_ver ) [ ' browser_download_url ' ] )
newcontent = urlh . read ( )
newcontent = urlh . read ( )
urlh . close ( )
urlh . close ( )
except ( IOError , OSError ):
except ( IOError , OSError , StopIteration ):
if verbose :
if verbose :
to_screen ( encode_compat_str ( traceback . format_exc ( ) ) )
to_screen ( encode_compat_str ( traceback . format_exc ( ) ) )
to_screen ( ' ERROR: unable to download latest version ' )
to_screen ( ' ERROR: unable to download latest version ' )
@ -162,7 +171,7 @@ def update_self(to_screen, verbose, opener):
to_screen ( ' ERROR: unable to overwrite current version ' )
to_screen ( ' ERROR: unable to overwrite current version ' )
return
return
to_screen ( ' Updated y outube-dlc . Restart youtube-dlc to use the new version.' )
to_screen ( ' Updated y t-dlp . Restart youtube-dlc to use the new version.' )
''' # UNUSED
''' # UNUSED