diff --git a/.gitignore b/.gitignore index 1605617..20fbb6c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ __pycache__/ !requirements.txt *.json Temp/ +*.dll +*.so diff --git a/readset.py b/readset.py index be603d8..5066137 100644 --- a/readset.py +++ b/readset.py @@ -40,8 +40,11 @@ class settings: self._maxRetryCount = int(d['maxRetryCount']) if 'maxRetryCount' in d and d['maxRetryCount'].isnumeric( ) and int(d['maxRetryCount']) >= 0 else 3 self._telegramBotApiServer = d['telegramBotApiServer'] if 'telegramBotApiServer' in d else 'https://api.telegram.org' - self._downloadMediaFile = bool(int(d['downloadMediaFile'])) if 'downloadMediaFile' in d and d['downloadMediaFile'].isnumeric() else False - self._sendFileURLScheme = bool(int(d['sendFileURLScheme'])) if 'sendFileURLScheme' in d and d['sendFileURLScheme'].isnumeric() else False + self._downloadMediaFile = bool(int( + d['downloadMediaFile'])) if 'downloadMediaFile' in d and d['downloadMediaFile'].isnumeric() else False + self._sendFileURLScheme = bool(int( + d['sendFileURLScheme'])) if 'sendFileURLScheme' in d and d['sendFileURLScheme'].isnumeric() else False + self._rssbotLib = d['rssbotLib'] if 'rssbotLib' in d and d['rssbotLib'] != '' else None class commandline: diff --git a/rssbot.py b/rssbot.py index ade015f..1f54c3d 100644 --- a/rssbot.py +++ b/rssbot.py @@ -35,6 +35,7 @@ from usercheck import checkUserPermissionsInChat, UserPermissionsInChatCheckResu import sys from fileEntry import FileEntries, remove from dictdeal import json2data +from rssbotlib import loadRSSBotLib def getMediaInfo(m: dict, config: RSSConfig = RSSConfig()) -> str: @@ -321,11 +322,50 @@ class main: di2['parse_mode'] = 'HTML' di['media'].append(di2) ind = ind + 1 - if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: - re = self._request('sendMediaGroup', 'post', json=di) - else: - re = self._request('sendMediaGroup', 'post', - json=di, files=di3) + if len(di['media']) > 1: + if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: + re = self._request('sendMediaGroup', 'post', json=di) + else: + re = self._request( + 'sendMediaGroup', 'post', json=di, files=di3) + if len(di['media']) == 1: + if di['media'][0]['type'] == 'photo': + if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: + di['photo'] = di['media'][0]['media'] + else: + mekey = di['media'][0]['media'][9:] + di3['photo'] = di3[mekey] + del di3[mekey] + del di['media'] + if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: + re = self._request('sendPhoto', 'post', json=di) + else: + re = self._request('sendPhoto', 'post', json=di, files=di3) + elif di['media'][0]['type'] == 'video': + if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: + di['video'] = di['media'][0]['media'] + if 'thumb' in di['media'][0]: + di['thumb'] = di['media'][0]['thumb'] + else: + mekey = di['media'][0]['media'][9:] + di3['video'] = di3[mekey] + del di3[mekey] + if 'thumb' in di['media'][0]: + mekey = di['media'][0]['thumb'][9:] + di3['thumb'] = di3[mekey] + del di3[mekey] + if 'duration' in di['media'][0]: + di['duration'] = di['media'][0]['duration'] + if 'width' in di['media'][0]: + di['width'] = di['media'][0]['width'] + if 'height' in di['media'][0]: + di['height'] = di['media'][0]['height'] + di['supports_streaming'] = di['media'][0]['supports_streaming'] + del di['media'] + if not self._setting._downloadMediaFile or self._setting._sendFileURLScheme: + re = self._request('sendVideo', 'post', json=di) + else: + re = self._request('sendVideo', 'post', json=di, files=di3) if re is not None and 'ok' in re and re['ok']: if returnError: return True, '' @@ -379,6 +419,7 @@ class main: if self._me is None or 'ok' not in self._me or not self._me['ok']: print('无法读取机器人信息') self._me = self._me['result'] + self._rssbotLib = loadRSSBotLib(self._setting._rssbotLib) self._upi = None self._updateThread = updateThread(self) self._updateThread.start() diff --git a/rssbotlib.py b/rssbotlib.py new file mode 100644 index 0000000..071977a --- /dev/null +++ b/rssbotlib.py @@ -0,0 +1,64 @@ +# (C) 2021 lifegpc +# This file is part of rssbot. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +from ctypes import Structure, c_bool, c_uint64, c_char_p, CDLL, c_ushort, c_uint16, c_int + + +class BasicInfo(Structure): + _fields_ = [("ok", c_bool), ("duration", c_uint64), ("bit_rate", c_uint64), ("has_h264", c_bool), ("has_aac", c_bool), ("mime_type", c_char_p), ("type_long_name", c_char_p), + ("type_name", c_char_p), ("video_stream_count", c_uint16), ("audio_stream_count", c_uint16), ("subtitle_stream_count", c_uint16), ("width", c_int), ("height", c_int)] + + +class BasicInfoC: + def __init__(self, data: BasicInfo): + self._duration = data.duration if data.duration > 0 else None + self._bitRate = data.bit_rate if data.bit_rate > 0 else None + self._hasH264 = data.has_h264 + self._hasAAC = data.has_aac + self._mimeType = data.mime_type.decode() if data.mime_type is not None else None + self._typeLongName = data.type_long_name.decode( + ) if data.type_long_name is not None else None + self._typeName = data.type_name.decode() if data.type_name is not None else None + self._videoStreamCount = data.video_stream_count + self._audioStreamCount = data.audio_stream_count + self._subtitleStreamCount = data.subtitle_stream_count + self._width = data.width if data.width > 0 else None + self._height = data.height if data.height > 0 else None + + +class RSSBotLib: + def __init__(self, lib: CDLL): + self._lib = lib + self._getBasicInfo = self._lib.getBasicInfo + self._getBasicInfo.restype = BasicInfo + + def getBasicInfo(self, url: str) -> (bool, BasicInfoC): + try: + d: BasicInfo = self._getBasicInfo(url.encode()) + if d.ok: + return True, BasicInfoC(d) + return False, None + except: + return False, None + + +def loadRSSBotLib(loc: str): + if loc is None: + return None + try: + lib = CDLL(loc) + return RSSBotLib(lib) + except: + return None