Spaces:
Runtime error
Runtime error
| from functools import partial | |
| import os | |
| from typing import Tuple, Union | |
| from ...utils.path_util import get_dir_file_map, get_path_dct | |
| from ...utils.signature import get_md5sum | |
| def get_video_signature( | |
| path: str, | |
| rename: bool = False, | |
| length: int = None, | |
| signature: str = None, | |
| sep: str = "@", | |
| ) -> Union[str, Tuple[str, str]]: | |
| """视频文件hash值特殊保存方法,name@signature,若hash值与目标长度不符或者不存在,则重新计算,并根据需要是否修改名字 | |
| Args: | |
| path (str): 视频源路径 | |
| rename (bool, optional): 是否对视频源文件重命名. Defaults to False. | |
| length (int, optional): hash值签名长度. Defaults to 8. | |
| signature (str, optional): full signature of path, to avoid recalculate signature. Defaults to `None`. | |
| sep (str, optional): 将hash值嵌入命名的分隔符. Defaults to "@". | |
| Returns: | |
| str: 视频文件hash值 | |
| Tuple[str, str]: 对应的hash签名, 新的视频文件地址, | |
| """ | |
| dirname = os.path.dirname(path) | |
| basename = os.path.basename(path) | |
| filename, ext = os.path.splitext(basename) | |
| file_signature = None | |
| if "@" in filename: | |
| file_signature = filename.split(sep)[-1] | |
| if length is not None and len(file_signature) != length: | |
| file_signature = None | |
| if file_signature is None: | |
| if signature is None: | |
| signature = get_md5sum(path, length=length) | |
| file_signature = signature | |
| if rename: | |
| dst_path = os.path.join( | |
| dirname, "{}@{}{}".format(filename.split(sep)[0], signature, ext) | |
| ) | |
| os.rename(path, dst_path) | |
| path = dst_path | |
| if rename: | |
| return file_signature, path | |
| else: | |
| return file_signature | |
| def split_names_with_signature(basename: str, sep: str = "@") -> str: | |
| """从videoinfo中分离 video的名字,videoinfo的名字是videoname_hash.json | |
| Args: | |
| basename (str): like name_hash | |
| sep (str): like sep | |
| Returns: | |
| str: 视频文件名 | |
| """ | |
| filename = ".".join(basename.split(".")[:-1]) | |
| ext = basename.split(".")[-1] | |
| if sep in filename: | |
| filename = sep.join(filename.split(sep)[:-1]) | |
| return filename, ext | |
| def get_video_map_path_dct( | |
| path: str, mode: int = 1, sep: str = "@", exts=["json"] | |
| ) -> dict: | |
| """遍历目标文件夹及子文件夹下所有视频谱面文件,生成字典。""" | |
| dct = get_path_dct( | |
| path=path, | |
| mode=mode, | |
| sep=sep, | |
| split_func=partial(split_names_with_signature, sep=sep), | |
| exts=exts, | |
| ) | |
| return dct | |
| def get_video_path_dct( | |
| path, mode: int = 1, sep: str = "@", exts=["mp4", "mkv", "ts", "rmvb", "mov"] | |
| ) -> dict: | |
| """遍历目标文件夹及子文件夹下所有视频文件,生成字典。""" | |
| dct = get_path_dct( | |
| path=path, | |
| mode=mode, | |
| sep=sep, | |
| split_func=partial(split_names_with_signature, sep=sep), | |
| exts=exts, | |
| ) | |
| return dct | |
| def get_video_emd_path_dct(path, mode: int = 1, sep: str = "@", exts=["hdf5"]) -> dict: | |
| """遍历目标文件夹及子文件夹下所有视频文件,生成字典。""" | |
| dct = get_path_dct( | |
| path=path, | |
| mode=mode, | |
| sep=sep, | |
| split_func=partial(split_names_with_signature, sep=sep), | |
| exts=exts, | |
| ) | |
| return dct | |