index.py 5.88 KB
Newer Older
liyang's avatar
liyang committed
1
import os.path
liyang's avatar
liyang committed
2
import re
liyang's avatar
liyang committed
3 4
import time

liyang's avatar
liyang committed
5
from hanziconv import HanziConv
liyang's avatar
liyang committed
6
import datetime
liyang's avatar
liyang committed
7 8 9
from pytube import YouTube
import ssl
import subprocess
liyang's avatar
liyang committed
10
import utils.Logger
11
from dateutil import parser
liyang's avatar
liyang committed
12 13
import base64
import tkinter as tk
liyang's avatar
liyang committed
14 15
# import io
# from PIL import Image
16

liyang's avatar
liyang committed
17
# from dateutil.relativedelta import relativedelta
liyang's avatar
liyang committed
18 19 20 21

ssl._create_default_https_context = ssl._create_stdlib_context


liyang's avatar
liyang committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
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))


53 54 55 56 57 58 59
# 转换 facebook 的时间
def parse_time_string(time_str):
    """

    :param time_str:
    :return:
    """
60
    # log.debug(f'转换face4book的发布时间:{time_str}')
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
    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("日", "")
76
            month, day = map(int, datetime_str.split())
77
            current_year = datetime.datetime.now().year
78
            datetime_obj = datetime.datetime(year=current_year, month=month, day=day)
79 80 81 82 83 84
            return int(datetime_obj.timestamp())
        except ValueError:
            return None


# 转换 youtube 的时间
liyang's avatar
liyang committed
85 86 87 88 89 90 91 92 93 94
def convert_string_to_time(string):
    """

    :param string:
    :return:
    """
    current_time = datetime.now()

    if "天前" in string:
        days = int(string.split("天前")[0])
liyang's avatar
liyang committed
95
        converted_time = current_time - datetime.timedelta(days=days)
liyang's avatar
liyang committed
96 97
    elif "周前" in string:
        weeks = int(string.split("周前")[0])
liyang's avatar
liyang committed
98
        converted_time = current_time - datetime.timedelta(weeks=weeks)
liyang's avatar
liyang committed
99
    elif "月前" in string:
liyang's avatar
liyang committed
100 101
        cleaned_string = re.sub(r'\D', '', string.split("月前")[0])
        months = int(cleaned_string)
liyang's avatar
liyang committed
102
        converted_time = current_time - datetime.timedelta(days=months * 30)
liyang's avatar
liyang committed
103 104
    elif "年前" in string:
        years = int(string.split("年前")[0])
liyang's avatar
liyang committed
105
        converted_time = current_time - datetime.timedelta(days=years * 365)
liyang's avatar
liyang committed
106 107 108
    else:
        raise ValueError("Invalid string format")

liyang's avatar
liyang committed
109
    timestamp = int(converted_time.timestamp())
liyang's avatar
liyang committed
110 111
    return timestamp

112 113 114 115 116 117 118 119

# 转换 twitter 的时间
def parse_twitter_time_string(time_str):
    """

    :param time_str:
    :return:
    """
liyang's avatar
liyang committed
120 121
    times = parser.parse(time_str, fuzzy=True)
    # a = datetime.datetime.strptime(time,"%Y-%m-%d %H:%M:%S")
liyang's avatar
liyang committed
122 123
    b = datetime.datetime.strftime(times, "%Y-%m-%d %H:%M:%S")
    c = time.mktime(time.strptime(b, "%Y-%m-%d %H:%M:%S"))
124
    # 解析相对时间字符串
liyang's avatar
liyang committed
125
    return c
126 127


liyang's avatar
liyang committed
128 129 130 131 132 133 134 135 136 137
def convert_to_traditional(simplified_text):
    """
    将简体中文文本转换为繁体中文文本。

    Args:
        simplified_text (str): 要转换的简体中文文本。

    Returns:
        str: 转换后的繁体中文文本。
    """
liyang's avatar
liyang committed
138 139
    # converter = opencc.OpenCC('s2t.json')  # 创建简体中文到繁体中文的转换器
    traditional_text = HanziConv.toTraditional(simplified_text)  # 进行转换
liyang's avatar
liyang committed
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
    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")}"'
170
    # 清晰度
171
    # definition = f'18'  # 360p
172 173
    # definition = f'18' # 720p
    # definition = f'24' # 1080p
174 175
    # f'-f 18 -vU'
    download_options = f'-f mp4'
liyang's avatar
liyang committed
176
    # 要执行的 shell 命令
177
    command = f'yt-dlp -v {download_options} {network_options} --verbose -- {url}'
liyang's avatar
liyang committed
178
    # print(command)
liyang's avatar
liyang committed
179 180 181 182 183 184 185 186 187 188 189 190
    # 使用 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