原文有两个错误,我将会在这里修正!!!!
22:05 2020/1/26 星期日
腾讯课堂app 离线视频格式破解——完结
之前因为温习3dsmax,在腾讯课堂app上缓存了不少的视频,因为缓存在手机观看屏幕比较小,一直想把缓存的视频转移到PC上看,对于我这种信号时有时无的人来说,手机是最好的找信号工具,故视频缓存在手机上了。
先放完整代码和转换结果:
# _*_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表。
这印证了之前的推测,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