From 40e9899062ff03fe240079b5efbe4ca7fe1cc733 Mon Sep 17 00:00:00 2001 From: yawwwwwn <40122222+yawwwwwn@users.noreply.github.com> Date: Fri, 19 Apr 2019 22:05:43 +0800 Subject: [PATCH 1/2] Avoid file overwritten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 批量下载视频时,如果保存路径相同的文件同名,则先下载好的文件会被覆盖,而最终只留下一个。 所以对同名视频加上后缀,以分别保存。 --- amemv-video-ripper.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/amemv-video-ripper.py b/amemv-video-ripper.py index 8ef7d3e..2853d60 100644 --- a/amemv-video-ripper.py +++ b/amemv-video-ripper.py @@ -70,6 +70,14 @@ def download(medium_type, uri, medium_url, target_folder): localSize = os.path.getsize(file_path) if remoteSize == localSize: return + tem_file_path = file_path + suffix = 0 + while os.path.isfile(tem_file_path): + suffix += 1 + tem_file_name = file_name.rsplit('.', 1)[0] + '_' + str(suffix) + '.' + file_name.rsplit('.', 1)[1] + tem_file_path = os.path.join(target_folder, tem_file_name) + file_path = tem_file_path + print("Downloading %s from %s.\n" % (file_name, medium_url)) retry_times = 0 while retry_times < RETRY: From bdd4b92e5e9ceb04dc8c0f67d3f59f331a0eae9e Mon Sep 17 00:00:00 2001 From: yawwwwwn <40122222+yawwwwwn@users.noreply.github.com> Date: Fri, 23 Aug 2019 00:08:03 +0800 Subject: [PATCH 2/2] Rename file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 卑微 Windows 用户会因视频文件名中有英文问号 `?` 等而报错 `OSError(22, 'Invalid argument')`。 进一步优化后缀的添加,并结合原本的文件大小检查避免重复下载。 --- amemv-video-ripper.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/amemv-video-ripper.py b/amemv-video-ripper.py index ddb00b9..3a853a0 100644 --- a/amemv-video-ripper.py +++ b/amemv-video-ripper.py @@ -34,6 +34,16 @@ DOWNLOAD_FAVORITE = False +def check_name(string): + """ + Replace forbidden characters in file name. Otherwise "OSError(22, 'Invalid argument')". + """ + block_list = ['\\', '/', ':', '?', '"', '<', '>', '|'] + for char in block_list: + string = string.replace(char, '-') + return string + + def getRemoteFileSize(url, proxy=None): ''' 通过content-length头获取远程文件大小 @@ -57,29 +67,29 @@ def download(medium_type, uri, medium_url, target_folder): headers = copy.deepcopy(HEADERS) file_name = uri if medium_type == 'video': - file_name += '.mp4' + ext = '.mp4' headers['user-agent'] = 'Aweme/63013 CFNetwork/978.0.7 Darwin/18.6.0' elif medium_type == 'image': - file_name += '.jpg' + ext = '.jpg' file_name = file_name.replace("/", "-") else: return - file_path = os.path.join(target_folder, file_name) - if os.path.isfile(file_path): - remoteSize = getRemoteFileSize(medium_url) + remoteSize = getRemoteFileSize(medium_url) + file_name = check_name(file_name) + file_path = os.path.join(target_folder, file_name+ext) + suffix = 0 + while os.path.isfile(file_path): localSize = os.path.getsize(file_path) if remoteSize == localSize: return - tem_file_path = file_path - suffix = 0 - while os.path.isfile(tem_file_path): suffix += 1 - tem_file_name = file_name.rsplit('.', 1)[0] + '_' + str(suffix) + '.' + file_name.rsplit('.', 1)[1] - tem_file_path = os.path.join(target_folder, tem_file_name) - file_path = tem_file_path + temp_file_name = file_name + '_' + str(suffix) + file_path = os.path.join(target_folder, temp_file_name+ext) - print("Downloading %s from %s.\n" % (file_name, medium_url)) + # To reserve suffix so that distinguish the videos with same title + # but not to show replacement of forbidden chars so that closer to original meaning(e.g. question mark '?') + print("Downloading %s from %s.\n" % (uri+'_'+str(suffix)+ext if suffix else uri+ext, medium_url)) retry_times = 0 while retry_times < RETRY: try: