prcwcy / sjtu-canvas-video-download

SJTU Canvas 视频 (批量) 下载器
79 stars 11 forks source link

关于选择“只下载录像(不下载录屏)”后仍有可能只下载到录屏的问题 #1

Closed zqy1018 closed 2 years ago

zqy1018 commented 2 years ago

如题,我在下载时某个课的课程录像时遇到了这一问题。我希望只下载到对黑板的录像,而不是对教室电脑的录屏。

我观察到 sjtu_canvas_video.py 中获取课程信息时,JSON 形式的课程信息中 rtmpUrlHdv 条目对应的视频未必是录像。该条目对应的视频地址似乎可以是 videoPlayResponseVoList 这一列表中的任意一个。

具体而言,下面就是我在下载这门课的录像时返回的课程信息(通过在 sjtu_canvas_video_downloader_frame.py 文件下 get_course_links_filenames 函数中 print(course) 得到)。在选择“只下载录像(不下载录屏)”后我下载的第 16 讲和第 17 讲的视频都是录屏,只有第 18 讲是录像。

{'id': 1512085, 'courId': 1127989, 'videSource': 3, 'smseId': 1, 'videVodId': 2168239, 'cminId': 1, 'deviPuid': '5bd324408b5f4a10afdb46b885dc9626', 'videRecordChannelNum': 0, 'videBeginTime': '2021-10-26 12:50:00', 'videEndTime': '2021-10-26 13:45:00', 'videPlayTime': 3300, 'videName': '计算理论(第16讲)', 'videPlayCount': 0, 'videCommentCount': 0, 'videCommentAverage': 0.0, 'videSrtUrl': None, 'remarks': None, 'courTimes': 16, 'courName': '计算理论(第16讲)', 'organizationName': '电子信息与电气工程学院', 'subjId': 18034, 'clroId': None, 'clroName': None, 'userId': 7409, 'userName': 'Dominik Alban Scheder', 'subjName': '计算理论', 'teclName': '计算理论', 'teclId': 40348, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320004363/0_1635223800-1635227100.mp4?key=1635858898-40095-281723cee0c7e4073b2ea99f4126d462', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'userAvatar': '/api/static/user/avatar/1', 'videoDeviceViewResponseVoList': [], 'videoPlayResponseVoList': 
    [{'id': 1512088, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320003618/0_1635250618-1635253917.mp4?key=1635858898-40095-debe70fa418e950e849d5fed69eed328', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 0}, 
    {'id': 1512085, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320004363/0_1635223800-1635227100.mp4?key=1635858898-40095-281723cee0c7e4073b2ea99f4126d462', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 3}]
    , 'loginUserId': 40095, 'videBeginTimeMs': 1635223800000, 'videEndTimeMs': 1635227100000}
{'id': 1513074, 'courId': 1128156, 'videSource': 3, 'smseId': 1, 'videVodId': 2169160, 'cminId': 1, 'deviPuid': '5bd324408b5f4a10afdb46b885dc9626', 'videRecordChannelNum': 0, 'videBeginTime': '2021-10-26 13:55:00', 'videEndTime': '2021-10-26 14:50:00', 'videPlayTime': 3300, 'videName': '计算理论(第17讲)', 'videPlayCount': 0, 'videCommentCount': 0, 'videCommentAverage': 0.0, 'videSrtUrl': None, 'remarks': None, 'courTimes': 17, 'courName': '计算理论(第17讲)', 'organizationName': '电子信息与电气工程学院', 'subjId': 18034, 'clroId': None, 'clroName': None, 'userId': 7409, 'userName': 'Dominik Alban Scheder', 'subjName': '计算理论', 'teclName': '计算理论', 'teclId': 40348, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320004363/0_1635227700-1635231000.mp4?key=1635858898-40095-7b9110522e78486f9459b5c756b75ddb', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'userAvatar': '/api/static/user/avatar/1', 'videoDeviceViewResponseVoList': [], 'videoPlayResponseVoList': 
    [{'id': 1513076, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320003618/0_1635256089-1635259390.mp4?key=1635858898-40095-696358ff4387a20841bd94999e7eb816', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 0}, 
    {'id': 1513074, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320004363/0_1635227700-1635231000.mp4?key=1635858898-40095-7b9110522e78486f9459b5c756b75ddb', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 3}], 
    'loginUserId': 40095, 'videBeginTimeMs': 1635227700000, 'videEndTimeMs': 1635231000000}
{'id': 1513719, 'courId': 1128421, 'videSource': 3, 'smseId': 1, 'videVodId': 2170603, 'cminId': 1, 'deviPuid': 'bc98475816644908a667c1fe599e1147', 'videRecordChannelNum': 0, 'videBeginTime': '2021-10-26 14:50:00', 'videEndTime': '2021-10-26 15:45:00', 'videPlayTime': 3300, 'videName': '计算理论(第18讲)', 'videPlayCount': 0, 'videCommentCount': 0, 'videCommentAverage': 0.0, 'videSrtUrl': None, 'remarks': None, 'courTimes': 18, 'courName': '计算理论(第18讲)', 'organizationName': '电子信息与电气工程学院', 'subjId': 18034, 'clroId': None, 'clroName': None, 'userId': 7409, 'userName': 'Dominik Alban Scheder', 'subjName': '计算理论', 'teclName': '计算理论', 'teclId': 40348, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320003618/0_1635261201-1635264502.mp4?key=1635858898-40095-bc096d16e9816716b328dfdd6ecc93f5', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'userAvatar': '/api/static/user/avatar/1', 'videoDeviceViewResponseVoList': [], 'videoPlayResponseVoList': 
    [{'id': 1513719, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320003618/0_1635261201-1635264502.mp4?key=1635858898-40095-bc096d16e9816716b328dfdd6ecc93f5', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 0}, 
    {'id': 1513720, 'videPlayTime': 3300, 'clientIpType': 0, 'rtmpUrlHdv': 'http://live.sjtu.edu.cn/vod/31011200112000000000/31011200111320004363/0_1635261204-1635264504.mp4?key=1635858898-40095-e3d600c8944f17c2b4066f22d66cb5e8', 'rtmpUrlFluency': None, 'rtmpUrlDistinct': None, 'rtmpUrlDefault': None, 'cdviChannelNum': 0, 'cdviViewNum': 3}], 
    'loginUserId': 40095, 'videBeginTimeMs': 1635231000000, 'videEndTimeMs': 1635234300000}

我猜测需要用 cdviViewNum 判断是录像还是录屏,上面例子中录像对应的 cdviViewNum 为 0,录屏为 3。

prcwcy commented 2 years ago

已阅. 但我估计最近不会修. :joy:

zqy1018 commented 2 years ago

我可以提交一个 PR,按照上面的判断 cdviViewNum 的想法修掉,只是不确定这个猜想是否正确🤔

prcwcy commented 2 years ago

可以的