ryry-cli 6.19__tar.gz → 6.22__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 (35) hide show
  1. ryry_cli-6.22/MANIFEST.in +2 -0
  2. {ryry_cli-6.19/ryry_cli.egg-info → ryry_cli-6.22}/PKG-INFO +2 -1
  3. ryry_cli-6.22/ryry/assets/fonts/OFL.txt +92 -0
  4. ryry_cli-6.22/ryry/assets/fonts/ryry-report-cjk-bold.otf +0 -0
  5. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/constant.py +2 -2
  6. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/store.py +1 -1
  7. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/taskUtils.py +84 -20
  8. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/upload.py +11 -5
  9. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/utils.py +2 -4
  10. {ryry_cli-6.19 → ryry_cli-6.22/ryry_cli.egg-info}/PKG-INFO +2 -1
  11. {ryry_cli-6.19 → ryry_cli-6.22}/ryry_cli.egg-info/SOURCES.txt +3 -0
  12. {ryry_cli-6.19 → ryry_cli-6.22}/ryry_cli.egg-info/requires.txt +1 -0
  13. {ryry_cli-6.19 → ryry_cli-6.22}/setup.py +9 -2
  14. {ryry_cli-6.19 → ryry_cli-6.22}/LICENSE +0 -0
  15. {ryry_cli-6.19 → ryry_cli-6.22}/README.md +0 -0
  16. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/__init__.py +0 -0
  17. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/daemon_base.py +0 -0
  18. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/daemon_manager.py +0 -0
  19. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/main.py +0 -0
  20. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/proxy_manager.py +0 -0
  21. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/ryry_server_socket.py +0 -0
  22. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/ryry_service.py +0 -0
  23. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/ryry_webapi.py +0 -0
  24. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/ryry_widget.py +0 -0
  25. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/script_template/__init__.py +0 -0
  26. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/script_template/daemon.py +0 -0
  27. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/script_template/main.py +0 -0
  28. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/script_template/run.py +0 -0
  29. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/server_func.py +0 -0
  30. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/shared_memory.py +0 -0
  31. {ryry_cli-6.19 → ryry_cli-6.22}/ryry/task.py +0 -0
  32. {ryry_cli-6.19 → ryry_cli-6.22}/ryry_cli.egg-info/dependency_links.txt +0 -0
  33. {ryry_cli-6.19 → ryry_cli-6.22}/ryry_cli.egg-info/entry_points.txt +0 -0
  34. {ryry_cli-6.19 → ryry_cli-6.22}/ryry_cli.egg-info/top_level.txt +0 -0
  35. {ryry_cli-6.19 → ryry_cli-6.22}/setup.cfg +0 -0
@@ -0,0 +1,2 @@
1
+ include ryry/assets/fonts/OFL.txt
2
+ include ryry/assets/fonts/ryry-report-cjk-bold.otf
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ryry-cli
3
- Version: 6.19
3
+ Version: 6.22
4
4
  Summary: ryry tools
5
5
  Home-page: https://github.com/dalipenMedia
6
6
  Author: dalipen
@@ -23,6 +23,7 @@ Requires-Dist: gputil
23
23
  Requires-Dist: urlparser
24
24
  Requires-Dist: urllib3
25
25
  Requires-Dist: portalocker
26
+ Requires-Dist: boto3
26
27
  Requires-Dist: PyYAML
27
28
 
28
29
  ryry Python Tool
@@ -0,0 +1,92 @@
1
+ This Font Software is licensed under the SIL Open Font License,
2
+ Version 1.1.
3
+
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+ -----------------------------------------------------------
8
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
9
+ -----------------------------------------------------------
10
+
11
+ PREAMBLE
12
+ The goals of the Open Font License (OFL) are to stimulate worldwide
13
+ development of collaborative font projects, to support the font
14
+ creation efforts of academic and linguistic communities, and to
15
+ provide a free and open framework in which fonts may be shared and
16
+ improved in partnership with others.
17
+
18
+ The OFL allows the licensed fonts to be used, studied, modified and
19
+ redistributed freely as long as they are not sold by themselves. The
20
+ fonts, including any derivative works, can be bundled, embedded,
21
+ redistributed and/or sold with any software provided that any reserved
22
+ names are not used by derivative works. The fonts and derivatives,
23
+ however, cannot be released under any other type of license. The
24
+ requirement for fonts to remain under this license does not apply to
25
+ any document created using the fonts or their derivatives.
26
+
27
+ DEFINITIONS
28
+ "Font Software" refers to the set of files released by the Copyright
29
+ Holder(s) under this license and clearly marked as such. This may
30
+ include source files, build scripts and documentation.
31
+
32
+ "Reserved Font Name" refers to any names specified as such after the
33
+ copyright statement(s).
34
+
35
+ "Original Version" refers to the collection of Font Software
36
+ components as distributed by the Copyright Holder(s).
37
+
38
+ "Modified Version" refers to any derivative made by adding to,
39
+ deleting, or substituting -- in part or in whole -- any of the
40
+ components of the Original Version, by changing formats or by porting
41
+ the Font Software to a new environment.
42
+
43
+ "Author" refers to any designer, engineer, programmer, technical
44
+ writer or other person who contributed to the Font Software.
45
+
46
+ PERMISSION & CONDITIONS
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of the Font Software, to use, study, copy, merge, embed,
49
+ modify, redistribute, and sell modified and unmodified copies of the
50
+ Font Software, subject to the following conditions:
51
+
52
+ 1) Neither the Font Software nor any of its individual components, in
53
+ Original or Modified Versions, may be sold by itself.
54
+
55
+ 2) Original or Modified Versions of the Font Software may be bundled,
56
+ redistributed and/or sold with any software, provided that each copy
57
+ contains the above copyright notice and this license. These can be
58
+ included either as stand-alone text files, human-readable headers or
59
+ in the appropriate machine-readable metadata fields within text or
60
+ binary files as long as those fields can be easily viewed by the user.
61
+
62
+ 3) No Modified Version of the Font Software may use the Reserved Font
63
+ Name(s) unless explicit written permission is granted by the
64
+ corresponding Copyright Holder. This restriction only applies to the
65
+ primary font name as presented to the users.
66
+
67
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
68
+ Software shall not be used to promote, endorse or advertise any
69
+ Modified Version, except to acknowledge the contribution(s) of the
70
+ Copyright Holder(s) and the Author(s) or with their explicit written
71
+ permission.
72
+
73
+ 5) The Font Software, modified or unmodified, in part or in whole,
74
+ must be distributed entirely under this license, and must not be
75
+ distributed under any other license. The requirement for fonts to
76
+ remain under this license does not apply to any document created using
77
+ the Font Software.
78
+
79
+ TERMINATION
80
+ This license becomes null and void if any of the above conditions are
81
+ not met.
82
+
83
+ DISCLAIMER
84
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
85
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
86
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
87
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
88
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
89
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
90
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
91
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
92
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  #!!!!! do not change this file !!!!!
2
- app_version="6.19"
3
- app_bulld_anchor="Noh_2026-07-09 01:20:20.729214"
2
+ app_version="6.22"
3
+ app_bulld_anchor="Noh_2026-07-09 19:12:26.483937"
4
4
  app_name="ryry-cli"
5
5
  import sys, os
6
6
  if getattr(sys, 'frozen', False):
@@ -177,7 +177,7 @@ def extend():
177
177
  _genExtend()
178
178
  elif read_data["extend"].get("device_id", "") != read_data.get("deviceInfo", {}).get("device_id", ""):
179
179
  _genExtend()
180
- elif read_data["extend"].get("app", "") == "ryry-cli 6.19":
180
+ elif read_data["extend"].get("app", "") == "ryry-cli 6.20":
181
181
  _genExtend()
182
182
  elif any(k not in read_data["extend"] for k in ["device_id", "host_name", "cpu", "memory", "disk", "gpu"]):
183
183
  _genExtend()
@@ -292,25 +292,89 @@ def _sendCounterMarkdownReport(report_date, stats):
292
292
  }
293
293
  })
294
294
 
295
- def _reportFont(size, bold=False):
295
+ def _bundledReportFontPath():
296
+ return os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "fonts", "ryry-report-cjk-bold.otf")
297
+
298
+ def _reportFontCandidates(bold=False):
299
+ env_font = os.environ.get("RYRY_REPORT_FONT_BOLD" if bold else "RYRY_REPORT_FONT") or os.environ.get("RYRY_REPORT_FONT")
300
+ font_paths = [
301
+ env_font,
302
+ _bundledReportFontPath(),
303
+ "/System/Library/Fonts/STHeiti Medium.ttc" if bold else "/System/Library/Fonts/STHeiti Light.ttc",
304
+ "/System/Library/Fonts/PingFang.ttc",
305
+ "/Library/Fonts/Arial Unicode.ttf",
306
+ "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc" if bold else "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
307
+ "/usr/share/fonts/opentype/noto/NotoSansCJKSC-Bold.otf" if bold else "/usr/share/fonts/opentype/noto/NotoSansCJKSC-Regular.otf",
308
+ "/usr/share/fonts/truetype/noto/NotoSansCJK-Bold.ttc" if bold else "/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc",
309
+ "/usr/share/fonts/truetype/noto/NotoSansSC-Bold.otf" if bold else "/usr/share/fonts/truetype/noto/NotoSansSC-Regular.otf",
310
+ "/usr/share/fonts/noto-cjk/NotoSansCJK-Bold.ttc" if bold else "/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
311
+ "/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc" if bold else "/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
312
+ "/usr/share/fonts/opentype/adobe-source-han-sans/SourceHanSansSC-Bold.otf" if bold else "/usr/share/fonts/opentype/adobe-source-han-sans/SourceHanSansSC-Regular.otf",
313
+ "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",
314
+ "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc",
315
+ "/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf",
316
+ "/usr/share/fonts/truetype/arphic/uming.ttc",
317
+ "/usr/share/fonts/truetype/arphic/ukai.ttc",
318
+ "C:/Windows/Fonts/msyhbd.ttc" if bold else "C:/Windows/Fonts/msyh.ttc",
319
+ "C:/Windows/Fonts/simhei.ttf",
320
+ ]
321
+ font_paths.extend(_fontconfigCjkFonts(bold))
322
+
323
+ seen = set()
324
+ for font_path in font_paths:
325
+ if not font_path or font_path in seen:
326
+ continue
327
+ seen.add(font_path)
328
+ if os.path.exists(font_path):
329
+ yield font_path
330
+
331
+ def _fontconfigCjkFonts(bold=False):
296
332
  try:
297
- from PIL import ImageFont
298
- font_paths = [
299
- "/System/Library/Fonts/STHeiti Medium.ttc" if bold else "/System/Library/Fonts/STHeiti Light.ttc",
300
- "/System/Library/Fonts/PingFang.ttc",
301
- "/Library/Fonts/Arial Unicode.ttf",
302
- "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
303
- "/usr/share/fonts/opentype/noto/NotoSansCJKSC-Regular.otf",
304
- "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",
305
- "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
306
- "C:/Windows/Fonts/msyhbd.ttc" if bold else "C:/Windows/Fonts/msyh.ttc",
307
- ]
308
- for font_path in font_paths:
309
- if font_path and os.path.exists(font_path):
310
- return ImageFont.truetype(font_path, size)
311
- return ImageFont.load_default()
333
+ import subprocess
312
334
  except:
313
- return None
335
+ return []
336
+
337
+ style = "Bold" if bold else "Regular"
338
+ families = [
339
+ f"Noto Sans CJK SC:style={style}",
340
+ f"Noto Sans SC:style={style}",
341
+ f"Source Han Sans SC:style={style}",
342
+ "WenQuanYi Micro Hei",
343
+ "WenQuanYi Zen Hei",
344
+ "Microsoft YaHei",
345
+ "SimHei",
346
+ "Arial Unicode MS",
347
+ ]
348
+ cjk_markers = [
349
+ "notosanscjk", "notosanssc", "noto sans cjk", "noto sans sc",
350
+ "sourcehan", "source-han", "wenquanyi", "wqy", "droidsansfallback",
351
+ "uming", "ukai", "msyh", "simhei", "simsun", "arial unicode",
352
+ ]
353
+ font_paths = []
354
+ for family in families:
355
+ try:
356
+ font_path = subprocess.check_output(
357
+ ["fc-match", "-f", "%{file}", family],
358
+ stderr=subprocess.DEVNULL,
359
+ text=True,
360
+ timeout=2,
361
+ ).strip()
362
+ except:
363
+ continue
364
+ normalized = font_path.lower()
365
+ if font_path and os.path.exists(font_path) and any(marker in normalized for marker in cjk_markers):
366
+ font_paths.append(font_path)
367
+ return font_paths
368
+
369
+ def _reportFont(size, bold=False):
370
+ from PIL import ImageFont
371
+
372
+ for font_path in _reportFontCandidates(bold):
373
+ try:
374
+ return ImageFont.truetype(font_path, size)
375
+ except:
376
+ continue
377
+ raise RuntimeError("No CJK font found for daily report image. Install a CJK font or set RYRY_REPORT_FONT.")
314
378
 
315
379
  def _text(draw, xy, text, fill, font=None, **kwargs):
316
380
  try:
@@ -386,10 +450,10 @@ def _counterReportImageBytes(report_date, stats):
386
450
  plot_bottom = chart_bottom - 36
387
451
  plot_h = plot_bottom - plot_top
388
452
  max_count = max([s + f for s, f in zip(stats["hour_success"], stats["hour_fail"])] + [1])
389
- for i in range(0, 5):
390
- y = plot_bottom - int(plot_h * i / 4)
453
+ tick_values = list(range(0, max_count + 1)) if max_count <= 4 else [int(round(max_count * i / 4)) for i in range(0, 5)]
454
+ for tick in tick_values:
455
+ y = plot_bottom - int(plot_h * tick / max_count)
391
456
  draw.line((chart_left, y, chart_right, y), fill=grid, width=1)
392
- tick = int(max_count * i / 4)
393
457
  _text(draw, (chart_left - 36, y - 8), str(tick), muted, small_font)
394
458
 
395
459
  slot = chart_w / 24.0
@@ -79,7 +79,7 @@ def upload(src, taskUUID=None, needTranscode=False, keepItAlways=False, addition
79
79
  return ossurl
80
80
 
81
81
  def uploadByDomain(src, targetDomain,
82
- taskUUID, keepItAlways=False,
82
+ taskUUID=None, keepItAlways=False,
83
83
  needTranscode=False, additionalUrl=False):
84
84
  import os
85
85
  from pathlib import Path
@@ -93,10 +93,16 @@ def uploadByDomain(src, targetDomain,
93
93
 
94
94
  s3_config = getS3Config(parsed_domain)
95
95
  if s3_config:
96
+ fallback = s3_config.get("fallback")
96
97
  if isS3ConfigReady(s3_config):
97
98
  new_file_name = ''.join(str(uuid.uuid4()).split('-'))
98
- return uploadToS3(src, f"{new_file_name}.{ext}", s3_config, upload_path)
99
- return uploadByApiFallback(src, ext, s3_config.get("fallback"),
99
+ try:
100
+ return uploadToS3(src, f"{new_file_name}.{ext}", s3_config, upload_path)
101
+ except Exception as e:
102
+ if not fallback:
103
+ raise
104
+ print(f"S3 upload failed, fallback to api: {e}")
105
+ return uploadByApiFallback(src, ext, fallback,
100
106
  keepItAlways=keepItAlways,
101
107
  needTranscode=needTranscode,
102
108
  additionalUrl=additionalUrl)
@@ -117,7 +123,7 @@ def uploadByDomain(src, targetDomain,
117
123
  keepItAlways=keepItAlways,
118
124
  needTranscode=needTranscode,
119
125
  additionalUrl=additionalUrl)
120
-
126
+
121
127
  def parseDomainAndPath(targetDomain):
122
128
  from urllib.parse import urlparse
123
129
 
@@ -830,4 +836,4 @@ def downloadDir(url, saveDir, useCount=-1, autoDelete=False):
830
836
  print(f"url {url} not support")
831
837
  except Exception as e:
832
838
  print(f"downloadDir fail: {e}")
833
- return None
839
+ return None
@@ -385,8 +385,8 @@ def begin_restart(reason, update_cli=False, simple="https://pypi.python.org/simp
385
385
 
386
386
  K1 = "TFRBSTV0UkR3NXhocHc1eDlVdkZaUWsy"
387
387
  K2 = "TFVuYlRuZFRQMHpxYmU3TjVJSGw0YlVvdlJNQkR6"
388
- RK11 = "NjM2OTJhNjIyYTc3MWZlY2ZmMDkxYmM5OGUxMzBjNGE="
389
- RK22 = "MGUxM2E2MGQ0YjBiMDk3Yzc0NzIwOWNiZjdhM2I3ZjgxZWM3ODk1NTQzOGJmMjc1ZWJiY2QwMzM5ZjY0YmFjNw=="
388
+ RK11 = "ZWM2Njg2ZmUxNzA3Zjk5NTA4M2VjMTNmMTk3ODhiMTE=="
389
+ RK22 = "OGNjZTc2OTUzOGIzMGJlODljNWM5ZDVlYzcwYzAxNGMyYTk0N2VkMTIzM2RjNWMzYzA4YTI2OGJmYzk5OWFjMQ=="
390
390
  RK23 = "aHR0cHM6Ly8xMTg2NDlkOGY5ZDA0MGFhN2M1NWU4ZGE5NWRlYWE0OS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb20="
391
391
  def _decode_key(encoded_key):
392
392
  import base64
@@ -398,7 +398,6 @@ def _decode_key(encoded_key):
398
398
  # 如果UTF-8解码失败,直接返回字节数据的十六进制表示
399
399
  decoded_bytes = base64.b64decode(encoded_key.encode('utf-8'))
400
400
  return decoded_bytes.hex()
401
-
402
401
  def _encode_key(raw_input):
403
402
  import base64
404
403
  if isinstance(raw_input, bytes):
@@ -417,7 +416,6 @@ def _encode_key(raw_input):
417
416
  else:
418
417
  raise TypeError("Input must be str or bytes")
419
418
  return encoded.decode('utf-8')
420
-
421
419
  def check_restart():
422
420
  restart_file = os.path.join(constant.base_path, "restart")
423
421
  if os.path.exists(restart_file) == False:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ryry-cli
3
- Version: 6.19
3
+ Version: 6.22
4
4
  Summary: ryry tools
5
5
  Home-page: https://github.com/dalipenMedia
6
6
  Author: dalipen
@@ -23,6 +23,7 @@ Requires-Dist: gputil
23
23
  Requires-Dist: urlparser
24
24
  Requires-Dist: urllib3
25
25
  Requires-Dist: portalocker
26
+ Requires-Dist: boto3
26
27
  Requires-Dist: PyYAML
27
28
 
28
29
  ryry Python Tool
@@ -1,4 +1,5 @@
1
1
  LICENSE
2
+ MANIFEST.in
2
3
  README.md
3
4
  setup.py
4
5
  ryry/__init__.py
@@ -18,6 +19,8 @@ ryry/task.py
18
19
  ryry/taskUtils.py
19
20
  ryry/upload.py
20
21
  ryry/utils.py
22
+ ryry/assets/fonts/OFL.txt
23
+ ryry/assets/fonts/ryry-report-cjk-bold.otf
21
24
  ryry/script_template/__init__.py
22
25
  ryry/script_template/daemon.py
23
26
  ryry/script_template/main.py
@@ -10,4 +10,5 @@ gputil
10
10
  urlparser
11
11
  urllib3
12
12
  portalocker
13
+ boto3
13
14
  PyYAML
@@ -3,7 +3,7 @@ import os
3
3
  import subprocess
4
4
  import datetime
5
5
 
6
- ryry_version = "6.19"
6
+ ryry_version = "6.22"
7
7
  cur_dir = os.path.dirname(os.path.abspath(__file__))
8
8
  constanspy = os.path.join(cur_dir, "ryry", "constant.py")
9
9
  try:
@@ -51,6 +51,12 @@ setuptools.setup(
51
51
  long_description_content_type="text/markdown",
52
52
  url="https://github.com/dalipenMedia",
53
53
  packages=setuptools.find_packages(),
54
+ package_data={
55
+ 'ryry': [
56
+ 'assets/fonts/OFL.txt',
57
+ 'assets/fonts/ryry-report-cjk-bold.otf',
58
+ ],
59
+ },
54
60
  classifiers=[
55
61
  "Programming Language :: Python :: 3",
56
62
  "License :: OSI Approved :: MIT License",
@@ -70,6 +76,7 @@ setuptools.setup(
70
76
  'urlparser',
71
77
  'urllib3',
72
78
  'portalocker',
79
+ 'boto3',
73
80
  'PyYAML'
74
81
  ],
75
82
  extras_require={
@@ -84,4 +91,4 @@ setuptools.setup(
84
91
  # 'ryry/upload.py'
85
92
  # ],
86
93
  python_requires='>=3.9',
87
- )
94
+ )
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