warp-beacon 2.8.14__py3-none-any.whl → 2.8.16__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- warp_beacon/__version__.py +1 -1
- warp_beacon/scraper/__init__.py +1 -1
- warp_beacon/scraper/fail_handler.py +22 -3
- warp_beacon/telegram/bot.py +2 -1
- warp_beacon/telegram/handlers.py +0 -13
- warp_beacon/uploader/__init__.py +48 -73
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/METADATA +1 -1
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/RECORD +12 -12
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/WHEEL +0 -0
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/entry_points.txt +0 -0
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/licenses/LICENSE +0 -0
- {warp_beacon-2.8.14.dist-info → warp_beacon-2.8.16.dist-info}/top_level.txt +0 -0
warp_beacon/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
__version__ = "2.8.
|
1
|
+
__version__ = "2.8.16"
|
2
2
|
|
warp_beacon/scraper/__init__.py
CHANGED
@@ -16,12 +16,15 @@ class FailHandler(object):
|
|
16
16
|
self.client.close()
|
17
17
|
|
18
18
|
def store_failed_job(self, job: DownloadJob) -> int:
|
19
|
-
db_id =
|
19
|
+
db_id = ""
|
20
20
|
try:
|
21
21
|
job_serilized = pickle.dumps(job)
|
22
22
|
db_id = self.db.insert_one(
|
23
23
|
{
|
24
|
-
"job_data": job_serilized
|
24
|
+
"job_data": job_serilized,
|
25
|
+
"uniq_id": job.uniq_id,
|
26
|
+
"message_id": job.message_id,
|
27
|
+
"chat_id": job.chat_id
|
25
28
|
}).inserted_id
|
26
29
|
except Exception as e:
|
27
30
|
logging.error("Failed to store job as failed!")
|
@@ -33,10 +36,26 @@ class FailHandler(object):
|
|
33
36
|
try:
|
34
37
|
cursor = self.db.find()
|
35
38
|
for document in cursor:
|
36
|
-
ret.append(
|
39
|
+
ret.append({
|
40
|
+
"_id": document["_id"],
|
41
|
+
"job": pickle.loads(document["job_data"]),
|
42
|
+
"uniq_id": document.get("uniq_id"),
|
43
|
+
"message_id": document.get("message_id"),
|
44
|
+
"chat_id": document.get("chat_id")
|
45
|
+
})
|
37
46
|
if clean:
|
38
47
|
self.db.delete_many({})
|
39
48
|
except Exception as e:
|
40
49
|
logging.error("Failed to get failed jobs!")
|
41
50
|
logging.exception(e)
|
42
51
|
return ret
|
52
|
+
|
53
|
+
def remove_failed_job(self, uniq_id: str) -> bool:
|
54
|
+
try:
|
55
|
+
result = self.db.delete_one({"uniq_id": uniq_id})
|
56
|
+
if result.deleted_count > 0:
|
57
|
+
return True
|
58
|
+
except Exception as e:
|
59
|
+
logging.error("Failed to remove failed job!", exc_info=e)
|
60
|
+
|
61
|
+
return False
|
warp_beacon/telegram/bot.py
CHANGED
@@ -69,9 +69,11 @@ class Bot(object):
|
|
69
69
|
)
|
70
70
|
|
71
71
|
self.editor = EditMessage(self.client)
|
72
|
+
self.handlers = Handlers(self)
|
72
73
|
|
73
74
|
self.uploader = AsyncUploader(
|
74
75
|
storage=self.storage,
|
76
|
+
upload_wrapper=self.handlers.upload_wrapper,
|
75
77
|
admin_message_callback=self.send_text_to_admin,
|
76
78
|
request_yt_auth_callback=self.request_yt_auth,
|
77
79
|
pool_size=int(os.environ.get("UPLOAD_POOL_SIZE", default=workers_amount)),
|
@@ -85,7 +87,6 @@ class Bot(object):
|
|
85
87
|
)
|
86
88
|
|
87
89
|
self.scheduler = IGScheduler(self.downloader)
|
88
|
-
self.handlers = Handlers(self)
|
89
90
|
|
90
91
|
self.client.add_handler(MessageHandler(self.handlers.start, filters.command("start")))
|
91
92
|
self.client.add_handler(MessageHandler(self.handlers.help, filters.command("help")))
|
warp_beacon/telegram/handlers.py
CHANGED
@@ -14,8 +14,6 @@ from warp_beacon.jobs.upload_job import UploadJob
|
|
14
14
|
from warp_beacon.jobs import Origin
|
15
15
|
from warp_beacon.jobs.types import JobType
|
16
16
|
from warp_beacon.scraper.link_resolver import LinkResolver
|
17
|
-
from warp_beacon.scraper.fail_handler import FailHandler
|
18
|
-
from warp_beacon.storage.mongo import DBClient
|
19
17
|
|
20
18
|
class Handlers(object):
|
21
19
|
storage = None
|
@@ -25,12 +23,6 @@ class Handlers(object):
|
|
25
23
|
def __init__(self, bot: "Bot") -> None:
|
26
24
|
self.bot = bot
|
27
25
|
self.storage = bot.storage
|
28
|
-
# add uploader callbacks to handle service restart
|
29
|
-
for job in FailHandler(DBClient()).get_failed_jobs(clean=False):
|
30
|
-
self.bot.uploader.add_callback(
|
31
|
-
job.placeholder_message_id,
|
32
|
-
self.upload_wrapper
|
33
|
-
)
|
34
26
|
|
35
27
|
async def help(self, _: Client, message: Message) -> None:
|
36
28
|
"""Send a message when the command /help is issued."""
|
@@ -147,11 +139,6 @@ class Handlers(object):
|
|
147
139
|
text="Failed to create message placeholder. Please check your bot Internet connection."
|
148
140
|
)
|
149
141
|
|
150
|
-
self.bot.uploader.add_callback(
|
151
|
-
job.placeholder_message_id,
|
152
|
-
self.upload_wrapper
|
153
|
-
)
|
154
|
-
|
155
142
|
self.bot.downloader.queue_task(job)
|
156
143
|
except Exception as e:
|
157
144
|
logging.error("Failed to schedule download task!")
|
warp_beacon/uploader/__init__.py
CHANGED
@@ -12,26 +12,17 @@ from warp_beacon.storage import Storage
|
|
12
12
|
|
13
13
|
class AsyncUploader(object):
|
14
14
|
__JOE_BIDEN_WAKEUP = None
|
15
|
-
threads = None
|
16
|
-
allow_loop = True
|
17
|
-
job_queue = None
|
18
|
-
callbacks = None
|
19
|
-
storage = None
|
20
|
-
in_process = None
|
21
|
-
loop = None
|
22
|
-
admin_message_callback = None
|
23
|
-
request_yt_auth_callback = None
|
24
15
|
pool_size = 1
|
25
16
|
|
26
17
|
def __init__(self,
|
27
18
|
loop: asyncio.AbstractEventLoop,
|
28
19
|
storage: Storage,
|
20
|
+
upload_wrapper: Callable,
|
29
21
|
admin_message_callback: Callable,
|
30
22
|
request_yt_auth_callback: Callable,
|
31
23
|
pool_size: int=min(32, os.cpu_count() + 4)
|
32
24
|
) -> None:
|
33
25
|
self.threads = []
|
34
|
-
self.callbacks = {}
|
35
26
|
self.in_process = set()
|
36
27
|
self.storage = storage
|
37
28
|
self.loop = loop
|
@@ -39,6 +30,7 @@ class AsyncUploader(object):
|
|
39
30
|
self.admin_message_callback = admin_message_callback
|
40
31
|
self.request_yt_auth_callback = request_yt_auth_callback
|
41
32
|
self.pool_size = pool_size
|
33
|
+
self.upload_wrapper = upload_wrapper
|
42
34
|
|
43
35
|
def __del__(self) -> None:
|
44
36
|
self.stop_all()
|
@@ -49,18 +41,6 @@ class AsyncUploader(object):
|
|
49
41
|
thread.start()
|
50
42
|
self.threads.append(thread)
|
51
43
|
|
52
|
-
def add_callback(self, message_id: int, callback: Callable) -> None:
|
53
|
-
if message_id not in self.callbacks:
|
54
|
-
async def callback_wrap(*args, **kwargs) -> None:
|
55
|
-
await callback(*args, **kwargs)
|
56
|
-
#self.remove_callback(message_id)
|
57
|
-
self.callbacks[message_id] = {"callback": callback_wrap}
|
58
|
-
|
59
|
-
def remove_callback(self, message_id: int) -> None:
|
60
|
-
if message_id in self.callbacks:
|
61
|
-
logging.debug("Removing callback with message id #%d", message_id)
|
62
|
-
del self.callbacks[message_id]
|
63
|
-
|
64
44
|
def stop_all(self) -> None:
|
65
45
|
self.allow_loop = False
|
66
46
|
if self.threads:
|
@@ -115,7 +95,6 @@ class AsyncUploader(object):
|
|
115
95
|
|
116
96
|
in_process = job.in_process
|
117
97
|
uniq_id = job.uniq_id
|
118
|
-
message_id = job.placeholder_message_id
|
119
98
|
|
120
99
|
if not in_process and not job.job_failed and not job.job_warning and not job.replay:
|
121
100
|
if job.media_type == JobType.TEXT:
|
@@ -123,65 +102,61 @@ class AsyncUploader(object):
|
|
123
102
|
else:
|
124
103
|
logging.info("Accepted upload job, file(s): '%s'", path)
|
125
104
|
|
105
|
+
async def callback_wrap(*args, **kwargs) -> None:
|
106
|
+
await self.upload_wrapper(*args, **kwargs)
|
107
|
+
|
126
108
|
try:
|
127
|
-
if
|
128
|
-
|
129
|
-
|
130
|
-
if job.job_failed_msg: # we want to say something to user
|
131
|
-
self.loop.call_soon_threadsafe(
|
132
|
-
asyncio.create_task,
|
133
|
-
self.callbacks[message_id]["callback"](job)
|
134
|
-
)
|
135
|
-
self.process_done(uniq_id)
|
136
|
-
self.remove_callback(message_id)
|
137
|
-
continue
|
138
|
-
|
139
|
-
if job.replay:
|
109
|
+
if job.job_failed:
|
110
|
+
logging.info("URL '%s' download failed. Skipping upload job ...", job.url)
|
111
|
+
if job.job_failed_msg: # we want to say something to user
|
140
112
|
self.loop.call_soon_threadsafe(
|
141
113
|
asyncio.create_task,
|
142
|
-
|
114
|
+
callback_wrap(job)
|
143
115
|
)
|
144
|
-
|
145
|
-
|
116
|
+
self.process_done(uniq_id)
|
117
|
+
continue
|
118
|
+
|
119
|
+
if job.replay:
|
120
|
+
self.loop.call_soon_threadsafe(
|
121
|
+
asyncio.create_task,
|
122
|
+
callback_wrap(job)
|
123
|
+
)
|
124
|
+
continue
|
146
125
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
self.loop.call_soon_threadsafe(
|
151
|
-
asyncio.create_task,
|
152
|
-
self.callbacks[message_id]["callback"](job)
|
153
|
-
)
|
154
|
-
continue
|
155
|
-
if in_process:
|
156
|
-
db_list_dicts = self.storage.db_lookup_id(uniq_id)
|
157
|
-
if db_list_dicts:
|
158
|
-
tg_file_ids = [i["tg_file_id"] for i in db_list_dicts]
|
159
|
-
dlds_len = len(db_list_dicts)
|
160
|
-
if dlds_len > 1:
|
161
|
-
job.tg_file_id = ",".join(tg_file_ids)
|
162
|
-
job.media_type = JobType.COLLECTION
|
163
|
-
elif dlds_len:
|
164
|
-
job.tg_file_id = ",".join(tg_file_ids)
|
165
|
-
db_data = db_list_dicts.pop()
|
166
|
-
job.media_type = JobType[db_data["media_type"].upper()]
|
167
|
-
job.canonical_name = db_data.get("canonical_name", "")
|
168
|
-
self.loop.call_soon_threadsafe(
|
169
|
-
asyncio.create_task,
|
170
|
-
self.callbacks[message_id]["callback"](job)
|
171
|
-
)
|
172
|
-
self.process_done(uniq_id)
|
173
|
-
self.remove_callback(message_id)
|
174
|
-
else:
|
175
|
-
self.queue_task(job)
|
176
|
-
else:
|
126
|
+
if job.job_warning:
|
127
|
+
logging.info("Job warning occurred ...")
|
128
|
+
if job.job_warning_msg:
|
177
129
|
self.loop.call_soon_threadsafe(
|
178
130
|
asyncio.create_task,
|
179
|
-
|
131
|
+
callback_wrap(job)
|
132
|
+
)
|
133
|
+
continue
|
134
|
+
if in_process:
|
135
|
+
db_list_dicts = self.storage.db_lookup_id(uniq_id)
|
136
|
+
if db_list_dicts:
|
137
|
+
tg_file_ids = [i["tg_file_id"] for i in db_list_dicts]
|
138
|
+
dlds_len = len(db_list_dicts)
|
139
|
+
if dlds_len > 1:
|
140
|
+
job.tg_file_id = ",".join(tg_file_ids)
|
141
|
+
job.media_type = JobType.COLLECTION
|
142
|
+
elif dlds_len:
|
143
|
+
job.tg_file_id = ",".join(tg_file_ids)
|
144
|
+
db_data = db_list_dicts.pop()
|
145
|
+
job.media_type = JobType[db_data["media_type"].upper()]
|
146
|
+
job.canonical_name = db_data.get("canonical_name", "")
|
147
|
+
self.loop.call_soon_threadsafe(
|
148
|
+
asyncio.create_task,
|
149
|
+
callback_wrap(job)
|
180
150
|
)
|
181
151
|
self.process_done(uniq_id)
|
182
|
-
|
152
|
+
else:
|
153
|
+
self.queue_task(job)
|
183
154
|
else:
|
184
|
-
|
155
|
+
self.loop.call_soon_threadsafe(
|
156
|
+
asyncio.create_task,
|
157
|
+
callback_wrap(job)
|
158
|
+
)
|
159
|
+
self.process_done(uniq_id)
|
185
160
|
except Exception as e:
|
186
161
|
logging.exception(e)
|
187
162
|
except Empty:
|
@@ -189,4 +164,4 @@ class AsyncUploader(object):
|
|
189
164
|
except Exception as e:
|
190
165
|
logging.error("Exception occurred inside upload worker!")
|
191
166
|
logging.exception(e)
|
192
|
-
|
167
|
+
logging.info("Thread done")
|
@@ -4,7 +4,7 @@ var/warp_beacon/accounts.json,sha256=OsXdncs6h88xrF_AP6_WDCK1waGBn9SR-uYdIeK37GM
|
|
4
4
|
var/warp_beacon/placeholder.gif,sha256=cE5CGJVaop4Sx21zx6j4AyoHU0ncmvQuS2o6hJfEH88,6064
|
5
5
|
var/warp_beacon/proxies.json,sha256=VnjlQDXumOEq72ZFjbh6IqHS1TEHqn8HPYAZqWCeSIA,95
|
6
6
|
warp_beacon/__init__.py,sha256=_rThNODmz0nDp_n4mWo_HKaNFE5jk1_7cRhHyYaencI,163
|
7
|
-
warp_beacon/__version__.py,sha256=
|
7
|
+
warp_beacon/__version__.py,sha256=9j8dYjzjanXTCo3lfOVfAZGCuvknHdNoJReyvG-GYZk,24
|
8
8
|
warp_beacon/warp_beacon.py,sha256=ADCR30uGXIsDrt9WoiI9Ghu2QtWs0qZIK6x3pQKM_B4,1109
|
9
9
|
warp_beacon/yt_auth.py,sha256=GUTKqYr_tzDC-07Lx_ahWXSag8EyLxXBUnQbDBIkEmk,6022
|
10
10
|
warp_beacon/compress/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -22,11 +22,11 @@ warp_beacon/mediainfo/video.py,sha256=UBZrhTN5IDI-aYu6tsJEILo9nFkjHhkldGVFmvV7tE
|
|
22
22
|
warp_beacon/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
warp_beacon/scheduler/instagram_human.py,sha256=lOytnonvqtB_8z6TVzrVJ1prqqgE4fktZZl-xpn7SOA,12951
|
24
24
|
warp_beacon/scheduler/scheduler.py,sha256=0u9AIr9fTBmjU1GpOwKlPuNLskeJ4A-S2uAUzb-qO6w,4997
|
25
|
-
warp_beacon/scraper/__init__.py,sha256=
|
25
|
+
warp_beacon/scraper/__init__.py,sha256=q4Z2UQ84jjnNviALdyqFv33exnrPwwfAeZK1BH85kFk,20825
|
26
26
|
warp_beacon/scraper/abstract.py,sha256=pWbaTu-gDZgi-iFjqMR_uGzPl5KLv-4gTdJ9w6cD4sk,3802
|
27
27
|
warp_beacon/scraper/account_selector.py,sha256=n-466AiTXZ8o5cgcNkNwNiWLoi-EkLC7bHh6El1eIF8,10274
|
28
28
|
warp_beacon/scraper/exceptions.py,sha256=hicAe6_0xN7Ry2gcFX4UvqPWMtF_lX2ihH1njQAaqCA,1496
|
29
|
-
warp_beacon/scraper/fail_handler.py,sha256=
|
29
|
+
warp_beacon/scraper/fail_handler.py,sha256=hu0mGS6zeyo3VV86XORvCIWbTApcb2bE_EBoxANpFPo,1529
|
30
30
|
warp_beacon/scraper/link_resolver.py,sha256=Rc9ZuMyOo3iPywDHwjngy-WRQ2SXhJwxcg-5ripx7tM,2447
|
31
31
|
warp_beacon/scraper/utils.py,sha256=AOZmDki2Pbr84IG-j_wN2UghKCiWFVDYdx6HJl0JTBs,1258
|
32
32
|
warp_beacon/scraper/X/X.py,sha256=lKxNe70iIasLnyN8QA_1rLa70Bd3Y9fL6J4AEdUgNJs,9200
|
@@ -45,20 +45,20 @@ warp_beacon/scraper/youtube/youtube.py,sha256=uYR7XpfP6ZnSvw1Gc4qG_M8jkCyv3maEyt
|
|
45
45
|
warp_beacon/storage/__init__.py,sha256=xg3quvc-Lkc-hCZ2lkrTsGqLyMybTN14mwrSuDJMfD4,3403
|
46
46
|
warp_beacon/storage/mongo.py,sha256=qC4ZiO8XXvPnP0rJwz4CJx42pqFsyAjCiW10W5QdT6E,527
|
47
47
|
warp_beacon/telegram/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
-
warp_beacon/telegram/bot.py,sha256=
|
48
|
+
warp_beacon/telegram/bot.py,sha256=DdVgW1SraCabgruEzOKRzh2-Gbn8JDSzxEqcMKeDMHg,20723
|
49
49
|
warp_beacon/telegram/caption_shortener.py,sha256=EnguNCF52ne7y4P-iJAbI6K3sqoJqJbND_dX5Fhwkv0,1549
|
50
50
|
warp_beacon/telegram/download_status.py,sha256=N-Qg13LVcPskyQNKG1lw50K1lhFtXu003muCRzZ7wiE,1561
|
51
51
|
warp_beacon/telegram/edit_message.py,sha256=vzSrtlt-QxBU-X9uRSKo7gJftOrvB5Qo3iNsVNptCoE,5684
|
52
|
-
warp_beacon/telegram/handlers.py,sha256=
|
52
|
+
warp_beacon/telegram/handlers.py,sha256=hA5rzfYcCoU6KJE1YMkEkQnv_B06UiSvJDeqr4JbhXw,10376
|
53
53
|
warp_beacon/telegram/placeholder_message.py,sha256=wN9-BRiyrtHG-EvXtZkGJHt2CX71munQ57ITttjt0mw,6400
|
54
54
|
warp_beacon/telegram/progress_bar.py,sha256=IP4xtvLtdJtqdr2C-0YaU428iQGrKurbP4Npr31iW74,5014
|
55
55
|
warp_beacon/telegram/progress_file_reader.py,sha256=e3equyNKlKs764AD-iE9QRsh3YDHTzP78Mx5tdvPPWs,969
|
56
56
|
warp_beacon/telegram/types.py,sha256=Kvdng6uCF1HRoqQgGW1ZYYPJoVuYkFb-LDvMBbW5Hjk,89
|
57
57
|
warp_beacon/telegram/utils.py,sha256=zTF8VQfAWetBSjAPbmNe_Zi_LN5fAcWptJKjLaFNHaE,5073
|
58
|
-
warp_beacon/uploader/__init__.py,sha256=
|
59
|
-
warp_beacon-2.8.
|
60
|
-
warp_beacon-2.8.
|
61
|
-
warp_beacon-2.8.
|
62
|
-
warp_beacon-2.8.
|
63
|
-
warp_beacon-2.8.
|
64
|
-
warp_beacon-2.8.
|
58
|
+
warp_beacon/uploader/__init__.py,sha256=zYHDg23RIAaY0HST8BCo8JFyM-oiq31hZ7EDwf9NvFw,4862
|
59
|
+
warp_beacon-2.8.16.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
60
|
+
warp_beacon-2.8.16.dist-info/METADATA,sha256=HR43pAdA8_kTn0nhYsM7DtLJp-8bjuqOPGhRJDW3arI,23236
|
61
|
+
warp_beacon-2.8.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
62
|
+
warp_beacon-2.8.16.dist-info/entry_points.txt,sha256=eSB61Rb89d56WY0O-vEIQwkn18J-4CMrJcLA_R_8h3g,119
|
63
|
+
warp_beacon-2.8.16.dist-info/top_level.txt,sha256=RraB0PWGvRK2zPYkuICKNgStLG1C5s7rPHHJEHJbkgA,1510
|
64
|
+
warp_beacon-2.8.16.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|