ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

腾讯课堂app 离线视频格式破解——完结(修正版本)

2020-01-27 09:02:41  阅读:704  来源: 互联网

标签:00 MB app 离线 wrapper eta 视频格式 edu tencent


原文有两个错误,我将会在这里修正!!!!

22:05 2020/1/26 星期日

 

 

腾讯课堂app 离线视频格式破解——完结

GlobaLFlanker 0.1392019.10.16 23:10:17字数 1,724阅读 554

之前因为温习3dsmax,在腾讯课堂app上缓存了不少的视频,因为缓存在手机观看屏幕比较小,一直想把缓存的视频转移到PC上看,对于我这种信号时有时无的人来说,手机是最好的找信号工具,故视频缓存在手机上了。

先放完整代码和转换结果:

 

  由.sqlite文件转换成的ts片段(还没合并)
# _*_coding:utf-8 _*_
# @Time    : 2019/10/16 16:04
# @Author  : Shek 
# @FileName: run.py
# @Software: PyCharm
import sqlite3 as db
from Crypto.Cipher import AES


def db_fetcher(filename: str):
    '''
    处理.sqlite文件的入口
    :param filename: .sqlite文件名
    :return:
    '''
    caches_table_name = 'caches'
    con = db.connect(filename)
    cu = con.cursor()
    result = cu.execute('SELECT * FROM {}'.format(caches_table_name))

    data = result.fetchall()
    AES_KEY = data[1][1]

    for i in range(2, len(data)):
        raw = data[i][1]
        dump_name = 'dump-{}.ts'.format(i)
        plain = aes128_decrypt(raw=raw, key=AES_KEY, dump_file=dump_name)
        if plain:
            print('{} of {} dumped succeed'.format(i - 1, len(data)))


def aes128_decrypt(raw: bytes, key: bytes, iv: bytes = b'0000000000000000', dump_file: str = ''):
    '''
    二进制文件的AES-128解密
    :param raw: 原始二进制内容
    :param key: AES-128文件二进制内容(16bytes)
    :param iv: AES_IV
    :param dump_file: 保存文件名
    :return: 正常True,异常False
    '''
    data = raw
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plain = cipher.decrypt(data)
    try:
        open(dump_file, 'wb').write(plain)
        return True
    except Exception as e:
        print(e)
        return False


db_file = '1e6e9a425ee02902acd996fa5f87eff4.m3u8.sqlite'
db_fetcher(filename=db_file)

缓存数据位置

腾讯课堂app的数据存储在Android/data/com.tencent.edu文件夹中,并且使用sqlite数据库文件进行离线视频进行存储,这首先就很奇怪了,数据库文件一般存的是数据,怎么会存储媒体文件呢?结合数据库经验,猜测应该是在数据库中以blob类型进行存储。所谓blob类型,就是二进制对象,以二进制格式存储所有类型的数据,尽管blob类型在文件后处理方面有一定的优势,但是会在一定程度上降低数据库的性能(使用Navicat打开的时候,我都怀疑屏幕坏了,一卡一卡的……)

数据库结构

使用navicat我们打开其中一个sqlite文件,其中有两张表:metadata和caches,这里我们重点关注caches表。

 

  caches表内容,另外可右键-设计表可以查看到value字段是blob类型

 

这印证了之前的推测,sqlite数据库文件中,利用blob类型形成了“类目录”,在里面塞入了.ts视频文件片段、m3u8目录信息和解密密钥(密钥这个后面说)。

再回到caches表中,可以将表中数据按行分为3类:

1.第一行:视频片段目录信息(m3u8)

2.第二行:AES密钥

3.第三行以及以后:视频分段文件,一行代表一个

来看一下第一行数据:

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiCBJj%2BLeHsBnilhenVC3KnMSpmaTIzwGJ%2FWPpEf7symChCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890791427386588&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxMjMwMDk0MTg2MDt0ZXJtX2lkPTEwMDM5Nzc1Njtwc2tleT07ZXh0PTU1ZTczOGQzNjc1YTI2Nzc2YzkxODA4M2FmZTJiMjMwZDIwNzY4Y2M4MDUyMGI4ZTljMzUyZTZiZDA5NDFlOTA3NWYwZWIzYjY2MjNmNjVmODRhNTFiZjFiYjMzYzMwMDM1Y2NmOTYxMjFmNzgzODRjNTc5NWRiNzlhNDU3ZGJlZDhlMWU2NjlkYTgwZWU4Mw",IV=0x00000000000000000000000000000000

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-TARGETDURATION:10

#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiCBJj%2BLeHsBnilhenVC3KnMSpmaTIzwGJ%2FWPpEf7symChCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890791427386588&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxMjMwMDk0MTg2MDt0ZXJtX2lkPTEwMDM5Nzc1Njtwc2tleT07ZXh0PTU1ZTczOGQzNjc1YTI2Nzc2YzkxODA4M2FmZTJiMjMwZDIwNzY4Y2M4MDUyMGI4ZTljMzUyZTZiZDA5NDFlOTA3NWYwZWIzYjY2MjNmNjVmODRhNTFiZjFiYjMzYzMwMDM1Y2NmOTYxMjFmNzgzODRjNTc5NWRiNzlhNDU3ZGJlZDhlMWU2NjlkYTgwZWU4Mw",IV=0x00000000000000000000000000000000

#EXTINF:10.000,

v.f30741.ts?start=0&end=273743&type=mpegts

#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiCBJj%2BLeHsBnilhenVC3KnMSpmaTIzwGJ%2FWPpEf7symChCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890791427386588&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxMjMwMDk0MTg2MDt0ZXJtX2lkPTEwMDM5Nzc1Njtwc2tleT07ZXh0PTU1ZTczOGQzNjc1YTI2Nzc2YzkxODA4M2FmZTJiMjMwZDIwNzY4Y2M4MDUyMGI4ZTljMzUyZTZiZDA5NDFlOTA3NWYwZWIzYjY2MjNmNjVmODRhNTFiZjFiYjMzYzMwMDM1Y2NmOTYxMjFmNzgzODRjNTc5NWRiNzlhNDU3ZGJlZDhlMWU2NjlkYTgwZWU4Mw",IV=0x00000000000000000000000000000000

#EXTINF:10.000,

v.f30741.ts?start=273744&end=470959&type=mpegts

...

#EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiCBJj%2BLeHsBnilhenVC3KnMSpmaTIzwGJ%2FWPpEf7symChCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890791427386588&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxMjMwMDk0MTg2MDt0ZXJtX2lkPTEwMDM5Nzc1Njtwc2tleT07ZXh0PTU1ZTczOGQzNjc1YTI2Nzc2YzkxODA4M2FmZTJiMjMwZDIwNzY4Y2M4MDUyMGI4ZTljMzUyZTZiZDA5NDFlOTA3NWYwZWIzYjY2MjNmNjVmODRhNTFiZjFiYjMzYzMwMDM1Y2NmOTYxMjFmNzgzODRjNTc5NWRiNzlhNDU3ZGJlZDhlMWU2NjlkYTgwZWU4Mw",IV=0x00000000000000000000000000000000

#EXTINF:1.154,

v.f30741.ts?start=3967568&end=4075119&type=mpegts

#EXT-X-ENDLIST

咋一看,非常典型的配置类信息,这就是M3U8目录信息的存储行(第一行),记录了整个视频文件应该由哪些片段进行合成、时间位置、格式版本号等等。那么M3U8是什么呢?

M3U8

简单在网上搜索了一下,参考文章 M3U8格式讲解及实际应用分析,M3U8主要用于多码率适配,根据网络带宽,客户端自动选择一个适合自己码率的文件进行播放,保证视频流的流畅,而M3U8是M3U文件的拓展,对照样本来看一下:

EXT-X-VERSION:3

版本信息,可以没有。

EXT-X-MEDIA-SEQUENCE:0

定义当前m3u8文件中第一个文件的序列号,每个ts文件有固定的序列号,用于MBR时切换码率进行对齐。

EXT-X-TARGETDURATION:10

定义每个TS的最大长度。

EXT-X-KEY:METHOD=AES-128,URI="https://ke.qq.com/cgi-bin/qcloud/get_dk?edk=CiCBJj%2BLeHsBnilhenVC3KnMSpmaTIzwGJ%2FWPpEf7symChCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890791427386588&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxMjMwMDk0MTg2MDt0ZXJtX2lkPTEwMDM5Nzc1Njtwc2tleT07ZXh0PTU1ZTczOGQzNjc1YTI2Nzc2YzkxODA4M2FmZTJiMjMwZDIwNzY4Y2M4MDUyMGI4ZTljMzUyZTZiZDA5NDFlOTA3NWYwZWIzYjY2MjNmNjVmODRhNTFiZjFiYjMzYzMwMDM1Y2NmOTYxMjFmNzgzODRjNTc5NWRiNzlhNDU3ZGJlZDhlMWU2NjlkYTgwZWU4Mw",IV=0x00000000000000000000000000000000

定义加密方式和密钥文件的地址,获得16字节的密钥解码ts文件,这里METHOD=AES-128表示使用AES-128进行加密/解密,URI表示密钥文件位置/路径,其中的IV应该是与AES有关的一个参数,类似于偏移量?(在Crypto.Cipher.AES中查看references时看到过)

EXTINF:10.000,

v.f30741.ts?start=0&end=273743&type=mpegts

一些基本信息,数据内容的长度、文件名、时间对齐、文件类型等。

总结下来就是:
caches表第一行:m3u8文件内容
caches表第二行:AES-128解密文件(16bytes)
caches表其余行:ts文件分片
现在基本已经明确了腾讯课堂app缓存文件的数据格式,其实就是m3u8的数据库拓展格式,在一个sqlite文件中利用blob存放了m3u8目录文件、ts分片文件和可能用到的AES-128解密文件(16bytes),根据这个思路,下面开始写解密程序,这里需要用到外部库pycrypto。

import sqlite3 as db
from Crypto.Cipher import AES

def aes128_decrypt(raw: bytes, key: bytes, iv: bytes = b'0000000000000000', dump_file: str = ''):
    '''
    二进制文件的AES-128解密函数
    :param raw: 原始二进制内容
    :param key: AES-128文件二进制内容(16bytes)
    :param iv: AES_IV
    :param dump_file: 保存文件名
    :return: 正常True,异常False
    '''
    data = raw
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plain = cipher.decrypt(data)
    try:
        open(dump_file, 'wb').write(plain)
        return True
    except Exception as e:
        print(e)
        return False
def db_fetcher(filename: str):
    '''
    处理.sqlite文件的入口
    :param filename: .sqlite文件名
    :return: 
    '''
    caches_table_name = 'caches'
    con = db.connect(filename)
    cu = con.cursor()
    result = cu.execute('SELECT * FROM {}'.format(caches_table_name))

    data = result.fetchall()
    AES_KEY = data[1][1]

    for i in range(2, len(data)):
        raw = data[i][1]
        dump_name = 'dump-{}.ts'.format(i)
        plain = aes128_decrypt(raw=raw, key=AES_KEY, dump_file=dump_name)
        if plain:
            print('{} of {} dumped succeed'.format(i - 1, len(data)))

执行:

db_file = '1e6e9a425ee02902acd996fa5f87eff4.m3u8.sqlite'
db_fetcher(filename=db_file)

总结
以上代码只是验证,并未完善,有兴趣的朋友可以继续深化,封装类,写GUI等。回头想了想,还是文件名*.m3u8.sqlite给我提供了思路,不然看着那么大一个文件,我应该没什么勇气扔进winhex里比对文件头,第一反应就是整个文件都被加密了,却不曾想到腾讯课堂app中首先在外层套的还是一个正常的外衣:一个数据库,然后在里面存放需要的媒体数据。至于使用的AES-128加密,是归咎于m3u8提供了此选项,并不是腾讯课堂app的设计功能,所以才会导致AES-128解密文件共同存放于一个数据库文件中的情况,没有引起重视。
文章发布时已通过微信联系微信团队进行处理,只是聊天画风有点:

  马爸爸不要封我

 

终。
--------分割线 2019.10.18更新
关于m3u8信息、aes密钥和ts片段信息的位置,后来实际使用发现并不是严格的按数据行区分,有时候还会获取多次aes密钥(尽管内容一样)甚至先存储ts片段再下载aes密钥。对于此,本文代码无法完美处理,修正、封装好的类已于本文发布第二天完善,详细请看:(文章未完成)
--------分割线 2019.11.14更新
封装好的类已同步更新到原github仓库,同时提供了adb支持,打开手机调试模式,直接转换到本地计算机,详细请看:

https://github.com/r00t1900/tencent-edu-wrapper


 

测试视频使用:

https://ke.qq.com/course/292265
https://ke.qq.com/course/292265?taid=2255450536179113
设计美学课程
成都信息工程大学-郭蕾

暂时选择第9节:

使用SQLite Developer可视化解析sqlite数据库文件,发现有m3u8头文件信息,比对格式基本一致。

 

 

本文解决了3个问题:

问题1:

Python V3.6.8/V3.7.2/V3.8.1

运行代码:

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>cd E:\tencent-edu-wrapper\tencent-edu-wrapper-master

C:\Users\Administrator>e:

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>dir
 驱动器 E 中的卷是 UBUNTU
 卷的序列号是 0001-A670

 E:\tencent-edu-wrapper\tencent-edu-wrapper-master 的目录

2020/01/24 周五  12:05    <DIR>          .
2020/01/24 周五  12:05    <DIR>          ..
2019/11/05 周二  00:14             2,044 README.md
2019/11/05 周二  00:14             9,462 tencent_edu.py
2020/01/24 周五  12:04       148,078,592 test.m3u8.sqlite
2019/11/05 周二  00:14             1,583 wrapper_cli.py
2019/11/05 周二  00:14             1,240 wrapper_prompt.py
2020/01/24 周五  15:48    <DIR>          __pycache__
               5 个文件    148,092,921 字节
               3 个目录 26,955,702,272 可用字节

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>python wrapper_cli.py -h
Traceback (most recent call last):
  File "wrapper_cli.py", line 6, in <module>
    from tencent_edu import wrapper
  File "E:\tencent-edu-wrapper\tencent-edu-wrapper-master\tencent_edu.py", line
8, in <module>
    from Crypto.Cipher import AES
ModuleNotFoundError: No module named 'Crypto'

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>pip install pycryptodome
Collecting pycryptodome
  Downloading https://files.pythonhosted.org/packages/c8/a9/d65f44cdb4b44e05b494
fa0bfed087105a706033644e5826c48d3c6ccfb8/pycryptodome-3.9.4-cp38-cp38-win_amd64.
whl (10.1MB)
     |██                              | 573kB 187kB/s eta 0:00:51
     
     |██████████████▌                 | 4.5MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.5MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |██████████████▌                 | 4.6MB 437kB/s eta 0:00:13
     |███████████████                 | 4.6MB 437kB/s eta 0:00:13
     |███████████████                 | 4.6MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.7MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████                 | 4.8MB 437kB/s eta 0:00:13
     |███████████████▌                | 4.9MB 437kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 437kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 437kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |███████████████▌                | 4.9MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.0MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.1MB 547kB/s eta 0:00:1
     |████████████████                | 5.2MB 547kB/s eta 0:00:1
     |████████████████                | 5.2MB 547kB/s eta 0:00:1
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.2MB 547kB/s eta 0:00:
     |████████████████▌               | 5.3MB 547kB/s eta 0:00:
     |████████████████▌               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.3MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.4MB 547kB/s eta 0:00:
     |█████████████████               | 5.5MB 547kB/s eta 0:00:
     |█████████████████               | 5.5MB 547kB/s eta 0:00:
     |█████████████████               | 5.5MB 312kB/s eta 0:00:
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.5MB 312kB/s eta 0:00
     |█████████████████▌              | 5.6MB 312kB/s eta 0:00
     |█████████████████▌              | 5.6MB 312kB/s eta 0:00
     |█████████████████▌              | 5.6MB 312kB/s eta 0:00
     |█████████████████▌              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.6MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.7MB 312kB/s eta 0:00
     |██████████████████              | 5.8MB 312kB/s eta 0:00
     |██████████████████              | 5.8MB 312kB/s eta 0:00
     |██████████████████              | 5.8MB 285kB/s eta 0:00
     |██████████████████              | 5.8MB 285kB/s eta 0:00
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.8MB 285kB/s eta 0:0
     |██████████████████▌             | 5.9MB 285kB/s eta 0:0
     |██████████████████▌             | 5.9MB 285kB/s eta 0:0
     |██████████████████▌             | 5.9MB 285kB/s eta 0:0
     |██████████████████▌             | 5.9MB 285kB/s eta 0:0
     |██████████████████▌             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 5.9MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.0MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████             | 6.1MB 285kB/s eta 0:0
     |███████████████████▌            | 6.1MB 285kB/s eta 0:
     |███████████████████▌            | 6.1MB 285kB/s eta 0:
     |███████████████████▌            | 6.1MB 285kB/s eta 0:
     |███████████████████▌            | 6.1MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |███████████████████▌            | 6.2MB 285kB/s eta 0:
     |████████████████████            | 6.2MB 285kB/s eta 0:
     |████████████████████            | 6.2MB 285kB/s eta 0:
     |████████████████████            | 6.2MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.3MB 285kB/s eta 0:
     |████████████████████            | 6.4MB 285kB/s eta 0:
     |████████████████████            | 6.4MB 285kB/s eta 0:
     |████████████████████            | 6.4MB 156kB/s eta 0:
     |████████████████████            | 6.4MB 156kB/s eta 0:
     |████████████████████            | 6.4MB 156kB/s eta 0:
     |████████████████████            | 6.4MB 156kB/s eta 0:
     |████████████████████            | 6.4MB 156kB/s eta 0:
     |████████████████████▌           | 6.4MB 156kB/s eta 0
     |████████████████████▌           | 6.4MB 156kB/s eta 0
     |████████████████████▌           | 6.5MB 156kB/s eta 0
     |████████████████████▌           | 6.5MB 156kB/s eta 0
     |████████████████████▌           | 6.5MB 156kB/s eta 0
     |████████████████████▌           | 6.5MB 80kB/s eta 0:
     |████████████████████▌           | 6.5MB 80kB/s eta 0:
     |████████████████████▌           | 6.5MB 80kB/s eta 0:
     |████████████████████▌           | 6.5MB 80kB/s eta 0:
     |████████████████████▌           | 6.5MB 80kB/s eta 0:
     |█████████████████████           | 6.5MB 80kB/s eta 0:
     |█████████████████████           | 6.5MB 80kB/s eta 0:
     |█████████████████████           | 6.6MB 80kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 73kB/s eta 0:
     |█████████████████████           | 6.6MB 72kB/s eta 0:
     |█████████████████████           | 6.6MB 72kB/s eta 0:
     |█████████████████████           | 6.6MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 72kB/s eta 0:
     |█████████████████████           | 6.7MB 92kB/s eta 0:
     |█████████████████████▌          | 6.7MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |█████████████████████▌          | 6.8MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 92kB/s eta 0
     |██████████████████████          | 6.9MB 187kB/s eta
     |██████████████████████          | 6.9MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.0MB 187kB/s eta
     |██████████████████████          | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.1MB 187kB/s eta
     |██████████████████████▌         | 7.2MB 187kB/s eta
     |███████████████████████         | 7.2MB 187kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.4MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.2MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.3MB 226kB/s eta
     |███████████████████████         | 7.4MB 226kB/s eta
     |███████████████████████         | 7.4MB 226kB/s eta
     |███████████████████████         | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.4MB 32kB/s eta
     |███████████████████████▌        | 7.5MB 32kB/s eta
     |███████████████████████▌        | 7.5MB 32kB/s eta
     |███████████████████████▌        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.5MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.6MB 32kB/s eta
     |████████████████████████        | 7.7MB 32kB/s eta
     |████████████████████████        | 7.7MB 32kB/s eta
     |████████████████████████        | 7.7MB 32kB/s eta
     |████████████████████████        | 7.7MB 32kB/s eta
     |████████████████████████▌       | 7.7MB 32kB/s et
     |████████████████████████▌       | 7.7MB 32kB/s et
     |████████████████████████▌       | 7.7MB 32kB/s et
     |████████████████████████▌       | 7.7MB 32kB/s et
     |████████████████████████▌       | 7.7MB 32kB/s et
     |████████████████████████▌       | 7.8MB 32kB/s et
     |████████████████████████▌       | 7.8MB 32kB/s et
     |████████████████████████▌       | 7.8MB 32kB/s et
     |████████████████████████▌       | 7.8MB 32kB/s et
     |████████████████████████▌       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.8MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 7.9MB 32kB/s et
     |█████████████████████████       | 8.0MB 32kB/s et
     |█████████████████████████       | 8.0MB 411kB/s e
     |█████████████████████████       | 8.0MB 411kB/s e
     |█████████████████████████       | 8.0MB 411kB/s e
     |█████████████████████████       | 8.0MB 411kB/s e
     |█████████████████████████       | 8.0MB 411kB/s e
     |█████████████████████████▌      | 8.0MB 411kB/s
     |█████████████████████████▌      | 8.0MB 411kB/s
     |█████████████████████████▌      | 8.0MB 411kB/s
     |█████████████████████████▌      | 8.0MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |█████████████████████████▌      | 8.1MB 411kB/s
     |██████████████████████████      | 8.1MB 411kB/s
     |██████████████████████████      | 8.1MB 411kB/s
     |██████████████████████████      | 8.1MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.2MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████      | 8.3MB 411kB/s
     |██████████████████████████▌     | 8.3MB 298kB/s
     |██████████████████████████▌     | 8.3MB 52kB/s
     |██████████████████████████▌     | 8.3MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |██████████████████████████▌     | 8.4MB 52kB/s
     |███████████████████████████     | 8.4MB 52kB/s
     |███████████████████████████     | 8.4MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.5MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 52kB/s
     |███████████████████████████     | 8.6MB 89kB/s
     |███████████████████████████     | 8.6MB 89kB/s
     |███████████████████████████▌    | 8.6MB 89kB/s
     |███████████████████████████▌    | 8.7MB 89kB/s
     |███████████████████████████▌    | 8.7MB 89kB/s
     |███████████████████████████▌    | 8.7MB 89kB/s
     |███████████████████████████▌    | 8.7MB 89kB/s
     |███████████████████████████▌    | 8.7MB 89kB/s
     |███████████████████████████▌    | 8.7MB 44kB/s
     |███████████████████████████▌    | 8.7MB 44kB/s
     |███████████████████████████▌    | 8.7MB 44kB/s
     |███████████████████████████▌    | 8.7MB 44kB/s
     |███████████████████████████▌    | 8.7MB 44kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 66kB/s
     |████████████████████████████    | 8.8MB 69kB/s
     |████████████████████████████    | 8.8MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 69kB/s
     |████████████████████████████    | 8.9MB 97kB/s
     |████████████████████████████    | 8.9MB 97kB/s
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.0MB 97kB/
     |████████████████████████████▌   | 9.1MB 97kB/
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.1MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 109kB
     |█████████████████████████████   | 9.2MB 113kB
     |█████████████████████████████   | 9.2MB 113kB
     |█████████████████████████████   | 9.2MB 113kB
     |█████████████████████████████   | 9.2MB 113kB
     |█████████████████████████████   | 9.3MB 113kB
     |█████████████████████████████   | 9.3MB 113kB
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.3MB 113k
     |█████████████████████████████▌  | 9.4MB 113k
     |█████████████████████████████▌  | 9.4MB 113k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.4MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.5MB 160k
     |██████████████████████████████  | 9.6MB 131k
     |██████████████████████████████  | 9.6MB 131k
     |██████████████████████████████  | 9.6MB 131k
     |██████████████████████████████  | 9.6MB 131k
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.6MB 131
     |██████████████████████████████▌ | 9.7MB 131
     |██████████████████████████████▌ | 9.7MB 131
     |██████████████████████████████▌ | 9.7MB 131
     |██████████████████████████████▌ | 9.7MB 131
     |███████████████████████████████ | 9.7MB 131
     |███████████████████████████████ | 9.7MB 139
     |███████████████████████████████ | 9.7MB 139
     |███████████████████████████████ | 9.7MB 139
     |███████████████████████████████ | 9.7MB 139
     |███████████████████████████████ | 9.7MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.8MB 139
     |███████████████████████████████ | 9.9MB 139
     |███████████████████████████████ | 9.9MB 139
     |███████████████████████████████ | 9.9MB 139
     |███████████████████████████████ | 9.9MB 182
     |███████████████████████████████ | 9.9MB 182
     |███████████████████████████████ | 9.9MB 182
     |███████████████████████████████▌| 9.9MB 18
     |███████████████████████████████▌| 9.9MB 61
     |███████████████████████████████▌| 9.9MB 20
     |███████████████████████████████▌| 9.9MB 20
     |███████████████████████████████▌| 10.0MB 2
     |███████████████████████████████▌| 10.0MB 1
     |███████████████████████████████▌| 10.0MB 1
     |███████████████████████████████▌| 10.0MB 1
     |███████████████████████████████▌| 10.0MB 1
     |███████████████████████████████▌| 10.0MB 1
     |████████████████████████████████| 10.0MB 1
     |████████████████████████████████| 10.0MB 1
     |████████████████████████████████| 10.0MB 1
     |████████████████████████████████| 10.0MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
     |████████████████████████████████| 10.1MB 1
4kB/s
Installing collected packages: pycryptodome
Successfully installed pycryptodome-3.9.4
WARNING: You are using pip version 19.2.3, however version 20.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' comm
and.

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>python wrapper_cli.py -h
Traceback (most recent call last):
  File "wrapper_cli.py", line 6, in <module>
    from tencent_edu import wrapper
  File "E:\tencent-edu-wrapper\tencent-edu-wrapper-master\tencent_edu.py", line
10, in <module>
    from pyexcel_xls import save_data
ModuleNotFoundError: No module named 'pyexcel_xls'

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>

 

(请注意,这个库作者没有提到安装,应该是他默认/已经安装了!)

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>pip install pyexcel_xls
Collecting pyexcel_xls
  Using cached https://files.pythonhosted.org/packages/74/39/43be0b99c2c0534690a
97afa723b6cc39dd5fa4b0e71b865bcc4e1455fc0/pyexcel_xls-0.5.8-py2.py3-none-any.whl

Collecting xlrd (from pyexcel_xls)
  Using cached https://files.pythonhosted.org/packages/b0/16/63576a1a001752e34bf
8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl
Collecting xlwt (from pyexcel_xls)
  Using cached https://files.pythonhosted.org/packages/44/48/def306413b25c3d0175
3603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl
Collecting pyexcel-io>=0.5.3 (from pyexcel_xls)
  Using cached https://files.pythonhosted.org/packages/50/96/4fd9f1fac8aae6f4f66
609c5520b3611bceb631a52a4f6d00c8c4c440270/pyexcel_io-0.5.20-py2.py3-none-any.whl

Collecting lml>=0.0.4 (from pyexcel-io>=0.5.3->pyexcel_xls)
  Using cached https://files.pythonhosted.org/packages/90/e5/eaa5a1c8a9adbac956d
aa6027789ff13e30362a03cc0d010d88bd867c73f/lml-0.0.9-py2.py3-none-any.whl
Installing collected packages: xlrd, xlwt, lml, pyexcel-io, pyexcel-xls
Successfully installed lml-0.0.9 pyexcel-io-0.5.20 pyexcel-xls-0.5.8 xlrd-1.2.0
xlwt-1.3.0
WARNING: You are using pip version 19.2.3, however version 20.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' comm
and.

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>python wrapper_cli.py -h
usage: wrapper_cli.py [-h] [-f FILE] [-r DIRECTORY] [-o EXPORT_DIR]
                      [-m META_FILE_NAME]

A AES-128 decrypter of Tencent-edu Android app, for offline-downloaded videos.

optional arguments:
  -h, --help            show this help message and exit
  -f FILE, --file FILE  run in file mode and set filename
  -r DIRECTORY, --directory DIRECTORY
                        run directory mode and set directory
  -o EXPORT_DIR, --output EXPORT_DIR
                        dir to export, default is current workspace
  -m META_FILE_NAME, --meta META_FILE_NAME
                        specify the filename of metadata file(.xls)

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>


E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>dir
 驱动器 E 中的卷是 UBUNTU
 卷的序列号是 0001-A670

 E:\tencent-edu-wrapper\tencent-edu-wrapper-master 的目录

2020/01/24 周五  12:05    <DIR>          .
2020/01/24 周五  12:05    <DIR>          ..
2019/11/05 周二  00:14             2,044 README.md
2019/11/05 周二  00:14             9,462 tencent_edu.py
2020/01/24 周五  12:04       148,078,592 test.m3u8.sqlite
2019/11/05 周二  00:14             1,583 wrapper_cli.py
2019/11/05 周二  00:14             1,240 wrapper_prompt.py
2020/01/24 周五  16:12    <DIR>          __pycache__
               5 个文件    148,092,921 字节
               3 个目录 26,955,689,984 可用字节

 

问题2:

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>
E:\tencent-edu-wrapper\tencent-edu-wrapper-master>python wrapper_cli.py -f test.
m3u8.sqlite
Traceback (most recent call last):
  File "wrapper_cli.py", line 21, in <module>
    w.auto_filter = args.auto_filter  # 设置开启自动分类功能的标志位
AttributeError: 'Namespace' object has no attribute 'auto_filter'

E:\tencent-edu-wrapper\tencent-edu-wrapper-master>

 

修改:(增加一行auto_filter的参数:)

C:\tencent-edu-wrapper-master\wrapper_cli.py

parser = argparse.ArgumentParser(
    description='A AES-128 decrypter of Tencent-edu Android app, for offline-downloaded videos.')
parser.add_argument('-f', '--file', dest='file', help='run in file mode and set filename', default=None)
parser.add_argument('-r', '--directory', dest='directory', help='run directory mode and set directory', default=None)
parser.add_argument('-o', '--output', dest='export_dir', help='dir to export, default is current workspace',
                    default='.')
parser.add_argument('-m', '--meta', dest='meta_file_name', help='specify the filename of metadata file(.xls)',
                    default=None)

parser.add_argument('-a', '--auto_filter', dest='auto_filter', help='auto_filter', default=None)

 

 

 

 

问题3:

C:\tencent-edu-wrapper-master>
C:\tencent-edu-wrapper-master>python wrapper_cli.py -f test.m3u8.sqlite
Traceback (most recent call last):
  File "wrapper_cli.py", line 31, in <module>
    w.process_db_file(db_filename=args.file)
  File "C:\tencent-edu-wrapper-master\tencent_edu.py", line 206, in process_db_f
ile
    meta_this = self.__fetch_one_metadata(filename=db_filename)
  File "C:\tencent-edu-wrapper-master\tencent_edu.py", line 99, in __fetch_one_m
etadata
    result = [os.path.split(filename)[1], ex.tokens['uin'][0], ex.tokens['term_i
d'][0], ex.tokens['ext'][0]]
KeyError: 'ext'

C:\tencent-edu-wrapper-master>

 

修改:(干掉参数:, ex.tokens['ext'][0]])

C:\tencent-edu-wrapper-master\tencent_edu.py

讲第99行:

result = [os.path.split(filename)[1], ex.tokens['uin'][0], ex.tokens['term_id'][0], ex.tokens['ext'][0]]

修改为:

result = [os.path.split(filename)[1], ex.tokens['uin'][0], ex.tokens['term_id'][0]]

 

 

 

C:\tencent-edu-wrapper-master>
C:\tencent-edu-wrapper-master>python wrapper_cli.py -f test.m3u8.sqlite
[+]     target on test.m3u8.sqlite
[+]     export to test.ts in 16122.92ms

C:\tencent-edu-wrapper-master>
C:\tencent-edu-wrapper-master>dir
 驱动器 C 中的卷是 WIN7
 卷的序列号是 0006-07CC

 C:\tencent-edu-wrapper-master 的目录

2020/01/26 周日  22:36    <DIR>          .
2020/01/26 周日  22:36    <DIR>          ..
2020/01/26 周日  22:36    <DIR>          100346356
2019/11/05 周二  00:14             2,044 README.md
2020/01/26 周日  22:36             9,556 tencent_edu.py
2020/01/24 周五  12:04       148,078,592 test.m3u8.sqlite
2020/01/26 周日  22:31             1,685 wrapper_cli.py
2019/11/05 周二  00:14             1,240 wrapper_prompt.py
2020/01/26 周日  22:36    <DIR>          __pycache__
               5 个文件    148,093,117 字节
               4 个目录 42,211,602,432 可用字节

C:\tencent-edu-wrapper-master>

 

生成的文件在:

C:\tencent-edu-wrapper-master\100346356\test.ts

 

射手播放器播放不了。

只能使用PotPlayer64_20191011.7z播放了!

 

 

 

全部素材链接:

链接:https://pan.baidu.com/s/1V5hRQe5eecKY9boyWz2fgw 
提取码:veto

 

标签:00,MB,app,离线,wrapper,eta,视频格式,edu,tencent
来源: https://www.cnblogs.com/wb4916/p/12235410.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有