warp-beacon 2.2.4__py3-none-any.whl → 2.2.5__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.2.4"
1
+ __version__ = "2.2.5"
2
2
 
@@ -35,14 +35,16 @@ class AsyncDownloader(object):
35
35
  self.allow_loop = multiprocessing.Value('i', 1)
36
36
  self.uploader = uploader
37
37
  self.workers_count = workers_count
38
- self.acc_selector = AccountSelector(ACC_FILE)
38
+ AccountSelector.register('AccoutSelector', AccountSelector)
39
39
 
40
40
  def __del__(self) -> None:
41
41
  self.stop_all()
42
42
 
43
43
  def start(self) -> None:
44
+ self.acc_selector = AccountSelector(ACC_FILE)
45
+ self.acc_selector.start()
44
46
  for _ in range(self.workers_count):
45
- proc = multiprocessing.Process(target=self.do_work)
47
+ proc = multiprocessing.Process(target=self.do_work, args=(self.acc_selector,))
46
48
  self.workers.append(proc)
47
49
  proc.start()
48
50
 
@@ -53,7 +55,8 @@ class AsyncDownloader(object):
53
55
  if media_type == JobType.VIDEO:
54
56
  video_info = VideoInfo(path)
55
57
  media_info = video_info.get_finfo(tuple(fr_media_info.keys()))
56
- media_info.update(fr_media_info)
58
+ if fr_media_info:
59
+ media_info.update(fr_media_info)
57
60
  if not media_info.get("thumb", None):
58
61
  media_info["thumb"] = video_info.generate_thumbnail()
59
62
  media_info["has_sound"] = video_info.has_sound()
@@ -66,18 +69,18 @@ class AsyncDownloader(object):
66
69
 
67
70
  return media_info
68
71
 
69
- def try_next_account(self, job: DownloadJob, report_error: str = None) -> None:
72
+ def try_next_account(self, selector: AccountSelector, job: DownloadJob, report_error: str = None) -> None:
70
73
  logging.warning("Switching account!")
71
74
  if job.account_switches > self.acc_selector.count_service_accounts(job.job_origin):
72
75
  raise AllAccountsFailed("All config accounts failed!")
73
76
  if report_error:
74
- self.acc_selector.bump_acc_fail("rate_limits")
75
- self.acc_selector.next()
76
- cur_acc = self.acc_selector.get_current()
77
+ selector.bump_acc_fail("rate_limits")
78
+ selector.next()
79
+ cur_acc = selector.get_current()
77
80
  logging.info("Current account: '%s'", str(cur_acc))
78
81
  job.account_switches += 1
79
82
 
80
- def do_work(self) -> None:
83
+ def do_work(self, selector: AccountSelector) -> None:
81
84
  logging.info("download worker started")
82
85
  while self.allow_loop.value == 1:
83
86
  try:
@@ -97,16 +100,16 @@ class AsyncDownloader(object):
97
100
  self.acc_selector.set_module(job.job_origin)
98
101
  if job.job_origin is Origin.INSTAGRAM:
99
102
  from warp_beacon.scraper.instagram.instagram import InstagramScraper
100
- actor = InstagramScraper(self.acc_selector.get_current())
103
+ actor = InstagramScraper(selector.get_current())
101
104
  elif job.job_origin is Origin.YT_SHORTS:
102
105
  from warp_beacon.scraper.youtube.shorts import YoutubeShortsScraper
103
- actor = YoutubeShortsScraper(self.acc_selector.get_current())
106
+ actor = YoutubeShortsScraper(selector.get_current())
104
107
  elif job.job_origin is Origin.YT_MUSIC:
105
108
  from warp_beacon.scraper.youtube.music import YoutubeMusicScraper
106
- actor = YoutubeMusicScraper(self.acc_selector.get_current())
109
+ actor = YoutubeMusicScraper(selector.get_current())
107
110
  elif job.job_origin is Origin.YOUTUBE:
108
111
  from warp_beacon.scraper.youtube.youtube import YoutubeScraper
109
- actor = YoutubeScraper(self.acc_selector.get_current())
112
+ actor = YoutubeScraper(selector.get_current())
110
113
  actor.send_message_to_admin_func = self.send_message_to_admin
111
114
  actor.auth_event = self.auth_event
112
115
  while True:
@@ -141,7 +144,7 @@ class AsyncDownloader(object):
141
144
  break
142
145
  job.unvailable_error_count += 1
143
146
  logging.info("Trying to switch account")
144
- self.acc_selector.next()
147
+ selector.next()
145
148
  self.job_queue.put(job)
146
149
  break
147
150
  except TimeOut as e:
@@ -169,13 +172,13 @@ class AsyncDownloader(object):
169
172
  except IGRateLimitOccurred as e:
170
173
  logging.warning("IG ratelimit occurred :(")
171
174
  logging.exception(e)
172
- self.try_next_account(job, report_error="rate_limits")
175
+ self.try_next_account(selector, job, report_error="rate_limits")
173
176
  self.job_queue.put(job)
174
177
  break
175
178
  except CaptchaIssue as e:
176
179
  logging.warning("Challange occurred!")
177
180
  logging.exception(e)
178
- self.try_next_account(job)
181
+ self.try_next_account(selector, job)
179
182
  self.job_queue.put(job)
180
183
  break
181
184
  except YotubeLiveError as e:
@@ -334,6 +337,7 @@ class AsyncDownloader(object):
334
337
  #proc.terminate()
335
338
  logging.info("process #%d stopped", proc.pid)
336
339
  self.workers.clear()
340
+ self.acc_selector.shutdown()
337
341
 
338
342
  def queue_task(self, job: DownloadJob) -> str:
339
343
  self.job_queue.put_nowait(job)
@@ -4,11 +4,13 @@ import re
4
4
 
5
5
  from itertools import cycle
6
6
 
7
+ from multiprocessing.managers import BaseManager
8
+
7
9
  from warp_beacon.jobs import Origin
8
10
 
9
11
  import logging
10
12
 
11
- class AccountSelector(object):
13
+ class AccountSelector(BaseManager):
12
14
  accounts = []
13
15
  acc_pool = None
14
16
  current = None
@@ -26,6 +28,8 @@ class AccountSelector(object):
26
28
  self.load_yt_sessions()
27
29
  else:
28
30
  raise ValueError("Accounts file not found")
31
+
32
+ super().__init__()
29
33
 
30
34
  def __del__(self) -> None:
31
35
  pass
@@ -3,16 +3,12 @@ import pathlib
3
3
  import time
4
4
  import socket
5
5
  import ssl
6
-
7
6
  #from abc import abstractmethod
8
- from typing import Callable, Union
9
-
7
+ from typing import Callable, Union, Optional
10
8
  import json
11
-
12
- import requests
13
9
  import urllib
10
+ import urllib.request
14
11
  import http.client
15
- import requests
16
12
  from PIL import Image
17
13
 
18
14
  from warp_beacon.scraper.abstract import ScraperAbstract
@@ -106,11 +102,11 @@ class YoutubeAbstract(ScraperAbstract):
106
102
  if "yt_download_" in i:
107
103
  os.unlink("%s/%s" % (self.DOWNLOAD_DIR, i))
108
104
 
109
- def download_thumbnail(self, url: str, timeout: int) -> Union[io.BytesIO, None]:
105
+ def download_thumbnail(self, url: str, timeout: int) -> Optional[io.BytesIO]:
110
106
  try:
111
- reply = requests.get(url, timeout=(timeout, timeout))
112
- if reply.ok and reply.status_code == 200:
113
- image = Image.open(io.BytesIO(reply.content))
107
+ logging.info("Youtube thumbnail url '%s'", url)
108
+ with urllib.request.urlopen(url, timeout=timeout) as f:
109
+ image = Image.open(io.BytesIO(f.read()))
114
110
  image = MediaInfoAbstract.shrink_image_to_fit(image)
115
111
  io_buf = io.BytesIO()
116
112
  image.save(io_buf, format='JPEG')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: warp_beacon
3
- Version: 2.2.4
3
+ Version: 2.2.5
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
@@ -3,7 +3,7 @@ lib/systemd/system/warp_beacon.service,sha256=lPmHqLqcI2eIV7nwHS0qcALQrznixqJuww
3
3
  var/warp_beacon/accounts.json,sha256=rKFQM_b9eoDS4mJ1B_SZNolPLXx1SQdQMdY2F_ZcBt8,1523
4
4
  var/warp_beacon/placeholder.gif,sha256=cE5CGJVaop4Sx21zx6j4AyoHU0ncmvQuS2o6hJfEH88,6064
5
5
  warp_beacon/__init__.py,sha256=_rThNODmz0nDp_n4mWo_HKaNFE5jk1_7cRhHyYaencI,163
6
- warp_beacon/__version__.py,sha256=l6zu04dv2t1qh90dAzKYcYOPQTDKoD9W64JoSDPre68,23
6
+ warp_beacon/__version__.py,sha256=1N7zioGPswYd_sGrglKng-K01jHFk6oVItbCYK4wBSM,23
7
7
  warp_beacon/warp_beacon.py,sha256=7KEtZDj-pdhtl6m-zFLsSojs1ZR4o7L0xbqtdmYPvfE,342
8
8
  warp_beacon/compress/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  warp_beacon/compress/video.py,sha256=_PDMVYCyzLYxHv1uZmmzGcG_8rjaZr7BTXsXTTy_oS4,2846
@@ -19,14 +19,14 @@ warp_beacon/mediainfo/silencer.py,sha256=MgUc9Ibbhjhg9GbJMNfJqrdDkMsQShZkQ1sCwvW
19
19
  warp_beacon/mediainfo/video.py,sha256=AIRy_op_BvehsjarM1rvT5Qo0QWwf-Q6xVVd_aCnbJ4,2505
20
20
  warp_beacon/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  warp_beacon/scheduler/scheduler.py,sha256=8gjW0CLuX3KyYpSDSkRE0i48AsJbi-fQ2qJZAJ-yt_s,2411
22
- warp_beacon/scraper/__init__.py,sha256=0ZxLxzXweg1LJ1qBRJ1s3EOKe7xpUrp9Nj26gjsLMOQ,14734
22
+ warp_beacon/scraper/__init__.py,sha256=mY0DdzEy1ZV5wmirwuV9f6e57LbNVzH3ZVPMnbUPGB4,14908
23
23
  warp_beacon/scraper/abstract.py,sha256=aNZ9ypF9B8BjflcIwi-7wEzIqF-XPeF0xvfX9CP_iIw,2708
24
- warp_beacon/scraper/account_selector.py,sha256=RYBmLDhE-fqaLqQiQ6zVd13q-1pqQ3F3nYJu2Gx3gV4,2881
24
+ warp_beacon/scraper/account_selector.py,sha256=x1TAqHVWtxvhzKCTBERpHoUJ0fOcnswStQjEcDxkrFU,2960
25
25
  warp_beacon/scraper/exceptions.py,sha256=lHsPrYy5iYnHsIdUHqRxZmzlqrkNj_TS4TkiTJfWhTs,1326
26
26
  warp_beacon/scraper/instagram/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  warp_beacon/scraper/instagram/instagram.py,sha256=iT66IM7nsbVDWQzBW-CJUWDBjoBbRZH4BHx6TJw3oqo,13517
28
28
  warp_beacon/scraper/youtube/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- warp_beacon/scraper/youtube/abstract.py,sha256=UX6TWEM5x4C_FZpifB8IGW9WRgrxYcctA_HMqR_XEvo,6051
29
+ warp_beacon/scraper/youtube/abstract.py,sha256=oL0ZtgPdyBMe_BGQS31T2kQHTceSM2vlWPhB57XQSrc,6048
30
30
  warp_beacon/scraper/youtube/music.py,sha256=8TguqXc1BC9Slp09BzCU8dtQ6BnyKwzZSLLFHpqDHtg,1498
31
31
  warp_beacon/scraper/youtube/shorts.py,sha256=pHfvEBau8Zp7Ar3LBuPmjqYq8fmjJUQvzeZXujQMpG4,1203
32
32
  warp_beacon/scraper/youtube/youtube.py,sha256=K98n2TSJaDZt-xT7mADZL1UEf2exIYm0Wnenn2GAYfI,2250
@@ -37,9 +37,9 @@ warp_beacon/telegram/handlers.py,sha256=LWDdJBLuB-ImemPtzldgm9UY42T2mr0yJsHHQZDm
37
37
  warp_beacon/telegram/placeholder_message.py,sha256=u5kVfTjGmVYkwA5opniRltHXGpsdSxI41WEde8J5os0,6418
38
38
  warp_beacon/telegram/utils.py,sha256=ikfwmuDvd0XtOuwP29tZPjAz7kwiGSSu_QR-vpv6pMY,2352
39
39
  warp_beacon/uploader/__init__.py,sha256=rsUkzzmtaeQY-kNkcIiPsrayS9idFKY3hBC71mR19XE,4743
40
- warp_beacon-2.2.4.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
41
- warp_beacon-2.2.4.dist-info/METADATA,sha256=9HaUBvtNMkx_7b9I5sF74v2M_DTjTiSgEjFy6O-Idqw,21250
42
- warp_beacon-2.2.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
43
- warp_beacon-2.2.4.dist-info/entry_points.txt,sha256=eSB61Rb89d56WY0O-vEIQwkn18J-4CMrJcLA_R_8h3g,119
44
- warp_beacon-2.2.4.dist-info/top_level.txt,sha256=ALb_Ft_eG-OY4_m0TWUifNUOZsrx483L-zw7G7vqXoc,971
45
- warp_beacon-2.2.4.dist-info/RECORD,,
40
+ warp_beacon-2.2.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
41
+ warp_beacon-2.2.5.dist-info/METADATA,sha256=GJue-K8EOklIVmECLOVU4NFd6LxdaX1hj8WA6E_m7Ck,21250
42
+ warp_beacon-2.2.5.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
43
+ warp_beacon-2.2.5.dist-info/entry_points.txt,sha256=eSB61Rb89d56WY0O-vEIQwkn18J-4CMrJcLA_R_8h3g,119
44
+ warp_beacon-2.2.5.dist-info/top_level.txt,sha256=ALb_Ft_eG-OY4_m0TWUifNUOZsrx483L-zw7G7vqXoc,971
45
+ warp_beacon-2.2.5.dist-info/RECORD,,