コード例 #1
0
def my_hook(d):
    if d['status'] == 'downloading':
        speed_info = ""

        if 'filename' in d:
            filename = os.path.basename(d['filename'])
        else:
            filename = ""

        if '_eta_str' in d and '_speed_str' in d:
            speed_info = " (" + d['_speed_str'] + " ETA: " + d['_eta_str'] + ")"
        filename = filename.encode('ascii', 'ignore').decode('ascii')
        dz.begin("Downloading " + filename + speed_info + "...")
        total_bytes = 0

        if 'downloaded_bytes' in d:
            if 'total_bytes' in d:
                total_bytes = d['total_bytes']
            elif 'total_bytes_estimate' in d:
                total_bytes = d['total_bytes_estimate']

            percent = int(100 * d['downloaded_bytes'] / total_bytes)
            if percent > 0:
                utils.set_determinate_progress(True)
                utils.set_progress_percent(percent)

    if d['status'] == 'finished':
        utils.set_determinate_progress(False)
        utils.reset_progress()
        print('Download complete')
コード例 #2
0
ファイル: action.py プロジェクト: aptonic/dropzone3-actions
def my_hook(d):
    if d['status'] == 'downloading':
        speed_info = ""
        
        if 'filename' in d:
            filename = os.path.basename(d['filename'])
        else:
            filename = ""
    
        if '_eta_str' in d and '_speed_str' in d:
            speed_info = " (" + d['_speed_str'] + " ETA: " + d['_eta_str'] + ")"
        filename = filename.encode('ascii', 'ignore').decode('ascii')
        dz.begin("Downloading " + filename + speed_info + "...")
        total_bytes = 0
        
        if 'downloaded_bytes' in d:
            if 'total_bytes' in d:
                total_bytes = d['total_bytes']
            elif 'total_bytes_estimate' in d:
                total_bytes = d['total_bytes_estimate']
            
            percent = int(100 * d['downloaded_bytes'] / total_bytes)
            if percent > 0:
                utils.set_determinate_progress(True)
                utils.set_progress_percent(percent)
    
    if d['status'] == 'finished':
        utils.set_determinate_progress(False)
        utils.reset_progress()
        print('Download complete')
コード例 #3
0
def download_url(url):
    regex = re.compile(
        r'^(?:http)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  #domain...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'  # ...or ip
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$',
        re.IGNORECASE)

    if not regex.match(url):
        dz.fail("Not a valid video URL")

    dz.begin("Checking youtube-dl library is up to date...")
    utils.set_determinate_progress(False)

    updater.update_youtubedl()

    dz.begin("Preparing to download video...")
    utils.set_determinate_progress(False)
    utils.reset_progress()

    # Put ffmpeg in PATH for merging videos audio and video
    if 'apple_silicon' in os.environ:
        os.environ["PATH"] += os.pathsep + os.path.join(
            os.getcwd(), 'ffmpeg-arm')
    else:
        os.environ["PATH"] += os.pathsep + os.path.join(os.getcwd(), 'ffmpeg')

    # Download URL from clipboard
    sys.path.append("yt-dlp")

    from yt_dlp import YoutubeDL

    ydl_opts = {
        'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
        'outtmpl': os.path.join(os.environ['EXTRA_PATH'], '%(title)s.%(ext)s'),
        'logger': MyLogger(),
        'progress_hooks': [my_hook]
    }

    try:
        with YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
    except Exception as e:
        print(traceback.format_exc())
        dz.error("Video Download Failed",
                 "Downloading video failed with the error:\n\n" + e.message)

    dz.finish("Video Download Complete")
    dz.url(False)
コード例 #4
0
ファイル: action.py プロジェクト: aptonic/dropzone3-actions
def download_url(url):
    regex = re.compile(
            r'^(?:http)s?://' # http:// or https://
            r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
            r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
            r'(?::\d+)?' # optional port
            r'(?:/?|[/?]\S+)$', re.IGNORECASE)
    
    if not regex.match(url):
        dz.fail("Not a valid video URL")
    
    dz.begin("Checking youtube-dl library is up to date...")
    utils.set_determinate_progress(False)

    updater.update_youtubedl()
    
    dz.begin("Preparing to download video...")
    utils.set_determinate_progress(False)
    utils.reset_progress()
    
    # Put ffmpeg in PATH for merging videos audio and video
    os.environ["PATH"] += os.pathsep + os.path.join(os.getcwd(), 'ffmpeg')
    
    # Download URL from clipboard
    sys.path.append("youtube-dl")
    import youtube_dl
    
    ydl_opts = {
        'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
        'outtmpl': os.path.join(os.environ['EXTRA_PATH'], '%(title)s.%(ext)s'),
        'logger': MyLogger(),
        'progress_hooks': [my_hook]
    }
    
    try:
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
    except Exception as e:
        print(traceback.format_exc())
        dz.error("Video Download Failed", "Downloading video failed with the error:\n\n" + e.message)
        
    dz.finish("Video Download Complete")
    dz.url(False)
コード例 #5
0
ファイル: updater.py プロジェクト: aptonic/dropzone4-actions
 def reporthook(blocknum, blocksize, totalsize):
     percent = int(blocknum * blocksize * 1e2 / totalsize)
     if percent > 0 and percent <= 100:
         utils.set_determinate_progress(True)
         utils.set_progress_percent(percent)
コード例 #6
0
ファイル: updater.py プロジェクト: aptonic/dropzone4-actions
def update_youtubedl():
    current_version = get_yt_downloader_version()
    VERSION_JSON_URL = 'https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest'

    python_version = sys.version_info[0]

    # Check if there is a new version
    try:
        if python_version == 3:
            versions_result = urllib.request.urlopen(
                VERSION_JSON_URL).read().decode('utf-8').strip()
        else:
            versions_result = urllib2.urlopen(VERSION_JSON_URL).read().decode(
                'utf-8').strip()
        versions_info = json.loads(versions_result)
    except Exception:
        print(traceback.format_exc())
        print(
            'ERROR: Could not download latest version info. Please try again later.'
        )
        return

    version_id = versions_info['tag_name']
    print(f'Latest version: {version_id}, Current version: {current_version}')
    if version_tuple(current_version) >= version_tuple(version_id):
        print(f'yt-dlp is up to date ({current_version})')
        return

    version_download_url = (get_version(versions_info))['browser_download_url']

    print('Updating to version ' + version_id + ' ...')

    filename = "update.tar.gz"

    dz.begin("Updating YouTube downloader...")
    utils.set_determinate_progress(False)

    try:
        os.remove(filename)
    except OSError:
        pass

    try:
        shutil.rmtree('yt-tmp')
    except Exception:
        pass

    try:

        def reporthook(blocknum, blocksize, totalsize):
            percent = int(blocknum * blocksize * 1e2 / totalsize)
            if percent > 0 and percent <= 100:
                utils.set_determinate_progress(True)
                utils.set_progress_percent(percent)

        if python_version == 3:
            urlretrieve(version_download_url, filename, reporthook)
        else:
            urllib.urlretrieve(version_download_url, filename, reporthook)

    except Exception:
        print(traceback.format_exc())
        print('ERROR: unable to download latest version')
        return

    with open(filename, 'rb') as updatefile:
        newcontent = updatefile.read()

    newcontent_hash = hashlib.sha256(newcontent).hexdigest()
    if newcontent_hash != get_sha256sum(versions_info):
        print('ERROR: the downloaded file hash does not match. Aborting.')
        return

    os.mkdir('yt-dlp-tmp')

    tar = tarfile.open(filename)
    tar.extractall("./yt-dlp-tmp")
    tar.close()

    # Sanity check - does downloaded yt-dlp contain an __init.py__
    check_path = 'yt-dlp-tmp/yt-dlp/yt_dlp/__init__.py'
    if os.path.exists(check_path):
        print('Extracted update looks good.')
    else:
        print(check_path + ' could not be found. Aborting update.')
        return

    # Delete existing library and move new one into place
    shutil.rmtree('yt-dlp')
    shutil.move('yt-dlp-tmp/yt-dlp', 'yt-dlp')
    shutil.rmtree('yt-dlp-tmp')
    os.remove('update.tar.gz')

    # Get new version from youtube_dl, we can't reload all youtube_dl dependencies so we will do actual download in another python instance
    old_version = current_version
    new_version = get_yt_downloader_version()
    print('Successfully updated yt-dlp library version from ' + old_version +
          ' to ' + new_version)
コード例 #7
0
def update_youtubedl():
    current_version = get_yt_downloader_version()
    UPDATE_URL = 'https://rg3.github.io/youtube-dl/update/'
    VERSION_URL = UPDATE_URL + 'LATEST_VERSION'
    JSON_URL = UPDATE_URL + 'versions.json'

    # Check if there is a new version
    try:
        newversion = urllib2.urlopen(VERSION_URL).read().decode(
            'utf-8').strip()
    except Exception:
        print(traceback.format_exc())
        print(
            'ERROR: can\'t find the current version. Please try again later.')
        return
    if newversion == current_version:
        print('youtube-dl is up-to-date (v' + current_version + ')')
        return

    try:
        versions_info = urllib2.urlopen(JSON_URL).read().decode('utf-8')
        versions_info = json.loads(versions_info)
    except Exception:
        print(traceback.format_exc())
        print(
            'ERROR: Could not download versions.json. Please try again later.')
        return

    print('Attempting to update youtube-dl')

    version_id = versions_info['latest']

    print('Updating to version ' + version_id + ' ...')
    version = versions_info['versions'][version_id]

    filename = "update.tar.gz"

    dz.begin("Updating YouTube downloader...")
    utils.set_determinate_progress(False)

    try:
        os.remove(filename)
    except OSError:
        pass

    try:
        shutil.rmtree('yt-tmp')
    except Exception:
        pass

    try:

        def reporthook(blocknum, blocksize, totalsize):
            percent = int(blocknum * blocksize * 1e2 / totalsize)
            if percent > 0 and percent <= 100:
                utils.set_determinate_progress(True)
                utils.set_progress_percent(percent)

        urllib.urlretrieve(version['tar'][0], filename, reporthook)

    except Exception:
        print(traceback.format_exc())
        print('ERROR: unable to download latest version')
        return

    with open(filename, 'rb') as updatefile:
        newcontent = updatefile.read()

    newcontent_hash = hashlib.sha256(newcontent).hexdigest()
    if newcontent_hash != version['tar'][1]:
        print('ERROR: the downloaded file hash does not match. Aborting.')
        return

    os.mkdir('yt-tmp')

    tar = tarfile.open(filename)
    tar.extractall("./yt-tmp")
    tar.close()

    # Sanity check - does downloaded youtube-dl contain an __init.py__
    check_path = 'yt-tmp/youtube-dl/youtube_dl/__init__.py'
    if os.path.exists(check_path):
        print('Extracted update looks good.')
    else:
        print(check_path + ' could not be found. Aborting update.')
        return

    # Delete existing library and move new one into place
    shutil.rmtree('youtube-dl')
    shutil.move('yt-tmp/youtube-dl', 'youtube-dl')
    shutil.rmtree('yt-tmp')
    os.remove('update.tar.gz')

    # Get new version from youtube_dl, we can't reload all youtube_dl dependencies so we will do actual download in another python instance
    old_version = current_version
    new_version = get_yt_downloader_version()
    print('Successfully updated youtube-dl library version from ' +
          old_version + ' to ' + new_version)
コード例 #8
0
 def reporthook(blocknum, blocksize, totalsize):
     percent = int(blocknum * blocksize * 1e2 / totalsize)
     if percent > 0 and percent <= 100:
         utils.set_determinate_progress(True)
         utils.set_progress_percent(percent)
コード例 #9
0
def update_youtubedl():
    current_version = get_yt_downloader_version()
    UPDATE_URL = 'https://rg3.github.io/youtube-dl/update/'
    VERSION_URL = UPDATE_URL + 'LATEST_VERSION'
    JSON_URL = UPDATE_URL + 'versions.json'
    
    # Check if there is a new version
    try:
        newversion = urllib2.urlopen(VERSION_URL).read().decode('utf-8').strip()
    except Exception:
        print(traceback.format_exc())
        print('ERROR: can\'t find the current version. Please try again later.')
        return
    if newversion == current_version:
        print('youtube-dl is up-to-date (v' + current_version + ')')
        return
    
    try:
        versions_info = urllib2.urlopen(JSON_URL).read().decode('utf-8')
        versions_info = json.loads(versions_info)
    except Exception:
        print(traceback.format_exc())
        print('ERROR: Could not download versions.json. Please try again later.')
        return
        
    print('Attempting to update youtube-dl') 

    version_id = versions_info['latest']
    
    print('Updating to version ' + version_id + ' ...')
    version = versions_info['versions'][version_id]
    
    filename = "update.tar.gz"
    
    dz.begin("Updating YouTube downloader...")
    utils.set_determinate_progress(False)
    
    try:
        os.remove(filename)
    except OSError:
        pass
    
    try:
        shutil.rmtree('yt-tmp')
    except Exception:
        pass
    
    try:
        def reporthook(blocknum, blocksize, totalsize):
            percent = int(blocknum * blocksize * 1e2 / totalsize)
            if percent > 0 and percent <= 100:
                utils.set_determinate_progress(True)
                utils.set_progress_percent(percent)
        
        urllib.urlretrieve(version['tar'][0], filename, reporthook)
        
    except Exception:
        print(traceback.format_exc())
        print('ERROR: unable to download latest version')
        return

    with open(filename, 'rb') as updatefile:
        newcontent = updatefile.read()

    newcontent_hash = hashlib.sha256(newcontent).hexdigest()
    if newcontent_hash != version['tar'][1]:
        print('ERROR: the downloaded file hash does not match. Aborting.')
        return

    os.mkdir('yt-tmp');
        
    tar = tarfile.open(filename)
    tar.extractall("./yt-tmp")
    tar.close()
    
    # Sanity check - does downloaded youtube-dl contain an __init.py__
    check_path = 'yt-tmp/youtube-dl/youtube_dl/__init__.py'
    if os.path.exists(check_path):
        print('Extracted update looks good.')
    else:
        print(check_path + ' could not be found. Aborting update.')
        return
    
    # Delete existing library and move new one into place
    shutil.rmtree('youtube-dl')
    shutil.move('yt-tmp/youtube-dl', 'youtube-dl')
    shutil.rmtree('yt-tmp')
    os.remove('update.tar.gz')
    
    # Get new version from youtube_dl, we can't reload all youtube_dl dependencies so we will do actual download in another python instance
    old_version = current_version
    new_version = get_yt_downloader_version()
    print('Successfully updated youtube-dl library version from ' + old_version + ' to ' + new_version)