warp-beacon 2.8.17__tar.gz → 2.8.19__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 (74) hide show
  1. {warp_beacon-2.8.17/warp_beacon.egg-info → warp_beacon-2.8.19}/PKG-INFO +1 -1
  2. warp_beacon-2.8.19/warp_beacon/__version__.py +2 -0
  3. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/X/X.py +3 -3
  4. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/bot.py +20 -20
  5. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/handlers.py +1 -1
  6. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/uploader/__init__.py +9 -10
  7. {warp_beacon-2.8.17 → warp_beacon-2.8.19/warp_beacon.egg-info}/PKG-INFO +1 -1
  8. warp_beacon-2.8.17/warp_beacon/__version__.py +0 -2
  9. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/LICENSE +0 -0
  10. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/MANIFEST.in +0 -0
  11. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/README.md +0 -0
  12. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/assets/cc-group-black.png +0 -0
  13. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/assets/placeholder.gif +0 -0
  14. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/etc/.gitignore +0 -0
  15. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/etc/accounts.json +0 -0
  16. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/etc/proxies.json +0 -0
  17. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/etc/warp_beacon.conf +0 -0
  18. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/etc/warp_beacon.service +0 -0
  19. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/pyproject.toml +0 -0
  20. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/setup.cfg +0 -0
  21. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/setup.py +0 -0
  22. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/__init__.py +0 -0
  23. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/compress/__init__.py +0 -0
  24. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/compress/video.py +0 -0
  25. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/jobs/__init__.py +0 -0
  26. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/jobs/abstract.py +0 -0
  27. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/jobs/download_job.py +0 -0
  28. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/jobs/types.py +0 -0
  29. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/jobs/upload_job.py +0 -0
  30. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/mediainfo/__init__.py +0 -0
  31. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/mediainfo/abstract.py +0 -0
  32. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/mediainfo/audio.py +0 -0
  33. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/mediainfo/silencer.py +0 -0
  34. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/mediainfo/video.py +0 -0
  35. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scheduler/__init__.py +0 -0
  36. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scheduler/instagram_human.py +0 -0
  37. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scheduler/scheduler.py +0 -0
  38. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/X/__init__.py +0 -0
  39. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/X/abstract.py +0 -0
  40. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/X/types.py +0 -0
  41. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/__init__.py +0 -0
  42. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/abstract.py +0 -0
  43. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/account_selector.py +0 -0
  44. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/exceptions.py +0 -0
  45. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/fail_handler.py +0 -0
  46. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/instagram/__init__.py +0 -0
  47. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/instagram/captcha.py +0 -0
  48. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/instagram/instagram.py +0 -0
  49. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/instagram/wb_instagrapi.py +0 -0
  50. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/link_resolver.py +0 -0
  51. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/utils.py +0 -0
  52. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/youtube/__init__.py +0 -0
  53. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/youtube/abstract.py +0 -0
  54. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/youtube/music.py +0 -0
  55. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/youtube/shorts.py +0 -0
  56. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/scraper/youtube/youtube.py +0 -0
  57. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/storage/__init__.py +0 -0
  58. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/storage/mongo.py +0 -0
  59. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/__init__.py +0 -0
  60. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/caption_shortener.py +0 -0
  61. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/download_status.py +0 -0
  62. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/edit_message.py +0 -0
  63. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/placeholder_message.py +0 -0
  64. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/progress_bar.py +0 -0
  65. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/progress_file_reader.py +0 -0
  66. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/types.py +0 -0
  67. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/telegram/utils.py +0 -0
  68. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/warp_beacon.py +0 -0
  69. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon/yt_auth.py +0 -0
  70. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon.egg-info/SOURCES.txt +0 -0
  71. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon.egg-info/dependency_links.txt +0 -0
  72. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon.egg-info/entry_points.txt +0 -0
  73. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon.egg-info/requires.txt +0 -0
  74. {warp_beacon-2.8.17 → warp_beacon-2.8.19}/warp_beacon.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: warp_beacon
3
- Version: 2.8.17
3
+ Version: 2.8.19
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
@@ -0,0 +1,2 @@
1
+ __version__ = "2.8.19"
2
+
@@ -20,10 +20,10 @@ class XScraper(XAbstract):
20
20
  def extract_canonical_name(self, media: dict) -> str:
21
21
  ret = ""
22
22
  try:
23
- if media.get("title", None):
23
+ if media.get("description"):
24
+ ret = media["description"]
25
+ elif media.get("title"):
24
26
  ret = media["title"]
25
- if media.get("description", ""):
26
- ret += "\n" + media["description"]
27
27
  except Exception as e:
28
28
  logging.warning("Failed to extract canonical media name!")
29
29
  logging.exception(e)
@@ -222,11 +222,11 @@ class Bot(object):
222
222
  if job.source_username.startswith("<a href="):
223
223
  caption += f"Requested by <b>{job.source_username}</b>"
224
224
  else:
225
- caption += f"Requested by <b>@{job.source_username}</b>"
225
+ caption += f"Requested by <b>@{html.escape(job.source_username)}</b>"
226
226
  if job.source_username and job.url:
227
227
  caption += " | "
228
228
  if job.url:
229
- caption += f'<a href="{job.url}">source link</a>'
229
+ caption += f'<a href="{html.escape(job.url)}">source link</a>'
230
230
 
231
231
  return caption
232
232
 
@@ -238,11 +238,11 @@ class Bot(object):
238
238
  args["media"] = InputMediaVideo(
239
239
  media=job.tg_file_id.replace(":video", ''),
240
240
  supports_streaming=True,
241
- caption=self.build_signature_caption(job)
241
+ caption=self.build_signature_caption(job, job.message_text)
242
242
  )
243
243
  else:
244
244
  args["video"] = job.tg_file_id.replace(":video", '')
245
- args["caption"] = self.build_signature_caption(job)
245
+ args["caption"] = self.build_signature_caption(job, job.message_text)
246
246
  else:
247
247
  if job.placeholder_message_id:
248
248
  args["media"] = InputMediaVideo(
@@ -252,7 +252,7 @@ class Bot(object):
252
252
  height=job.media_info["height"],
253
253
  duration=round(job.media_info["duration"]),
254
254
  thumb=job.media_info["thumb"],
255
- caption=self.build_signature_caption(job)
255
+ caption=self.build_signature_caption(job, job.message_text)
256
256
  )
257
257
  else:
258
258
  args["video"] = job.local_media_path
@@ -261,7 +261,7 @@ class Bot(object):
261
261
  args["height"] = job.media_info["height"]
262
262
  args["duration"] = round(job.media_info["duration"])
263
263
  args["thumb"] = job.media_info["thumb"]
264
- args["caption"] = self.build_signature_caption(job)
264
+ args["caption"] = self.build_signature_caption(job, job.message_text)
265
265
 
266
266
  args["file_name"] = os.path.basename(job.local_media_path)
267
267
  elif job.media_type == JobType.IMAGE:
@@ -269,20 +269,20 @@ class Bot(object):
269
269
  if job.placeholder_message_id:
270
270
  args["media"] = InputMediaPhoto(
271
271
  media=job.tg_file_id.replace(":image", ''),
272
- caption=self.build_signature_caption(job)
272
+ caption=self.build_signature_caption(job, job.message_text)
273
273
  )
274
274
  else:
275
275
  args["photo"] = job.tg_file_id.replace(":image", '')
276
- args["caption"] = self.build_signature_caption(job)
276
+ args["caption"] = self.build_signature_caption(job, job.message_text)
277
277
  else:
278
278
  if job.placeholder_message_id:
279
279
  args["media"] = InputMediaPhoto(
280
280
  media=job.local_media_path,
281
- caption=self.build_signature_caption(job)
281
+ caption=self.build_signature_caption(job, job.message_text)
282
282
  )
283
283
  else:
284
284
  args["photo"] = job.local_media_path
285
- args["caption"] = self.build_signature_caption(job)
285
+ args["caption"] = self.build_signature_caption(job, job.message_text)
286
286
 
287
287
  args["file_name"] = os.path.basename(job.local_media_path)
288
288
  elif job.media_type == JobType.AUDIO:
@@ -290,7 +290,7 @@ class Bot(object):
290
290
  if job.placeholder_message_id:
291
291
  args["media"] = InputMediaAudio(
292
292
  media=job.tg_file_id.replace(":audio", ''),
293
- caption=self.build_signature_caption(job)
293
+ caption=self.build_signature_caption(job, job.message_text)
294
294
  )
295
295
  else:
296
296
  args["audio"] = job.tg_file_id.replace(":audio", '')
@@ -302,7 +302,7 @@ class Bot(object):
302
302
  thumb=job.media_info["thumb"],
303
303
  duration=round(job.media_info["duration"]),
304
304
  title=job.canonical_name,
305
- caption=self.build_signature_caption(job)
305
+ caption=self.build_signature_caption(job, job.message_text)
306
306
  )
307
307
  else:
308
308
  args["audio"] = job.local_media_path
@@ -310,7 +310,7 @@ class Bot(object):
310
310
  args["thumb"] = job.media_info["thumb"]
311
311
  args["duration"] = round(job.media_info["duration"])
312
312
  args["title"] = job.canonical_name
313
- args["caption"] = self.build_signature_caption(job)
313
+ args["caption"] = self.build_signature_caption(job, job.message_text)
314
314
 
315
315
  args["file_name"] = os.path.basename(job.local_media_path)
316
316
  elif job.media_type == JobType.ANIMATION:
@@ -318,11 +318,11 @@ class Bot(object):
318
318
  if job.placeholder_message_id:
319
319
  args["media"] = InputMediaAnimation(
320
320
  media=job.tg_file_id.replace(":animation", ''),
321
- caption=self.build_signature_caption(job)
321
+ caption=self.build_signature_caption(job, job.message_text)
322
322
  )
323
323
  else:
324
324
  args["animation"] = job.tg_file_id.replace(":animation", '')
325
- args["caption"] = self.build_signature_caption(job)
325
+ args["caption"] = self.build_signature_caption(job, job.message_text)
326
326
  else:
327
327
  if job.placeholder_message_id:
328
328
  args["media"] = InputMediaAnimation(
@@ -331,7 +331,7 @@ class Bot(object):
331
331
  duration=round(job.media_info["duration"]),
332
332
  width=job.media_info["width"],
333
333
  height=job.media_info["height"],
334
- caption=self.build_signature_caption(job)
334
+ caption=self.build_signature_caption(job, job.message_text)
335
335
  )
336
336
  else:
337
337
  args["animation"] = job.local_media_path
@@ -339,7 +339,7 @@ class Bot(object):
339
339
  args["height"] = job.media_info["height"]
340
340
  args["duration"] = round(job.media_info["duration"])
341
341
  args["thumb"] = job.media_info["thumb"]
342
- args["caption"] = self.build_signature_caption(job)
342
+ args["caption"] = self.build_signature_caption(job, job.message_text)
343
343
 
344
344
  args["file_name"] = os.path.basename(job.local_media_path)
345
345
  elif job.media_type == JobType.COLLECTION:
@@ -352,11 +352,11 @@ class Bot(object):
352
352
  ctype = JobType[mtype.upper()]
353
353
  ptr = None
354
354
  if ctype == JobType.VIDEO:
355
- ptr = InputMediaVideo(media=tg_id, caption=self.build_signature_caption(job))
355
+ ptr = InputMediaVideo(media=tg_id, caption=self.build_signature_caption(job, job.message_text))
356
356
  elif ctype == JobType.IMAGE:
357
- ptr = InputMediaPhoto(media=tg_id, caption=self.build_signature_caption(job))
357
+ ptr = InputMediaPhoto(media=tg_id, caption=self.build_signature_caption(job, job.message_text))
358
358
  elif ctype == JobType.ANIMATION:
359
- ptr = InputMediaAnimation(media=tg_id, caption=self.build_signature_caption(job))
359
+ ptr = InputMediaAnimation(media=tg_id, caption=self.build_signature_caption(job, job.message_text))
360
360
  tg_chunk.append(ptr)
361
361
 
362
362
  args["media"].append(tg_chunk)
@@ -177,7 +177,7 @@ class Handlers(object):
177
177
  url = new_url
178
178
  origin = Origin.YOUTUBE
179
179
  if origin is Origin.UNKNOWN:
180
- logging.info("Only Instagram, YouTube Shorts and YouTube Music are now supported. Skipping.")
180
+ logging.info("Only Instagram, YouTube Shorts, YouTube Music and X are now supported. Skipping.")
181
181
  continue
182
182
  entities, tg_file_ids = [], []
183
183
  uniq_id = Storage.compute_uniq(url)
@@ -12,7 +12,6 @@ from warp_beacon.storage import Storage
12
12
 
13
13
  class AsyncUploader(object):
14
14
  __JOE_BIDEN_WAKEUP = None
15
- pool_size = 1
16
15
 
17
16
  def __init__(self,
18
17
  loop: asyncio.AbstractEventLoop,
@@ -65,6 +64,9 @@ class AsyncUploader(object):
65
64
  def queue_task(self, job: UploadJob) -> None:
66
65
  self.job_queue.put_nowait(job)
67
66
 
67
+ async def callback_wrap(self, *args, **kwargs) -> None:
68
+ await self.upload_wrapper(*args, **kwargs)
69
+
68
70
  def do_work(self) -> None:
69
71
  logging.info("Upload worker started")
70
72
  while self.allow_loop:
@@ -103,16 +105,13 @@ class AsyncUploader(object):
103
105
  else:
104
106
  logging.info("Accepted upload job, file(s): '%s'", path)
105
107
 
106
- async def callback_wrap(*args, **kwargs) -> None:
107
- await self.upload_wrapper(*args, **kwargs)
108
-
109
108
  try:
110
109
  if job.job_failed:
111
110
  logging.info("URL '%s' download failed. Skipping upload job ...", job.url)
112
111
  if job.job_failed_msg: # we want to say something to user
113
112
  self.loop.call_soon_threadsafe(
114
113
  asyncio.create_task,
115
- callback_wrap(job)
114
+ self.callback_wrap(job)
116
115
  )
117
116
  self.process_done(uniq_id)
118
117
  continue
@@ -120,7 +119,7 @@ class AsyncUploader(object):
120
119
  if job.replay:
121
120
  self.loop.call_soon_threadsafe(
122
121
  asyncio.create_task,
123
- callback_wrap(job)
122
+ self.callback_wrap(job)
124
123
  )
125
124
  continue
126
125
 
@@ -129,7 +128,7 @@ class AsyncUploader(object):
129
128
  if job.job_warning_msg:
130
129
  self.loop.call_soon_threadsafe(
131
130
  asyncio.create_task,
132
- callback_wrap(job)
131
+ self.callback_wrap(job)
133
132
  )
134
133
  continue
135
134
  if in_process:
@@ -147,7 +146,7 @@ class AsyncUploader(object):
147
146
  job.canonical_name = db_data.get("canonical_name", "")
148
147
  self.loop.call_soon_threadsafe(
149
148
  asyncio.create_task,
150
- callback_wrap(job)
149
+ self.callback_wrap(job)
151
150
  )
152
151
  self.process_done(uniq_id)
153
152
  else:
@@ -155,7 +154,7 @@ class AsyncUploader(object):
155
154
  else:
156
155
  self.loop.call_soon_threadsafe(
157
156
  asyncio.create_task,
158
- callback_wrap(job)
157
+ self.callback_wrap(job)
159
158
  )
160
159
  self.process_done(uniq_id)
161
160
  except Exception as e:
@@ -165,4 +164,4 @@ class AsyncUploader(object):
165
164
  except Exception as e:
166
165
  logging.error("Exception occurred inside upload worker!")
167
166
  logging.exception(e)
168
- logging.info("Thread done")
167
+ logging.info("Thread done")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: warp_beacon
3
- Version: 2.8.17
3
+ Version: 2.8.19
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
@@ -1,2 +0,0 @@
1
- __version__ = "2.8.17"
2
-
File without changes
File without changes
File without changes
File without changes
File without changes