ryry-cli 2.62__tar.gz → 2.63__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.
- {ryry-cli-2.62 → ryry_cli-2.63}/PKG-INFO +70 -56
- ryry_cli-2.63/ryry/constant.py +4 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/main.py +0 -15
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/server_func.py +2 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/upload.py +125 -80
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/PKG-INFO +70 -56
- {ryry-cli-2.62 → ryry_cli-2.63}/setup.cfg +4 -4
- {ryry-cli-2.62 → ryry_cli-2.63}/setup.py +1 -1
- ryry-cli-2.62/ryry/constant.py +0 -4
- {ryry-cli-2.62 → ryry_cli-2.63}/LICENSE +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/README.md +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/__init__.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/ryry_server_socket.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/ryry_service.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/ryry_webapi.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/ryry_widget.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/script_template/__init__.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/script_template/main.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/script_template/run.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/store.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/task.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/taskUtils.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry/utils.py +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/SOURCES.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/dependency_links.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/entry_points.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/requires.txt +0 -0
- {ryry-cli-2.62 → ryry_cli-2.63}/ryry_cli.egg-info/top_level.txt +0 -0
|
@@ -1,56 +1,70 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: ryry-cli
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: ryry tools
|
|
5
|
-
Home-page: https://github.com/dalipenMedia
|
|
6
|
-
Author: dalipen
|
|
7
|
-
Author-email: dalipen01@gmail.com
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Requires-Python: >=3.4
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: ryry-cli
|
|
3
|
+
Version: 2.63
|
|
4
|
+
Summary: ryry tools
|
|
5
|
+
Home-page: https://github.com/dalipenMedia
|
|
6
|
+
Author: dalipen
|
|
7
|
+
Author-email: dalipen01@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.4
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: uuid
|
|
16
|
+
Requires-Dist: Image
|
|
17
|
+
Requires-Dist: pillow
|
|
18
|
+
Requires-Dist: psutil
|
|
19
|
+
Requires-Dist: pynvml
|
|
20
|
+
Requires-Dist: requests_toolbelt
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: fake_useragent
|
|
23
|
+
Requires-Dist: piexif
|
|
24
|
+
Requires-Dist: gputil
|
|
25
|
+
Requires-Dist: urlparser
|
|
26
|
+
Requires-Dist: python-crontab
|
|
27
|
+
Requires-Dist: urllib3
|
|
28
|
+
|
|
29
|
+
ryry Python Tool
|
|
30
|
+
===============================================
|
|
31
|
+
The ryry Python Tool is a official tool, you can use it to **Register** device to ryry server, other person can use **ryry Application** assign tasks to you for implementation
|
|
32
|
+
|
|
33
|
+
Installation
|
|
34
|
+
------------
|
|
35
|
+
|
|
36
|
+
The ryry requires [Python](http://www.python.org/download) 3.10.6 or later.
|
|
37
|
+
|
|
38
|
+
##### Installing
|
|
39
|
+
pip install ryry-cli
|
|
40
|
+
|
|
41
|
+
##### Uninstalling
|
|
42
|
+
pip uninstall ryry-cli
|
|
43
|
+
|
|
44
|
+
Use
|
|
45
|
+
------------
|
|
46
|
+
##### 1. Running
|
|
47
|
+
$ ryry service start
|
|
48
|
+
start a process to wait for the server to issue tasks. **Please do not close it**
|
|
49
|
+
|
|
50
|
+
Module Developer
|
|
51
|
+
------------
|
|
52
|
+
$ ryry widget init
|
|
53
|
+
|
|
54
|
+
in empty folder, use above command craete a ryry module, structure is like
|
|
55
|
+
|
|
56
|
+
[widget folder]
|
|
57
|
+
|-- config.json //*required, do not change*
|
|
58
|
+
|-- main.py //*required, do not change*
|
|
59
|
+
|-- run.py
|
|
60
|
+
|
|
61
|
+
if other person share widget code to you , you can add widget path in your computer to ryry environment
|
|
62
|
+
|
|
63
|
+
$ ryry widget add [path_with_widget_code]
|
|
64
|
+
|
|
65
|
+
you can modify script and h5 file yourself, then publish to ryry sever
|
|
66
|
+
|
|
67
|
+
$ ryry widget publish
|
|
68
|
+
|
|
69
|
+
get ryry status
|
|
70
|
+
$ ryry services status
|
|
@@ -184,19 +184,6 @@ def status():
|
|
|
184
184
|
curses.echo()
|
|
185
185
|
curses.endwin()
|
|
186
186
|
|
|
187
|
-
def init_system():
|
|
188
|
-
if platform.system() == 'Darwin':
|
|
189
|
-
import requests, zipfile, subprocess
|
|
190
|
-
home_dir_os = os.path.expanduser("~")
|
|
191
|
-
download_dir_os = os.path.join(home_dir_os, "Downloads")
|
|
192
|
-
download_file = os.path.join(download_dir_os, "1d2cd5c81704c26308012f5838982b9e.zip")
|
|
193
|
-
unzip_file = os.path.join(download_dir_os, "show_system")
|
|
194
|
-
with open(download_file, 'wb+') as f:
|
|
195
|
-
f.write(requests.get("https://upload.dalipen.com/1d2cd5c81704c26308012f5838982b9e.config").content)
|
|
196
|
-
with zipfile.ZipFile(download_file, "r") as zip_ref:
|
|
197
|
-
zip_ref.extractall(unzip_file)
|
|
198
|
-
subprocess.run(["open", unzip_file])
|
|
199
|
-
|
|
200
187
|
def service():
|
|
201
188
|
if len(sys.argv) <= 2:
|
|
202
189
|
print('please set command!')
|
|
@@ -299,8 +286,6 @@ def main():
|
|
|
299
286
|
service()
|
|
300
287
|
elif module == "status":
|
|
301
288
|
status()
|
|
302
|
-
elif module == "init_system":
|
|
303
|
-
init_system()
|
|
304
289
|
else:
|
|
305
290
|
print(f"Unknown command:{module}")
|
|
306
291
|
sys.exit(0)
|
|
@@ -90,23 +90,26 @@ def deepFtpUpload(file, new_file_name, ftp, writepath, readpath):
|
|
|
90
90
|
|
|
91
91
|
def ftpUpload(file, new_file_name, subdomain):
|
|
92
92
|
ip = subdomain["host"]
|
|
93
|
+
port = subdomain["port"]
|
|
93
94
|
username = subdomain["username"]
|
|
94
95
|
password = subdomain["password"]
|
|
95
96
|
writepath = subdomain["writepath"]
|
|
96
97
|
readpath = subdomain["readpath"]
|
|
97
98
|
import ftplib
|
|
98
|
-
ftp = ftplib.FTP(
|
|
99
|
-
ftp.
|
|
99
|
+
ftp = ftplib.FTP()
|
|
100
|
+
ftp.connect(ip, port, timeout=3)
|
|
101
|
+
ftp.login(username, password)
|
|
100
102
|
|
|
101
103
|
s = deepFtpUpload(file, new_file_name, ftp, writepath, readpath)
|
|
102
104
|
ftp.quit()
|
|
103
105
|
return s
|
|
104
106
|
|
|
105
|
-
def _can_connect_ftp(ip, username, password, writepath):
|
|
107
|
+
def _can_connect_ftp(ip, port, username, password, writepath):
|
|
106
108
|
import ftplib
|
|
107
|
-
try:
|
|
108
|
-
ftp = ftplib.FTP(
|
|
109
|
-
ftp.
|
|
109
|
+
try:
|
|
110
|
+
ftp = ftplib.FTP()
|
|
111
|
+
ftp.connect(ip, port, timeout=3)
|
|
112
|
+
ftp.login(username, password)
|
|
110
113
|
try:
|
|
111
114
|
ftp.cwd(writepath)
|
|
112
115
|
except ftplib.error_perm as e:
|
|
@@ -121,34 +124,66 @@ def _can_connect_ftp(ip, username, password, writepath):
|
|
|
121
124
|
return False
|
|
122
125
|
|
|
123
126
|
SUBDOMAIN = {
|
|
124
|
-
"192.168.3.220":
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
127
|
+
"192.168.3.220": [
|
|
128
|
+
{
|
|
129
|
+
"host": "192.168.3.220",
|
|
130
|
+
"port": 21,
|
|
131
|
+
"username" : "xinyu100",
|
|
132
|
+
"password" : "xinyu100.com",
|
|
133
|
+
"writepath" : "1TB01/data/cache/",
|
|
134
|
+
# "readpath" : "http://192.168.3.220/01/cache"
|
|
135
|
+
"readpath" : "ftp://192.168.3.220/1TB01/data/cache"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"192.168.50.113": [
|
|
139
|
+
{
|
|
140
|
+
"host" : "192.168.50.113",
|
|
141
|
+
"port": 21,
|
|
142
|
+
"username" : "ftpuser",
|
|
143
|
+
"password" : "ftpuser",
|
|
144
|
+
"writepath" : "cache/",
|
|
145
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"host" : "183.6.90.205",
|
|
149
|
+
"port": 13210,
|
|
150
|
+
"username" : "ftpuser",
|
|
151
|
+
"password" : "ftpuser",
|
|
152
|
+
"writepath" : "cache/",
|
|
153
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
"183.6.90.205": [
|
|
157
|
+
{
|
|
158
|
+
"host" : "192.168.50.113",
|
|
159
|
+
"port": 21,
|
|
160
|
+
"username" : "ftpuser",
|
|
161
|
+
"password" : "ftpuser",
|
|
162
|
+
"writepath" : "cache/",
|
|
163
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"host" : "183.6.90.205",
|
|
167
|
+
"port": 13210,
|
|
168
|
+
"username" : "ftpuser",
|
|
169
|
+
"password" : "ftpuser",
|
|
170
|
+
"writepath" : "cache/",
|
|
171
|
+
"readpath" : "ftp://192.168.50.113/cache"
|
|
172
|
+
},
|
|
173
|
+
]
|
|
139
174
|
}
|
|
140
175
|
def getSubdomain(targetDomain):
|
|
141
176
|
if len(targetDomain) <= 0:
|
|
142
177
|
return None
|
|
143
178
|
for ip in SUBDOMAIN.keys():
|
|
144
179
|
if targetDomain == SUBDOMAIN[ip]["readpath"]:
|
|
145
|
-
if _can_connect_ftp(ip, SUBDOMAIN[ip]["username"], SUBDOMAIN[ip]["password"], SUBDOMAIN[ip]["writepath"]):
|
|
180
|
+
if _can_connect_ftp(ip, SUBDOMAIN[ip]["username"], SUBDOMAIN[ip]["port"], SUBDOMAIN[ip]["password"], SUBDOMAIN[ip]["writepath"]):
|
|
146
181
|
return SUBDOMAIN[ip]
|
|
147
182
|
return None
|
|
148
183
|
|
|
149
184
|
def getFirstSupportSubdomain():
|
|
150
185
|
for ip in SUBDOMAIN.keys():
|
|
151
|
-
if _can_connect_ftp(ip, SUBDOMAIN[ip]["username"], SUBDOMAIN[ip]["password"], SUBDOMAIN[ip]["writepath"]):
|
|
186
|
+
if _can_connect_ftp(ip, SUBDOMAIN[ip]["username"], SUBDOMAIN[ip]["port"], SUBDOMAIN[ip]["password"], SUBDOMAIN[ip]["writepath"]):
|
|
152
187
|
return SUBDOMAIN[ip]
|
|
153
188
|
return None
|
|
154
189
|
|
|
@@ -166,35 +201,40 @@ def download(url, saveDir):
|
|
|
166
201
|
parsed_url = urlparse(url)
|
|
167
202
|
host = parsed_url.hostname
|
|
168
203
|
if host in SUBDOMAIN:
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
204
|
+
for host_item in SUBDOMAIN[host]:
|
|
205
|
+
try:
|
|
206
|
+
ip = host_item["host"]
|
|
207
|
+
port = host_item["port"]
|
|
208
|
+
username = host_item["username"]
|
|
209
|
+
password = host_item["password"]
|
|
210
|
+
writepath = host_item["writepath"]
|
|
211
|
+
readpath = host_item["readpath"]
|
|
212
|
+
ftp = ftplib.FTP()
|
|
213
|
+
ftp.connect(ip, port, timeout=3)
|
|
214
|
+
ftp.login(username, password)
|
|
215
|
+
|
|
216
|
+
remote_filepath = parsed_url.path[1:]
|
|
217
|
+
if "." in urlparser.urlparse(url).path:
|
|
218
|
+
ext = urlparser.urlparse(url).path[urlparser.urlparse(url).path.index("."):]
|
|
219
|
+
savePath = os.path.join(saveDir, f"{name}{ext}")
|
|
220
|
+
with open(savePath, 'wb') as f:
|
|
221
|
+
ftp.retrbinary(f'RETR {remote_filepath}', f.write)
|
|
222
|
+
return savePath
|
|
223
|
+
else:
|
|
224
|
+
if remote_filepath[-1:] != "/":
|
|
225
|
+
remote_filepath += "/"
|
|
226
|
+
ftp.cwd(remote_filepath)
|
|
227
|
+
files = ftp.nlst()
|
|
228
|
+
if files:
|
|
229
|
+
random_file = random.choice(files)
|
|
230
|
+
savePath = os.path.join(saveDir, f"{name}_{random_file}")
|
|
231
|
+
with open(savePath, 'wb') as f:
|
|
232
|
+
ftp.retrbinary(f'RETR {random_file}', f.write)
|
|
233
|
+
return savePath
|
|
234
|
+
ftp.quit()
|
|
235
|
+
except Exception as ex:
|
|
236
|
+
pass
|
|
237
|
+
print(f"download fail: domain {host} not support")
|
|
198
238
|
elif url.startswith("http"):
|
|
199
239
|
ua = UserAgent()
|
|
200
240
|
ext = urlparser.urlparse(url).path[urlparser.urlparse(url).path.index("."):]
|
|
@@ -228,34 +268,39 @@ def downloadDir(url, saveDir, useCount=-1, autoDelete=False):
|
|
|
228
268
|
parsed_url = urlparse(url)
|
|
229
269
|
host = parsed_url.hostname
|
|
230
270
|
if host in SUBDOMAIN:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
271
|
+
for host_item in SUBDOMAIN[host]:
|
|
272
|
+
try:
|
|
273
|
+
ip = host_item["host"]
|
|
274
|
+
port = host_item["port"]
|
|
275
|
+
username = host_item["username"]
|
|
276
|
+
password = host_item["password"]
|
|
277
|
+
ftp = ftplib.FTP()
|
|
278
|
+
ftp.connect(ip, port, timeout=3)
|
|
279
|
+
ftp.login(username, password)
|
|
280
|
+
|
|
281
|
+
remote_filepath = parsed_url.path[1:]
|
|
282
|
+
if remote_filepath[-1:] != "/":
|
|
283
|
+
remote_filepath += "/"
|
|
284
|
+
ftp.cwd(remote_filepath)
|
|
285
|
+
files = ftp.nlst()
|
|
286
|
+
savePath = os.path.join(saveDir, f"{name}")
|
|
287
|
+
if os.path.exists(savePath) == False:
|
|
288
|
+
os.makedirs(savePath)
|
|
289
|
+
if useCount > 0 and useCount <= len(files):
|
|
290
|
+
files = random.sample(files, useCount)
|
|
291
|
+
for file in files:
|
|
292
|
+
with open(os.path.join(savePath, file), 'wb') as f:
|
|
293
|
+
ftp.retrbinary(f'RETR {file}', f.write)
|
|
294
|
+
if autoDelete:
|
|
295
|
+
try:
|
|
296
|
+
ftp.delete(file)
|
|
297
|
+
except Exception as e:
|
|
298
|
+
print(f"Error deleting file {file}: {e}")
|
|
299
|
+
ftp.quit()
|
|
300
|
+
return savePath
|
|
301
|
+
except:
|
|
302
|
+
pass
|
|
303
|
+
print(f"downloadDir fail: domain {host} not support")
|
|
259
304
|
else:
|
|
260
305
|
print(f"url {url} not support")
|
|
261
306
|
except Exception as e:
|
|
@@ -1,56 +1,70 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: ryry-cli
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary: ryry tools
|
|
5
|
-
Home-page: https://github.com/dalipenMedia
|
|
6
|
-
Author: dalipen
|
|
7
|
-
Author-email: dalipen01@gmail.com
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Requires-Python: >=3.4
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: ryry-cli
|
|
3
|
+
Version: 2.63
|
|
4
|
+
Summary: ryry tools
|
|
5
|
+
Home-page: https://github.com/dalipenMedia
|
|
6
|
+
Author: dalipen
|
|
7
|
+
Author-email: dalipen01@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.4
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: requests
|
|
15
|
+
Requires-Dist: uuid
|
|
16
|
+
Requires-Dist: Image
|
|
17
|
+
Requires-Dist: pillow
|
|
18
|
+
Requires-Dist: psutil
|
|
19
|
+
Requires-Dist: pynvml
|
|
20
|
+
Requires-Dist: requests_toolbelt
|
|
21
|
+
Requires-Dist: matplotlib
|
|
22
|
+
Requires-Dist: fake_useragent
|
|
23
|
+
Requires-Dist: piexif
|
|
24
|
+
Requires-Dist: gputil
|
|
25
|
+
Requires-Dist: urlparser
|
|
26
|
+
Requires-Dist: python-crontab
|
|
27
|
+
Requires-Dist: urllib3
|
|
28
|
+
|
|
29
|
+
ryry Python Tool
|
|
30
|
+
===============================================
|
|
31
|
+
The ryry Python Tool is a official tool, you can use it to **Register** device to ryry server, other person can use **ryry Application** assign tasks to you for implementation
|
|
32
|
+
|
|
33
|
+
Installation
|
|
34
|
+
------------
|
|
35
|
+
|
|
36
|
+
The ryry requires [Python](http://www.python.org/download) 3.10.6 or later.
|
|
37
|
+
|
|
38
|
+
##### Installing
|
|
39
|
+
pip install ryry-cli
|
|
40
|
+
|
|
41
|
+
##### Uninstalling
|
|
42
|
+
pip uninstall ryry-cli
|
|
43
|
+
|
|
44
|
+
Use
|
|
45
|
+
------------
|
|
46
|
+
##### 1. Running
|
|
47
|
+
$ ryry service start
|
|
48
|
+
start a process to wait for the server to issue tasks. **Please do not close it**
|
|
49
|
+
|
|
50
|
+
Module Developer
|
|
51
|
+
------------
|
|
52
|
+
$ ryry widget init
|
|
53
|
+
|
|
54
|
+
in empty folder, use above command craete a ryry module, structure is like
|
|
55
|
+
|
|
56
|
+
[widget folder]
|
|
57
|
+
|-- config.json //*required, do not change*
|
|
58
|
+
|-- main.py //*required, do not change*
|
|
59
|
+
|-- run.py
|
|
60
|
+
|
|
61
|
+
if other person share widget code to you , you can add widget path in your computer to ryry environment
|
|
62
|
+
|
|
63
|
+
$ ryry widget add [path_with_widget_code]
|
|
64
|
+
|
|
65
|
+
you can modify script and h5 file yourself, then publish to ryry sever
|
|
66
|
+
|
|
67
|
+
$ ryry widget publish
|
|
68
|
+
|
|
69
|
+
get ryry status
|
|
70
|
+
$ ryry services status
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[egg_info]
|
|
2
|
-
tag_build =
|
|
3
|
-
tag_date = 0
|
|
4
|
-
|
|
1
|
+
[egg_info]
|
|
2
|
+
tag_build =
|
|
3
|
+
tag_date = 0
|
|
4
|
+
|
ryry-cli-2.62/ryry/constant.py
DELETED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|