import os.path import re import time from hanziconv import HanziConv import datetime from pytube import YouTube import ssl import subprocess import utils.Logger from dateutil import parser import base64 import tkinter as tk # import io # from PIL import Image # from dateutil.relativedelta import relativedelta ssl._create_default_https_context = ssl._create_stdlib_context def get_screen_resolution(): try: root = tk.Tk() screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() root.destroy() # 关闭tkinter窗口 return screen_width, screen_height except tk.TclError as e: print("无法获取屏幕分辨率:", e) return 1920, 1080 def save_base64_image(base64_string, file_path): try: # 解码base64数据 image_data = base64.b64decode(base64_string.split(',')[1]) # 将解码后的数据写入图片文件 with open(file_path, "wb") as file: file.write(image_data) # print(f"图片下载成功:{save_path}") return True except Exception as e: print(f"图片下载失败:{file_path}") return False def is_base64_image(url): pattern = re.compile(r'^data:image\/[a-z]+;base64,') return bool(pattern.match(url)) # 转换 facebook 的时间 def parse_time_string(time_str): """ :param time_str: :return: """ # log.debug(f'转换face4book的发布时间:{time_str}') if "天" in time_str: number = int(time_str.split("天")[0]) time_delta = datetime.timedelta(days=number) return int((datetime.datetime.now() + time_delta).timestamp()) elif "分钟" in time_str: number = int(time_str.split("分钟")[0]) time_delta = datetime.timedelta(minutes=number) return int((datetime.datetime.now() + time_delta).timestamp()) elif "小时" in time_str: number = int(time_str.split("小时")[0]) time_delta = datetime.timedelta(hours=number) return int((datetime.datetime.now() + time_delta).timestamp()) else: try: datetime_str = time_str.replace("月", " ").replace("日", "") month, day = map(int, datetime_str.split()) current_year = datetime.datetime.now().year datetime_obj = datetime.datetime(year=current_year, month=month, day=day) return int(datetime_obj.timestamp()) except ValueError: return None # 转换 youtube 的时间 def convert_string_to_time(string): """ :param string: :return: """ current_time = datetime.now() if "天前" in string: days = int(string.split("天前")[0]) converted_time = current_time - datetime.timedelta(days=days) elif "周前" in string: weeks = int(string.split("周前")[0]) converted_time = current_time - datetime.timedelta(weeks=weeks) elif "月前" in string: cleaned_string = re.sub(r'\D', '', string.split("月前")[0]) months = int(cleaned_string) converted_time = current_time - datetime.timedelta(days=months * 30) elif "年前" in string: years = int(string.split("年前")[0]) converted_time = current_time - datetime.timedelta(days=years * 365) else: raise ValueError("Invalid string format") timestamp = int(converted_time.timestamp()) return timestamp # 转换 twitter 的时间 def parse_twitter_time_string(time_str): """ :param time_str: :return: """ times = parser.parse(time_str, fuzzy=True) # a = datetime.datetime.strptime(time,"%Y-%m-%d %H:%M:%S") b = datetime.datetime.strftime(times, "%Y-%m-%d %H:%M:%S") c = time.mktime(time.strptime(b, "%Y-%m-%d %H:%M:%S")) # 解析相对时间字符串 return c def convert_to_traditional(simplified_text): """ 将简体中文文本转换为繁体中文文本。 Args: simplified_text (str): 要转换的简体中文文本。 Returns: str: 转换后的繁体中文文本。 """ # converter = opencc.OpenCC('s2t.json') # 创建简体中文到繁体中文的转换器 traditional_text = HanziConv.toTraditional(simplified_text) # 进行转换 return traditional_text def pytube_download(link, file_dir): """ 下载指定链接的 YouTube 视频并保存到指定目录。 参数: - link: 字符串,YouTube 视频的链接。 - file_dir: 字符串,视频保存的目录路径。 返回值: - 如果下载成功,则返回 True。 - 如果下载失败,则返回 False。 """ yt = YouTube(link) # 创建 YouTube 对象 # yt.register_on_complete_callback(callback) yt.streams.filter(progressive=True, file_extension='mp4') # 过滤指定条件的视频流 steam = yt.streams.get_by_itag(22) # 获取指定标签的视频流 try: steam.download(file_dir) # 下载视频并保存到指定目录 return True except: print("下载失败") # 捕获下载异常并输出错误信息 return False def yt_dlp_download(url, name): file_dir = os.path.abspath("../") network_options = f'-o "{os.path.join(file_dir, "network-assets-reptile", "reptile_data", name, "%(id)s.%(ext)s")}"' # 清晰度 # definition = f'18' # 360p # definition = f'18' # 720p # definition = f'24' # 1080p # f'-f 18 -vU' download_options = f'-f mp4' # 要执行的 shell 命令 command = f'yt-dlp -v {download_options} {network_options} --verbose -- {url}' # print(command) # 使用 subprocess 调用 shell 命令 result = subprocess.run(command, shell=True, capture_output=True, text=True) # 检查命令执行结果 if result.returncode == 0: # 命令成功执行,输出结果 # log.debug(str(result.stdout)) return True else: # 命令执行失败,输出错误信息 # log.debug(str(result.stderr)) return False