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.
@@ -1,2 +1,2 @@
1
- __version__ = "2.8.14"
1
+ __version__ = "2.8.16"
2
2
 
@@ -318,7 +318,7 @@ class AsyncDownloader(object):
318
318
  if items:
319
319
  # success
320
320
  for job in fail_handler.get_failed_jobs():
321
- self.queue_task(job)
321
+ self.queue_task(job["job"])
322
322
  # media info processing
323
323
  for item in items:
324
324
  media_info = {"filesize": 0}
@@ -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 = -1
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(pickle.loads(document["job_data"]))
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
@@ -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")))
@@ -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!")
@@ -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 message_id in self.callbacks:
128
- if job.job_failed:
129
- logging.info("URL '%s' download failed. Skipping upload job ...", job.url)
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
- self.callbacks[message_id]["callback"](job)
114
+ callback_wrap(job)
143
115
  )
144
- self.remove_callback(message_id)
145
- continue
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
- if job.job_warning:
148
- logging.info("Job warning occurred ...")
149
- if job.job_warning_msg:
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
- self.callbacks[message_id]["callback"](job)
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
- self.remove_callback(message_id)
152
+ else:
153
+ self.queue_task(job)
183
154
  else:
184
- logging.info("No callback no call!!")
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
- 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.14
3
+ Version: 2.8.16
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
@@ -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=TZgBJIjZg_hpyHZh7yBDpvAmjXgQy0i383jyxYXsn9A,24
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=EBS7k8vmn3ya_Ud0tPHtBo7xUMUP9tabmYk5Ase_zyw,20818
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=5ODu4b8ndZWAcHIXrcUufsWFihetzNUoAi8IgAkreyQ,998
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=xeSzUxNZf8zjU5K_UkwtzBzB6nIml1UPI0g1ITQdoEQ,20675
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=2XJ3v9sVsWa3V3cji9FegO7l5JNqXqXxQrxIOzI2fyE,10793
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=dR0VjIGSr859TTdorA2tKnjH7EpQOXnG71aXhZFaMl0,5863
59
- warp_beacon-2.8.14.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
60
- warp_beacon-2.8.14.dist-info/METADATA,sha256=8eP6Ho7mF0Uq7jz0-MLzRb8niSFPPh3ewdFrmN3BH0I,23236
61
- warp_beacon-2.8.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
- warp_beacon-2.8.14.dist-info/entry_points.txt,sha256=eSB61Rb89d56WY0O-vEIQwkn18J-4CMrJcLA_R_8h3g,119
63
- warp_beacon-2.8.14.dist-info/top_level.txt,sha256=RraB0PWGvRK2zPYkuICKNgStLG1C5s7rPHHJEHJbkgA,1510
64
- warp_beacon-2.8.14.dist-info/RECORD,,
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,,