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.
Files changed (64) hide show
  1. {warp_beacon-2.6.42/warp_beacon.egg-info → warp_beacon-2.6.44}/PKG-INFO +1 -1
  2. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/setup.py +1 -0
  3. warp_beacon-2.6.44/warp_beacon/__version__.py +2 -0
  4. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/bot.py +34 -40
  5. warp_beacon-2.6.44/warp_beacon/telegram/progress_file_reader.py +35 -0
  6. {warp_beacon-2.6.42 → warp_beacon-2.6.44/warp_beacon.egg-info}/PKG-INFO +1 -1
  7. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/SOURCES.txt +1 -0
  8. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/top_level.txt +1 -0
  9. warp_beacon-2.6.42/warp_beacon/__version__.py +0 -2
  10. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/LICENSE +0 -0
  11. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/MANIFEST.in +0 -0
  12. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/README.md +0 -0
  13. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/assets/placeholder.gif +0 -0
  14. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/.gitignore +0 -0
  15. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/accounts.json +0 -0
  16. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/proxies.json +0 -0
  17. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/warp_beacon.conf +0 -0
  18. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/etc/warp_beacon.service +0 -0
  19. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/pyproject.toml +0 -0
  20. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/setup.cfg +0 -0
  21. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/__init__.py +0 -0
  22. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/compress/__init__.py +0 -0
  23. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/compress/video.py +0 -0
  24. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/__init__.py +0 -0
  25. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/abstract.py +0 -0
  26. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/download_job.py +0 -0
  27. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/types.py +0 -0
  28. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/jobs/upload_job.py +0 -0
  29. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/__init__.py +0 -0
  30. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/abstract.py +0 -0
  31. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/audio.py +0 -0
  32. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/silencer.py +0 -0
  33. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/mediainfo/video.py +0 -0
  34. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/__init__.py +0 -0
  35. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/instagram_human.py +0 -0
  36. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scheduler/scheduler.py +0 -0
  37. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/__init__.py +0 -0
  38. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/abstract.py +0 -0
  39. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/account_selector.py +0 -0
  40. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/exceptions.py +0 -0
  41. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/fail_handler.py +0 -0
  42. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/__init__.py +0 -0
  43. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/captcha.py +0 -0
  44. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/instagram/instagram.py +0 -0
  45. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/link_resolver.py +0 -0
  46. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/utils.py +0 -0
  47. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/__init__.py +0 -0
  48. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/abstract.py +0 -0
  49. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/music.py +0 -0
  50. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/shorts.py +0 -0
  51. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/scraper/youtube/youtube.py +0 -0
  52. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/storage/__init__.py +0 -0
  53. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/storage/mongo.py +0 -0
  54. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/__init__.py +0 -0
  55. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/caption_shortener.py +0 -0
  56. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/handlers.py +0 -0
  57. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/placeholder_message.py +0 -0
  58. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/telegram/utils.py +0 -0
  59. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/uploader/__init__.py +0 -0
  60. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/warp_beacon.py +0 -0
  61. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon/yt_auth.py +0 -0
  62. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/dependency_links.txt +0 -0
  63. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/entry_points.txt +0 -0
  64. {warp_beacon-2.6.42 → warp_beacon-2.6.44}/warp_beacon.egg-info/requires.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: warp_beacon
3
- Version: 2.6.42
3
+ Version: 2.6.44
4
4
  Summary: Telegram bot for expanding external media links
5
5
  Home-page: https://github.com/sb0y/warp_beacon
6
6
  Author: Andrey Bagrintsev
@@ -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",
@@ -0,0 +1,2 @@
1
+ __version__ = "2.6.44"
2
+
@@ -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=job.local_media_path,
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"] = job.local_media_path
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=job.local_media_path,
277
+ media=file_io,
277
278
  caption=self.build_signature_caption(job)
278
279
  )
279
280
  else:
280
- args["photo"] = job.local_media_path
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=job.local_media_path,
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"] = job.local_media_path
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=job.local_media_path,
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"] = job.local_media_path
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
- async def upload_with_progress(self, job: UploadJob) -> list[Union[InputFile, InputFileBig]]:
408
- def progress_callback(current: int, total: int) -> None:
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
- #uploaded_files = await self.upload_with_progress(job)
441
- reply_message = await self.client.edit_message_media(**self.build_tg_args(job))
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
- #uploaded_files = await self.upload_with_progress(job)
455
- reply_message = await send_funcs[job.media_type](**self.build_tg_args(job))
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
- job_args = self.build_tg_args(job)
463
- job_args[reality.value.lower()] = job_args.pop(expectation.value.lower())
464
- reply_message = await send_funcs[reality](**job_args)
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 = await self.client.send_media_group(**snd_grp_options)
478
- sent_messages += messages
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: warp_beacon
3
- Version: 2.6.42
3
+ Version: 2.6.44
4
4
  Summary: Telegram bot for expanding external media links
5
5
  Home-page: https://github.com/sb0y/warp_beacon
6
6
  Author: Andrey Bagrintsev
@@ -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
@@ -1,2 +0,0 @@
1
- __version__ = "2.6.42"
2
-
File without changes
File without changes
File without changes
File without changes