warp-beacon 2.6.42__tar.gz → 2.6.44__tar.gz
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-2.6.42/warp_beacon.egg-info → warp_beacon-2.6.44}/PKG-INFO +1 -1
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/setup.py +1 -0
- warp_beacon-2.6.44/warp_beacon/__version__.py +2 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/bot.py +34 -40
- warp_beacon-2.6.44/warp_beacon/telegram/progress_file_reader.py +35 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44/warp_beacon.egg-info}/PKG-INFO +1 -1
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/SOURCES.txt +1 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/top_level.txt +1 -0
- warp_beacon-2.6.42/warp_beacon/__version__.py +0 -2
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/LICENSE +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/MANIFEST.in +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/README.md +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/assets/placeholder.gif +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/.gitignore +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/accounts.json +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/proxies.json +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/warp_beacon.conf +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/warp_beacon.service +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/pyproject.toml +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/setup.cfg +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/compress/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/compress/video.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/abstract.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/download_job.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/types.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/upload_job.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/abstract.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/audio.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/silencer.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/video.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/instagram_human.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/scheduler.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/abstract.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/account_selector.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/exceptions.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/fail_handler.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/captcha.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/instagram.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/link_resolver.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/utils.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/abstract.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/music.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/shorts.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/youtube.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/storage/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/storage/mongo.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/caption_shortener.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/handlers.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/placeholder_message.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/utils.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/uploader/__init__.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/warp_beacon.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/yt_auth.py +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/dependency_links.txt +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/entry_points.txt +0 -0
- {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/requires.txt +0 -0
@@ -66,6 +66,7 @@ setup(
|
|
66
66
|
"warp_beacon/telegram/handlers",
|
67
67
|
"warp_beacon/telegram/utils",
|
68
68
|
"warp_beacon/telegram/caption_shortener",
|
69
|
+
"warp_beacon/telegram/progress_file_reader",
|
69
70
|
"warp_beacon/jobs/abstract",
|
70
71
|
"warp_beacon/jobs/download_job",
|
71
72
|
"warp_beacon/jobs/upload_job",
|
@@ -8,13 +8,13 @@ import logging
|
|
8
8
|
import html
|
9
9
|
|
10
10
|
import uvloop
|
11
|
+
#from contextlib import ExitStack
|
11
12
|
|
12
13
|
from pyrogram import Client, filters
|
13
14
|
from pyrogram.enums import ParseMode, ChatType
|
14
15
|
from pyrogram.handlers import MessageHandler, CallbackQueryHandler
|
15
16
|
from pyrogram.types import InputMediaAudio, InputMediaPhoto, InputMediaVideo, InputMediaAnimation, InlineKeyboardButton, InlineKeyboardMarkup
|
16
17
|
from pyrogram.errors import NetworkMigrate, BadRequest, MultiMediaTooLong, MessageIdInvalid
|
17
|
-
from pyrogram.raw.types import InputFile, InputFileBig
|
18
18
|
|
19
19
|
import warp_beacon
|
20
20
|
from warp_beacon.__version__ import __version__
|
@@ -29,6 +29,7 @@ from warp_beacon.jobs import Origin
|
|
29
29
|
from warp_beacon.telegram.utils import Utils
|
30
30
|
from warp_beacon.telegram.caption_shortener import CaptionShortner
|
31
31
|
from warp_beacon.scheduler.scheduler import IGScheduler
|
32
|
+
from warp_beacon.telegram.progress_file_reader import ProgressFileReader
|
32
33
|
|
33
34
|
class Bot(object):
|
34
35
|
should_exit = None
|
@@ -226,7 +227,7 @@ class Bot(object):
|
|
226
227
|
|
227
228
|
return caption
|
228
229
|
|
229
|
-
def build_tg_args(self, job: UploadJob) -> dict:
|
230
|
+
def build_tg_args(self, job: UploadJob, file_io: ProgressFileReader = None) -> dict:
|
230
231
|
args = {}
|
231
232
|
if job.media_type == JobType.VIDEO:
|
232
233
|
if job.tg_file_id:
|
@@ -242,7 +243,7 @@ class Bot(object):
|
|
242
243
|
else:
|
243
244
|
if job.placeholder_message_id:
|
244
245
|
args["media"] = InputMediaVideo(
|
245
|
-
media=
|
246
|
+
media=file_io,
|
246
247
|
supports_streaming=True,
|
247
248
|
width=job.media_info["width"],
|
248
249
|
height=job.media_info["height"],
|
@@ -251,7 +252,7 @@ class Bot(object):
|
|
251
252
|
caption=self.build_signature_caption(job)
|
252
253
|
)
|
253
254
|
else:
|
254
|
-
args["video"] =
|
255
|
+
args["video"] = file_io
|
255
256
|
args["supports_streaming"] = True
|
256
257
|
args["width"] = job.media_info["width"]
|
257
258
|
args["height"] = job.media_info["height"]
|
@@ -273,11 +274,11 @@ class Bot(object):
|
|
273
274
|
else:
|
274
275
|
if job.placeholder_message_id:
|
275
276
|
args["media"] = InputMediaPhoto(
|
276
|
-
media=
|
277
|
+
media=file_io,
|
277
278
|
caption=self.build_signature_caption(job)
|
278
279
|
)
|
279
280
|
else:
|
280
|
-
args["photo"] =
|
281
|
+
args["photo"] = file_io
|
281
282
|
args["caption"] = self.build_signature_caption(job)
|
282
283
|
|
283
284
|
args["file_name"] = os.path.basename(job.local_media_path)
|
@@ -293,7 +294,7 @@ class Bot(object):
|
|
293
294
|
else:
|
294
295
|
if job.placeholder_message_id:
|
295
296
|
args["media"] = InputMediaAudio(
|
296
|
-
media=
|
297
|
+
media=file_io,
|
297
298
|
performer=job.media_info["performer"],
|
298
299
|
thumb=job.media_info["thumb"],
|
299
300
|
duration=round(job.media_info["duration"]),
|
@@ -301,7 +302,7 @@ class Bot(object):
|
|
301
302
|
caption=self.build_signature_caption(job)
|
302
303
|
)
|
303
304
|
else:
|
304
|
-
args["audio"] =
|
305
|
+
args["audio"] = file_io
|
305
306
|
args["performer"] = job.media_info["performer"]
|
306
307
|
args["thumb"] = job.media_info["thumb"]
|
307
308
|
args["duration"] = round(job.media_info["duration"])
|
@@ -322,7 +323,7 @@ class Bot(object):
|
|
322
323
|
else:
|
323
324
|
if job.placeholder_message_id:
|
324
325
|
args["media"] = InputMediaAnimation(
|
325
|
-
media=
|
326
|
+
media=file_io,
|
326
327
|
thumb=job.media_info["thumb"],
|
327
328
|
duration=round(job.media_info["duration"]),
|
328
329
|
width=job.media_info["width"],
|
@@ -330,7 +331,7 @@ class Bot(object):
|
|
330
331
|
caption=self.build_signature_caption(job)
|
331
332
|
)
|
332
333
|
else:
|
333
|
-
args["animation"] =
|
334
|
+
args["animation"] = file_io
|
334
335
|
args["width"] = job.media_info["width"]
|
335
336
|
args["height"] = job.media_info["height"]
|
336
337
|
args["duration"] = round(job.media_info["duration"])
|
@@ -363,7 +364,7 @@ class Bot(object):
|
|
363
364
|
for j in chunk:
|
364
365
|
if j.media_type == JobType.VIDEO:
|
365
366
|
vid = InputMediaVideo(
|
366
|
-
media=j.local_media_path,
|
367
|
+
media=ProgressFileReader(j.local_media_path, self.progress_callback),
|
367
368
|
supports_streaming=True,
|
368
369
|
width=j.media_info["width"],
|
369
370
|
height=j.media_info["height"],
|
@@ -374,7 +375,7 @@ class Bot(object):
|
|
374
375
|
tg_chunk.append(vid)
|
375
376
|
elif j.media_type == JobType.IMAGE:
|
376
377
|
photo = InputMediaPhoto(
|
377
|
-
media=j.local_media_path,
|
378
|
+
media=ProgressFileReader(j.local_media_path, self.progress_callback),
|
378
379
|
caption=self.build_signature_caption(job)
|
379
380
|
)
|
380
381
|
tg_chunk.append(photo)
|
@@ -404,25 +405,8 @@ class Bot(object):
|
|
404
405
|
|
405
406
|
return args
|
406
407
|
|
407
|
-
|
408
|
-
|
409
|
-
logging.info("[%s] Uploaded %.1f%%", job.local_media_path, current * 100 / total)
|
410
|
-
|
411
|
-
if job.media_type == JobType.COLLECTION:
|
412
|
-
col_uploaded_files = []
|
413
|
-
for chunk in job.media_collection:
|
414
|
-
for col in chunk:
|
415
|
-
uploaded_file = await self.client.save_file(
|
416
|
-
path=col.local_media_path,
|
417
|
-
progress=progress_callback
|
418
|
-
)
|
419
|
-
col_uploaded_files.append(uploaded_file)
|
420
|
-
return col_uploaded_files
|
421
|
-
|
422
|
-
return [await self.client.save_file(
|
423
|
-
path=job.local_media_path,
|
424
|
-
progress=progress_callback
|
425
|
-
)]
|
408
|
+
def progress_callback(self, filename: str, current: int, total: int) -> None:
|
409
|
+
logging.info("[%s] Uploaded %.1f%%", filename, current * 100 / total)
|
426
410
|
|
427
411
|
async def upload_job(self, job: UploadJob) -> list[str]:
|
428
412
|
tg_file_ids = []
|
@@ -437,8 +421,8 @@ class Bot(object):
|
|
437
421
|
await Utils.ensure_me_loaded(self.client)
|
438
422
|
if job.placeholder_message_id:
|
439
423
|
try:
|
440
|
-
|
441
|
-
|
424
|
+
with ProgressFileReader(job.local_media_path, self.progress_callback) as f:
|
425
|
+
reply_message = await self.client.edit_message_media(**self.build_tg_args(job, f))
|
442
426
|
except MessageIdInvalid:
|
443
427
|
logging.warning("Placeholder message not found. Looks like placeholder message was deleted by administrator.")
|
444
428
|
job.placeholder_message_id = None
|
@@ -451,17 +435,18 @@ class Bot(object):
|
|
451
435
|
JobType.ANIMATION: self.client.send_animation
|
452
436
|
}
|
453
437
|
try:
|
454
|
-
|
455
|
-
|
438
|
+
with ProgressFileReader(job.local_media_path, self.progress_callback) as f:
|
439
|
+
reply_message = await send_funcs[job.media_type](**self.build_tg_args(job, f))
|
456
440
|
except ValueError as e:
|
457
441
|
err_text = str(e)
|
458
442
|
if "Expected" in err_text:
|
459
443
|
logging.warning("Expectations exceeded reality.")
|
460
444
|
logging.warning(err_text)
|
461
445
|
expectation, reality = Utils.parse_expected_patronum_error(err_text)
|
462
|
-
|
463
|
-
|
464
|
-
|
446
|
+
with ProgressFileReader(job.local_media_path, self.progress_callback) as f:
|
447
|
+
job_args = self.build_tg_args(job, f)
|
448
|
+
job_args[reality.value.lower()] = job_args.pop(expectation.value.lower())
|
449
|
+
reply_message = await send_funcs[reality](**job_args)
|
465
450
|
|
466
451
|
tg_file_id = Utils.extract_file_id(reply_message)
|
467
452
|
tg_file_ids.append(tg_file_id)
|
@@ -474,8 +459,17 @@ class Bot(object):
|
|
474
459
|
snd_grp_options = {"chat_id": job.chat_id, "reply_to_message_id": job.message_id}
|
475
460
|
for i, media_chunk in enumerate(col_job_args["media"]):
|
476
461
|
snd_grp_options["media"] = media_chunk
|
477
|
-
messages =
|
478
|
-
|
462
|
+
messages = None
|
463
|
+
try:
|
464
|
+
messages = await self.client.send_media_group(**snd_grp_options)
|
465
|
+
finally:
|
466
|
+
try:
|
467
|
+
for med in snd_grp_options["media"]:
|
468
|
+
med.media.close()
|
469
|
+
except AttributeError:
|
470
|
+
pass
|
471
|
+
if messages:
|
472
|
+
sent_messages += messages
|
479
473
|
if job.media_collection:
|
480
474
|
for j, _ in enumerate(media_chunk):
|
481
475
|
tg_file_id = Utils.extract_file_id(messages[j])
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import io
|
2
|
+
import os
|
3
|
+
from types import TracebackType
|
4
|
+
from typing import Optional, Callable, Type
|
5
|
+
|
6
|
+
class ProgressFileReader(io.BufferedReader):
|
7
|
+
def __init__(self, file_path: str, callback: Optional[Callable[[str, int, int], None]]) -> None:
|
8
|
+
self.raw = open(file_path, "rb")
|
9
|
+
super().__init__(self.raw)
|
10
|
+
self.callback = callback
|
11
|
+
self.total = os.path.getsize(file_path)
|
12
|
+
self.read_bytes = 0
|
13
|
+
self.name = os.path.basename(file_path)
|
14
|
+
|
15
|
+
def read(self, size: int = -1) -> bytes:
|
16
|
+
chunk = super().read(size)
|
17
|
+
self.read_bytes += len(chunk)
|
18
|
+
if self.callback:
|
19
|
+
self.callback(self.name, self.read_bytes, self.total)
|
20
|
+
return chunk
|
21
|
+
|
22
|
+
def close(self) -> None:
|
23
|
+
if not self.closed:
|
24
|
+
super().close()
|
25
|
+
self.raw.close()
|
26
|
+
|
27
|
+
def __enter__(self) -> "ProgressFileReader":
|
28
|
+
return self
|
29
|
+
|
30
|
+
def __exit__(self,
|
31
|
+
exc_type: Optional[Type[BaseException]],
|
32
|
+
exc_val: Optional[BaseException],
|
33
|
+
exc_tb: Optional[TracebackType]
|
34
|
+
) -> None:
|
35
|
+
self.close()
|
@@ -57,5 +57,6 @@ warp_beacon/telegram/bot.py
|
|
57
57
|
warp_beacon/telegram/caption_shortener.py
|
58
58
|
warp_beacon/telegram/handlers.py
|
59
59
|
warp_beacon/telegram/placeholder_message.py
|
60
|
+
warp_beacon/telegram/progress_file_reader.py
|
60
61
|
warp_beacon/telegram/utils.py
|
61
62
|
warp_beacon/uploader/__init__.py
|
@@ -36,6 +36,7 @@ warp_beacon/telegram/bot
|
|
36
36
|
warp_beacon/telegram/caption_shortener
|
37
37
|
warp_beacon/telegram/handlers
|
38
38
|
warp_beacon/telegram/placeholder_message
|
39
|
+
warp_beacon/telegram/progress_file_reader
|
39
40
|
warp_beacon/telegram/utils
|
40
41
|
warp_beacon/uploader
|
41
42
|
warp_beacon/warp_beacon
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|