rclone-api 1.5.2__py2.py3-none-any.whl → 1.5.4__py2.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.
- rclone_api/__init__.py +35 -18
- rclone_api/rclone_impl.py +34 -34
- rclone_api/util.py +5 -1
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/METADATA +133 -114
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/RECORD +9 -9
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/LICENSE +0 -0
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/WHEEL +0 -0
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/entry_points.txt +0 -0
- {rclone_api-1.5.2.dist-info → rclone_api-1.5.4.dist-info}/top_level.txt +0 -0
rclone_api/__init__.py
CHANGED
@@ -74,6 +74,23 @@ class Rclone:
|
|
74
74
|
implementation details and providing a clean, consistent interface.
|
75
75
|
"""
|
76
76
|
|
77
|
+
@staticmethod
|
78
|
+
def upgrade_rclone() -> Path:
|
79
|
+
"""
|
80
|
+
Upgrade the rclone executable to the latest version.
|
81
|
+
|
82
|
+
Downloads the latest rclone binary and replaces the current one.
|
83
|
+
|
84
|
+
If an external rclone is already in your path then although upgrade_rclone
|
85
|
+
will download the latest version, it will not affect the rclone selected.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
Path to the upgraded rclone executable
|
89
|
+
"""
|
90
|
+
from rclone_api.util import upgrade_rclone
|
91
|
+
|
92
|
+
return upgrade_rclone()
|
93
|
+
|
77
94
|
def __init__(
|
78
95
|
self, rclone_conf: Path | Config, rclone_exe: Path | None = None
|
79
96
|
) -> None:
|
@@ -173,7 +190,7 @@ class Rclone:
|
|
173
190
|
|
174
191
|
def ls_stream(
|
175
192
|
self,
|
176
|
-
|
193
|
+
src: str,
|
177
194
|
max_depth: int = -1,
|
178
195
|
fast_list: bool = False,
|
179
196
|
) -> FilesStream:
|
@@ -184,14 +201,14 @@ class Rclone:
|
|
184
201
|
results incrementally rather than collecting them all at once.
|
185
202
|
|
186
203
|
Args:
|
187
|
-
|
204
|
+
src: Remote path to list
|
188
205
|
max_depth: Maximum recursion depth (-1 for unlimited)
|
189
206
|
fast_list: Use fast list (only recommended for listing entire repositories or small datasets)
|
190
207
|
|
191
208
|
Returns:
|
192
209
|
A stream of file entries that can be iterated over
|
193
210
|
"""
|
194
|
-
return self.impl.ls_stream(
|
211
|
+
return self.impl.ls_stream(src=src, max_depth=max_depth, fast_list=fast_list)
|
195
212
|
|
196
213
|
def save_to_db(
|
197
214
|
self,
|
@@ -218,7 +235,7 @@ class Rclone:
|
|
218
235
|
|
219
236
|
def ls(
|
220
237
|
self,
|
221
|
-
|
238
|
+
src: Dir | Remote | str | None = None,
|
222
239
|
max_depth: int | None = None,
|
223
240
|
glob: str | None = None,
|
224
241
|
order: Order = Order.NORMAL,
|
@@ -230,7 +247,7 @@ class Rclone:
|
|
230
247
|
Provides a detailed listing with file metadata.
|
231
248
|
|
232
249
|
Args:
|
233
|
-
|
250
|
+
src: Path to list (Dir, Remote, or string path)
|
234
251
|
max_depth: Maximum recursion depth (None for default)
|
235
252
|
glob: Optional glob pattern to filter results
|
236
253
|
order: Sorting order for the results
|
@@ -240,7 +257,7 @@ class Rclone:
|
|
240
257
|
DirListing object containing the results
|
241
258
|
"""
|
242
259
|
return self.impl.ls(
|
243
|
-
|
260
|
+
src=src,
|
244
261
|
max_depth=max_depth,
|
245
262
|
glob=glob,
|
246
263
|
order=order,
|
@@ -308,7 +325,7 @@ class Rclone:
|
|
308
325
|
|
309
326
|
def walk(
|
310
327
|
self,
|
311
|
-
|
328
|
+
src: Dir | Remote | str,
|
312
329
|
max_depth: int = -1,
|
313
330
|
breadth_first: bool = True,
|
314
331
|
order: Order = Order.NORMAL,
|
@@ -320,7 +337,7 @@ class Rclone:
|
|
320
337
|
and yields their contents.
|
321
338
|
|
322
339
|
Args:
|
323
|
-
|
340
|
+
src: Remote path, Dir, or Remote object to walk through
|
324
341
|
max_depth: Maximum depth to traverse (-1 for unlimited)
|
325
342
|
breadth_first: If True, use breadth-first traversal, otherwise depth-first
|
326
343
|
order: Sorting order for directory entries
|
@@ -329,7 +346,7 @@ class Rclone:
|
|
329
346
|
DirListing: Directory listing for each directory encountered
|
330
347
|
"""
|
331
348
|
return self.impl.walk(
|
332
|
-
|
349
|
+
src=src, max_depth=max_depth, breadth_first=breadth_first, order=order
|
333
350
|
)
|
334
351
|
|
335
352
|
def scan_missing_folders(
|
@@ -359,7 +376,7 @@ class Rclone:
|
|
359
376
|
)
|
360
377
|
|
361
378
|
def cleanup(
|
362
|
-
self,
|
379
|
+
self, src: str, other_args: list[str] | None = None
|
363
380
|
) -> CompletedProcess:
|
364
381
|
"""
|
365
382
|
Cleanup any resources used by the Rclone instance.
|
@@ -367,13 +384,13 @@ class Rclone:
|
|
367
384
|
Removes temporary files and directories created by rclone.
|
368
385
|
|
369
386
|
Args:
|
370
|
-
|
387
|
+
src: Path to clean up
|
371
388
|
other_args: Additional command-line arguments
|
372
389
|
|
373
390
|
Returns:
|
374
391
|
CompletedProcess with the result of the cleanup operation
|
375
392
|
"""
|
376
|
-
return self.impl.cleanup(
|
393
|
+
return self.impl.cleanup(src=src, other_args=other_args)
|
377
394
|
|
378
395
|
def copy_to(
|
379
396
|
self,
|
@@ -510,19 +527,19 @@ class Rclone:
|
|
510
527
|
other_args=other_args,
|
511
528
|
)
|
512
529
|
|
513
|
-
def purge(self,
|
530
|
+
def purge(self, src: Dir | str) -> CompletedProcess:
|
514
531
|
"""
|
515
532
|
Purge a directory.
|
516
533
|
|
517
534
|
Removes a directory and all its contents.
|
518
535
|
|
519
536
|
Args:
|
520
|
-
|
537
|
+
src: Rclone style path
|
521
538
|
|
522
539
|
Returns:
|
523
540
|
CompletedProcess with the result of the purge operation
|
524
541
|
"""
|
525
|
-
return self.impl.purge(
|
542
|
+
return self.impl.purge(src=src)
|
526
543
|
|
527
544
|
def delete_files(
|
528
545
|
self,
|
@@ -556,17 +573,17 @@ class Rclone:
|
|
556
573
|
other_args=other_args,
|
557
574
|
)
|
558
575
|
|
559
|
-
def exists(self,
|
576
|
+
def exists(self, src: Dir | Remote | str | File) -> bool:
|
560
577
|
"""
|
561
578
|
Check if a file or directory exists.
|
562
579
|
|
563
580
|
Args:
|
564
|
-
|
581
|
+
src: Path to check (Dir, Remote, File, or path string)
|
565
582
|
|
566
583
|
Returns:
|
567
584
|
True if the path exists, False otherwise
|
568
585
|
"""
|
569
|
-
return self.impl.exists(
|
586
|
+
return self.impl.exists(src=src)
|
570
587
|
|
571
588
|
def is_synced(self, src: str | Dir, dst: str | Dir) -> bool:
|
572
589
|
"""
|
rclone_api/rclone_impl.py
CHANGED
@@ -148,7 +148,7 @@ class RcloneImpl:
|
|
148
148
|
|
149
149
|
def ls_stream(
|
150
150
|
self,
|
151
|
-
|
151
|
+
src: str,
|
152
152
|
max_depth: int = -1,
|
153
153
|
fast_list: bool = False,
|
154
154
|
) -> FilesStream:
|
@@ -160,7 +160,7 @@ class RcloneImpl:
|
|
160
160
|
max_depth: Maximum recursion depth (-1 for unlimited)
|
161
161
|
fast_list: Use fast list (only use when getting THE entire data repository from the root/bucket, or it's small)
|
162
162
|
"""
|
163
|
-
cmd = ["lsjson",
|
163
|
+
cmd = ["lsjson", src, "--files-only"]
|
164
164
|
recurse = max_depth < 0 or max_depth > 1
|
165
165
|
if recurse:
|
166
166
|
cmd.append("-R")
|
@@ -168,7 +168,7 @@ class RcloneImpl:
|
|
168
168
|
cmd += ["--max-depth", str(max_depth)]
|
169
169
|
if fast_list:
|
170
170
|
cmd.append("--fast-list")
|
171
|
-
streamer = FilesStream(
|
171
|
+
streamer = FilesStream(src, self._launch_process(cmd, capture=True))
|
172
172
|
return streamer
|
173
173
|
|
174
174
|
def save_to_db(
|
@@ -197,7 +197,7 @@ class RcloneImpl:
|
|
197
197
|
|
198
198
|
def ls(
|
199
199
|
self,
|
200
|
-
|
200
|
+
src: Dir | Remote | str | None = None,
|
201
201
|
max_depth: int | None = None,
|
202
202
|
glob: str | None = None,
|
203
203
|
order: Order = Order.NORMAL,
|
@@ -206,14 +206,14 @@ class RcloneImpl:
|
|
206
206
|
"""List files in the given path.
|
207
207
|
|
208
208
|
Args:
|
209
|
-
|
209
|
+
src: Remote path or Remote object to list
|
210
210
|
max_depth: Maximum recursion depth (0 means no recursion)
|
211
211
|
|
212
212
|
Returns:
|
213
213
|
List of File objects found at the path
|
214
214
|
"""
|
215
215
|
|
216
|
-
if
|
216
|
+
if src is None:
|
217
217
|
# list remotes instead
|
218
218
|
list_remotes: list[Remote] = self.listremotes()
|
219
219
|
dirs: list[Dir] = [Dir(remote) for remote in list_remotes]
|
@@ -222,9 +222,9 @@ class RcloneImpl:
|
|
222
222
|
rpaths = [d.path for d in dirs]
|
223
223
|
return DirListing(rpaths)
|
224
224
|
|
225
|
-
if isinstance(
|
226
|
-
|
227
|
-
to_path(
|
225
|
+
if isinstance(src, str):
|
226
|
+
src = Dir(
|
227
|
+
to_path(src, self)
|
228
228
|
) # assume it's a directory if ls is being called.
|
229
229
|
|
230
230
|
cmd = ["lsjson"]
|
@@ -237,15 +237,15 @@ class RcloneImpl:
|
|
237
237
|
if listing_option != ListingOption.ALL:
|
238
238
|
cmd.append(f"--{listing_option.value}")
|
239
239
|
|
240
|
-
cmd.append(str(
|
241
|
-
remote =
|
240
|
+
cmd.append(str(src))
|
241
|
+
remote = src.remote if isinstance(src, Dir) else src
|
242
242
|
assert isinstance(remote, Remote)
|
243
243
|
|
244
244
|
cp = self._run(cmd, check=True)
|
245
245
|
text = cp.stdout
|
246
246
|
parent_path: str | None = None
|
247
|
-
if isinstance(
|
248
|
-
parent_path =
|
247
|
+
if isinstance(src, Dir):
|
248
|
+
parent_path = src.path.path
|
249
249
|
paths: list[RPath] = RPath.from_json_str(text, remote, parent_path=parent_path)
|
250
250
|
# print(parent_path)
|
251
251
|
for o in paths:
|
@@ -261,10 +261,10 @@ class RcloneImpl:
|
|
261
261
|
random.shuffle(paths)
|
262
262
|
return DirListing(paths)
|
263
263
|
|
264
|
-
def print(self,
|
264
|
+
def print(self, src: str) -> Exception | None:
|
265
265
|
"""Print the contents of a file."""
|
266
266
|
try:
|
267
|
-
text_or_err = self.read_text(
|
267
|
+
text_or_err = self.read_text(src)
|
268
268
|
if isinstance(text_or_err, Exception):
|
269
269
|
return text_or_err
|
270
270
|
print(text_or_err)
|
@@ -372,7 +372,7 @@ class RcloneImpl:
|
|
372
372
|
|
373
373
|
def walk(
|
374
374
|
self,
|
375
|
-
|
375
|
+
src: Dir | Remote | str,
|
376
376
|
max_depth: int = -1,
|
377
377
|
breadth_first: bool = True,
|
378
378
|
order: Order = Order.NORMAL,
|
@@ -380,20 +380,20 @@ class RcloneImpl:
|
|
380
380
|
"""Walk through the given path recursively.
|
381
381
|
|
382
382
|
Args:
|
383
|
-
|
383
|
+
src: Remote path or Remote object to walk through
|
384
384
|
max_depth: Maximum depth to traverse (-1 for unlimited)
|
385
385
|
|
386
386
|
Yields:
|
387
387
|
DirListing: Directory listing for each directory encountered
|
388
388
|
"""
|
389
389
|
dir_obj: Dir
|
390
|
-
if isinstance(
|
390
|
+
if isinstance(src, Dir):
|
391
391
|
# Create a Remote object for the path
|
392
|
-
remote =
|
392
|
+
remote = src.remote
|
393
393
|
rpath = RPath(
|
394
394
|
remote=remote,
|
395
|
-
path=
|
396
|
-
name=
|
395
|
+
path=src.path.path,
|
396
|
+
name=src.path.name,
|
397
397
|
size=0,
|
398
398
|
mime_type="inode/directory",
|
399
399
|
mod_time="",
|
@@ -401,13 +401,13 @@ class RcloneImpl:
|
|
401
401
|
)
|
402
402
|
rpath.set_rclone(self)
|
403
403
|
dir_obj = Dir(rpath)
|
404
|
-
elif isinstance(
|
405
|
-
dir_obj = Dir(to_path(
|
406
|
-
elif isinstance(
|
407
|
-
dir_obj = Dir(
|
404
|
+
elif isinstance(src, str):
|
405
|
+
dir_obj = Dir(to_path(src, self))
|
406
|
+
elif isinstance(src, Remote):
|
407
|
+
dir_obj = Dir(src)
|
408
408
|
else:
|
409
|
-
dir_obj = Dir(
|
410
|
-
assert f"Invalid type for path: {type(
|
409
|
+
dir_obj = Dir(src) # shut up pyright
|
410
|
+
assert f"Invalid type for path: {type(src)}"
|
411
411
|
|
412
412
|
yield from walk(
|
413
413
|
dir_obj, max_depth=max_depth, breadth_first=breadth_first, order=order
|
@@ -441,11 +441,11 @@ class RcloneImpl:
|
|
441
441
|
)
|
442
442
|
|
443
443
|
def cleanup(
|
444
|
-
self,
|
444
|
+
self, src: str, other_args: list[str] | None = None
|
445
445
|
) -> CompletedProcess:
|
446
446
|
"""Cleanup any resources used by the Rclone instance."""
|
447
447
|
# rclone cleanup remote:path [flags]
|
448
|
-
cmd = ["cleanup",
|
448
|
+
cmd = ["cleanup", src]
|
449
449
|
if other_args:
|
450
450
|
cmd += other_args
|
451
451
|
out = self._run(cmd)
|
@@ -670,11 +670,11 @@ class RcloneImpl:
|
|
670
670
|
cp = self._run(cmd_list, check=check, capture=False)
|
671
671
|
return CompletedProcess.from_subprocess(cp)
|
672
672
|
|
673
|
-
def purge(self,
|
673
|
+
def purge(self, src: Dir | str) -> CompletedProcess:
|
674
674
|
"""Purge a directory"""
|
675
675
|
# path should always be a string
|
676
|
-
|
677
|
-
cmd_list: list[str] = ["purge", str(
|
676
|
+
src = src if isinstance(src, str) else str(src.path)
|
677
|
+
cmd_list: list[str] = ["purge", str(src)]
|
678
678
|
cp = self._run(cmd_list)
|
679
679
|
return CompletedProcess.from_subprocess(cp)
|
680
680
|
|
@@ -761,9 +761,9 @@ class RcloneImpl:
|
|
761
761
|
out = self.delete_files(files)
|
762
762
|
return out
|
763
763
|
|
764
|
-
def exists(self,
|
764
|
+
def exists(self, src: Dir | Remote | str | File) -> bool:
|
765
765
|
"""Check if a file or directory exists."""
|
766
|
-
arg: str = convert_to_str(
|
766
|
+
arg: str = convert_to_str(src)
|
767
767
|
assert isinstance(arg, str)
|
768
768
|
try:
|
769
769
|
dir_listing = self.ls(arg)
|
rclone_api/util.py
CHANGED
@@ -166,7 +166,11 @@ def get_rclone_exe(rclone_exe: Path | None) -> Path:
|
|
166
166
|
return _RCLONE_EXE
|
167
167
|
return rclone_exe
|
168
168
|
|
169
|
-
|
169
|
+
|
170
|
+
def upgrade_rclone() -> Path:
|
171
|
+
rclone_download(out=_RCLONE_EXE, replace=True)
|
172
|
+
return _RCLONE_EXE
|
173
|
+
|
170
174
|
|
171
175
|
def rclone_execute(
|
172
176
|
cmd: list[str],
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: rclone_api
|
3
|
-
Version: 1.5.
|
3
|
+
Version: 1.5.4
|
4
4
|
Summary: rclone api in python
|
5
5
|
Home-page: https://github.com/zackees/rclone-api
|
6
6
|
License: BSD 3-Clause License
|
@@ -99,22 +99,41 @@ def test_ls_glob_png(self) -> None:
|
|
99
99
|
## API
|
100
100
|
|
101
101
|
```python
|
102
|
+
|
102
103
|
class Rclone:
|
103
104
|
"""
|
104
105
|
Main interface for interacting with Rclone.
|
105
|
-
|
106
|
+
|
106
107
|
This class provides methods for all major Rclone operations including
|
107
108
|
file transfers, listing, mounting, and remote management.
|
108
|
-
|
109
|
+
|
109
110
|
It serves as the primary entry point for the API, wrapping the underlying
|
110
111
|
implementation details and providing a clean, consistent interface.
|
111
112
|
"""
|
113
|
+
|
114
|
+
@staticmethod
|
115
|
+
def upgrade_rclone() -> Path:
|
116
|
+
"""
|
117
|
+
Upgrade the rclone executable to the latest version.
|
118
|
+
|
119
|
+
Downloads the latest rclone binary and replaces the current one.
|
120
|
+
|
121
|
+
If an external rclone is already in your path then although upgrade_rclone
|
122
|
+
will download the latest version, it will not affect the rclone selected.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
Path to the upgraded rclone executable
|
126
|
+
"""
|
127
|
+
from rclone_api.util import upgrade_rclone
|
128
|
+
|
129
|
+
return upgrade_rclone()
|
130
|
+
|
112
131
|
def __init__(
|
113
132
|
self, rclone_conf: Path | Config, rclone_exe: Path | None = None
|
114
133
|
) -> None:
|
115
134
|
"""
|
116
135
|
Initialize the Rclone interface.
|
117
|
-
|
136
|
+
|
118
137
|
Args:
|
119
138
|
rclone_conf: Path to rclone config file or Config object
|
120
139
|
rclone_exe: Optional path to rclone executable. If None, will search in PATH.
|
@@ -126,12 +145,12 @@ class Rclone:
|
|
126
145
|
def webgui(self, other_args: list[str] | None = None) -> Process:
|
127
146
|
"""
|
128
147
|
Launch the Rclone web GUI.
|
129
|
-
|
148
|
+
|
130
149
|
Starts the built-in web interface for interacting with rclone.
|
131
|
-
|
150
|
+
|
132
151
|
Args:
|
133
152
|
other_args: Additional command-line arguments to pass to rclone
|
134
|
-
|
153
|
+
|
135
154
|
Returns:
|
136
155
|
Process object representing the running web GUI
|
137
156
|
"""
|
@@ -146,15 +165,15 @@ class Rclone:
|
|
146
165
|
) -> Process:
|
147
166
|
"""
|
148
167
|
Launch the Rclone server so it can receive commands.
|
149
|
-
|
168
|
+
|
150
169
|
Starts an rclone server that can be controlled remotely.
|
151
|
-
|
170
|
+
|
152
171
|
Args:
|
153
172
|
addr: Address and port to listen on (e.g., "localhost:5572")
|
154
173
|
user: Optional username for authentication
|
155
174
|
password: Optional password for authentication
|
156
175
|
other_args: Additional command-line arguments
|
157
|
-
|
176
|
+
|
158
177
|
Returns:
|
159
178
|
Process object representing the running server
|
160
179
|
"""
|
@@ -172,14 +191,14 @@ class Rclone:
|
|
172
191
|
) -> CompletedProcess:
|
173
192
|
"""
|
174
193
|
Send commands to a running rclone server.
|
175
|
-
|
194
|
+
|
176
195
|
Args:
|
177
196
|
addr: Address of the rclone server (e.g., "localhost:5572")
|
178
197
|
user: Optional username for authentication
|
179
198
|
password: Optional password for authentication
|
180
199
|
capture: Whether to capture and return command output
|
181
200
|
other_args: Additional command-line arguments
|
182
|
-
|
201
|
+
|
183
202
|
Returns:
|
184
203
|
CompletedProcess containing the command result
|
185
204
|
"""
|
@@ -194,13 +213,13 @@ class Rclone:
|
|
194
213
|
def obscure(self, password: str) -> str:
|
195
214
|
"""
|
196
215
|
Obscure a password for use in rclone config files.
|
197
|
-
|
216
|
+
|
198
217
|
Converts a plaintext password to rclone's obscured format.
|
199
218
|
Note that this is not secure encryption, just light obfuscation.
|
200
|
-
|
219
|
+
|
201
220
|
Args:
|
202
221
|
password: The plaintext password to obscure
|
203
|
-
|
222
|
+
|
204
223
|
Returns:
|
205
224
|
The obscured password string
|
206
225
|
"""
|
@@ -208,25 +227,25 @@ class Rclone:
|
|
208
227
|
|
209
228
|
def ls_stream(
|
210
229
|
self,
|
211
|
-
|
230
|
+
src: str,
|
212
231
|
max_depth: int = -1,
|
213
232
|
fast_list: bool = False,
|
214
233
|
) -> FilesStream:
|
215
234
|
"""
|
216
235
|
List files in the given path as a stream of results.
|
217
|
-
|
236
|
+
|
218
237
|
This method is memory-efficient for large directories as it yields
|
219
238
|
results incrementally rather than collecting them all at once.
|
220
|
-
|
239
|
+
|
221
240
|
Args:
|
222
|
-
|
241
|
+
src: Remote path to list
|
223
242
|
max_depth: Maximum recursion depth (-1 for unlimited)
|
224
243
|
fast_list: Use fast list (only recommended for listing entire repositories or small datasets)
|
225
|
-
|
244
|
+
|
226
245
|
Returns:
|
227
246
|
A stream of file entries that can be iterated over
|
228
247
|
"""
|
229
|
-
return self.impl.ls_stream(
|
248
|
+
return self.impl.ls_stream(src=src, max_depth=max_depth, fast_list=fast_list)
|
230
249
|
|
231
250
|
def save_to_db(
|
232
251
|
self,
|
@@ -237,10 +256,10 @@ class Rclone:
|
|
237
256
|
) -> None:
|
238
257
|
"""
|
239
258
|
Save files to a database (sqlite, mysql, postgres).
|
240
|
-
|
259
|
+
|
241
260
|
Lists all files in the source path and stores their metadata in a database.
|
242
261
|
Useful for creating searchable indexes of remote storage.
|
243
|
-
|
262
|
+
|
244
263
|
Args:
|
245
264
|
src: Remote path to list, this will be used to populate an entire table, so always use the root-most path.
|
246
265
|
db_url: Database URL, like sqlite:///data.db or mysql://user:pass@localhost/db or postgres://user:pass@localhost/db
|
@@ -253,7 +272,7 @@ class Rclone:
|
|
253
272
|
|
254
273
|
def ls(
|
255
274
|
self,
|
256
|
-
|
275
|
+
src: Dir | Remote | str | None = None,
|
257
276
|
max_depth: int | None = None,
|
258
277
|
glob: str | None = None,
|
259
278
|
order: Order = Order.NORMAL,
|
@@ -261,21 +280,21 @@ class Rclone:
|
|
261
280
|
) -> DirListing:
|
262
281
|
"""
|
263
282
|
List files and directories at the specified path.
|
264
|
-
|
283
|
+
|
265
284
|
Provides a detailed listing with file metadata.
|
266
|
-
|
285
|
+
|
267
286
|
Args:
|
268
|
-
|
287
|
+
src: Path to list (Dir, Remote, or string path)
|
269
288
|
max_depth: Maximum recursion depth (None for default)
|
270
289
|
glob: Optional glob pattern to filter results
|
271
290
|
order: Sorting order for the results
|
272
291
|
listing_option: What types of entries to include
|
273
|
-
|
292
|
+
|
274
293
|
Returns:
|
275
294
|
DirListing object containing the results
|
276
295
|
"""
|
277
296
|
return self.impl.ls(
|
278
|
-
|
297
|
+
src=src,
|
279
298
|
max_depth=max_depth,
|
280
299
|
glob=glob,
|
281
300
|
order=order,
|
@@ -285,9 +304,9 @@ class Rclone:
|
|
285
304
|
def listremotes(self) -> list[Remote]:
|
286
305
|
"""
|
287
306
|
List all configured remotes.
|
288
|
-
|
307
|
+
|
289
308
|
Returns a list of all remotes defined in the rclone configuration.
|
290
|
-
|
309
|
+
|
291
310
|
Returns:
|
292
311
|
List of Remote objects
|
293
312
|
"""
|
@@ -311,10 +330,10 @@ class Rclone:
|
|
311
330
|
) -> Generator[DiffItem, None, None]:
|
312
331
|
"""
|
313
332
|
Compare two directories and yield differences.
|
314
|
-
|
333
|
+
|
315
334
|
Be extra careful with the src and dst values. If you are off by one
|
316
335
|
parent directory, you will get a huge amount of false diffs.
|
317
|
-
|
336
|
+
|
318
337
|
Args:
|
319
338
|
src: Rclone style src path
|
320
339
|
dst: Rclone style dst path
|
@@ -325,7 +344,7 @@ class Rclone:
|
|
325
344
|
size_only: Compare only file sizes, not content
|
326
345
|
checkers: Number of checker threads
|
327
346
|
other_args: Additional command-line arguments
|
328
|
-
|
347
|
+
|
329
348
|
Yields:
|
330
349
|
DiffItem objects representing each difference found
|
331
350
|
"""
|
@@ -343,28 +362,28 @@ class Rclone:
|
|
343
362
|
|
344
363
|
def walk(
|
345
364
|
self,
|
346
|
-
|
365
|
+
src: Dir | Remote | str,
|
347
366
|
max_depth: int = -1,
|
348
367
|
breadth_first: bool = True,
|
349
368
|
order: Order = Order.NORMAL,
|
350
369
|
) -> Generator[DirListing, None, None]:
|
351
370
|
"""
|
352
371
|
Walk through the given path recursively, yielding directory listings.
|
353
|
-
|
372
|
+
|
354
373
|
Similar to os.walk(), but for remote storage. Traverses directories
|
355
374
|
and yields their contents.
|
356
|
-
|
375
|
+
|
357
376
|
Args:
|
358
|
-
|
377
|
+
src: Remote path, Dir, or Remote object to walk through
|
359
378
|
max_depth: Maximum depth to traverse (-1 for unlimited)
|
360
379
|
breadth_first: If True, use breadth-first traversal, otherwise depth-first
|
361
380
|
order: Sorting order for directory entries
|
362
|
-
|
381
|
+
|
363
382
|
Yields:
|
364
383
|
DirListing: Directory listing for each directory encountered
|
365
384
|
"""
|
366
385
|
return self.impl.walk(
|
367
|
-
|
386
|
+
src=src, max_depth=max_depth, breadth_first=breadth_first, order=order
|
368
387
|
)
|
369
388
|
|
370
389
|
def scan_missing_folders(
|
@@ -376,16 +395,16 @@ class Rclone:
|
|
376
395
|
) -> Generator[Dir, None, None]:
|
377
396
|
"""
|
378
397
|
Find folders that exist in source but are missing in destination.
|
379
|
-
|
398
|
+
|
380
399
|
Useful for identifying directories that need to be created before
|
381
400
|
copying files.
|
382
|
-
|
401
|
+
|
383
402
|
Args:
|
384
403
|
src: Source directory or Remote to scan
|
385
404
|
dst: Destination directory or Remote to compare against
|
386
405
|
max_depth: Maximum depth to traverse (-1 for unlimited)
|
387
406
|
order: Sorting order for directory entries
|
388
|
-
|
407
|
+
|
389
408
|
Yields:
|
390
409
|
Dir: Each directory that exists in source but not in destination
|
391
410
|
"""
|
@@ -394,21 +413,21 @@ class Rclone:
|
|
394
413
|
)
|
395
414
|
|
396
415
|
def cleanup(
|
397
|
-
self,
|
416
|
+
self, src: str, other_args: list[str] | None = None
|
398
417
|
) -> CompletedProcess:
|
399
418
|
"""
|
400
419
|
Cleanup any resources used by the Rclone instance.
|
401
|
-
|
420
|
+
|
402
421
|
Removes temporary files and directories created by rclone.
|
403
|
-
|
422
|
+
|
404
423
|
Args:
|
405
|
-
|
424
|
+
src: Path to clean up
|
406
425
|
other_args: Additional command-line arguments
|
407
|
-
|
426
|
+
|
408
427
|
Returns:
|
409
428
|
CompletedProcess with the result of the cleanup operation
|
410
429
|
"""
|
411
|
-
return self.impl.cleanup(
|
430
|
+
return self.impl.cleanup(src=src, other_args=other_args)
|
412
431
|
|
413
432
|
def copy_to(
|
414
433
|
self,
|
@@ -420,17 +439,17 @@ class Rclone:
|
|
420
439
|
) -> CompletedProcess:
|
421
440
|
"""
|
422
441
|
Copy one file from source to destination.
|
423
|
-
|
442
|
+
|
424
443
|
Warning - this can be slow for large files or when copying between
|
425
444
|
different storage providers.
|
426
|
-
|
445
|
+
|
427
446
|
Args:
|
428
447
|
src: Rclone style src path
|
429
448
|
dst: Rclone style dst path
|
430
449
|
check: Whether to verify the copy with checksums
|
431
450
|
verbose: Whether to show detailed progress
|
432
451
|
other_args: Additional command-line arguments
|
433
|
-
|
452
|
+
|
434
453
|
Returns:
|
435
454
|
CompletedProcess with the result of the copy operation
|
436
455
|
"""
|
@@ -459,9 +478,9 @@ class Rclone:
|
|
459
478
|
) -> list[CompletedProcess]:
|
460
479
|
"""
|
461
480
|
Copy multiple files from source to destination.
|
462
|
-
|
481
|
+
|
463
482
|
Efficiently copies a list of files, potentially in parallel.
|
464
|
-
|
483
|
+
|
465
484
|
Args:
|
466
485
|
src: Rclone style src path
|
467
486
|
dst: Rclone style dst path
|
@@ -479,7 +498,7 @@ class Rclone:
|
|
479
498
|
max_partition_workers: Maximum number of partition workers
|
480
499
|
multi_thread_streams: Number of streams for multi-thread copy
|
481
500
|
other_args: Additional command-line arguments
|
482
|
-
|
501
|
+
|
483
502
|
Returns:
|
484
503
|
List of CompletedProcess objects for each copy operation
|
485
504
|
"""
|
@@ -516,9 +535,9 @@ class Rclone:
|
|
516
535
|
) -> CompletedProcess:
|
517
536
|
"""
|
518
537
|
Copy files from source to destination.
|
519
|
-
|
538
|
+
|
520
539
|
Recursively copies all files from src to dst.
|
521
|
-
|
540
|
+
|
522
541
|
Args:
|
523
542
|
src: Rclone style src path
|
524
543
|
dst: Rclone style dst path
|
@@ -529,7 +548,7 @@ class Rclone:
|
|
529
548
|
low_level_retries: Number of low-level retries
|
530
549
|
retries: Number of high-level retries
|
531
550
|
other_args: Additional command-line arguments
|
532
|
-
|
551
|
+
|
533
552
|
Returns:
|
534
553
|
CompletedProcess with the result of the copy operation
|
535
554
|
"""
|
@@ -545,19 +564,19 @@ class Rclone:
|
|
545
564
|
other_args=other_args,
|
546
565
|
)
|
547
566
|
|
548
|
-
def purge(self,
|
567
|
+
def purge(self, src: Dir | str) -> CompletedProcess:
|
549
568
|
"""
|
550
569
|
Purge a directory.
|
551
|
-
|
570
|
+
|
552
571
|
Removes a directory and all its contents.
|
553
|
-
|
572
|
+
|
554
573
|
Args:
|
555
|
-
|
556
|
-
|
574
|
+
src: Rclone style path
|
575
|
+
|
557
576
|
Returns:
|
558
577
|
CompletedProcess with the result of the purge operation
|
559
578
|
"""
|
560
|
-
return self.impl.purge(
|
579
|
+
return self.impl.purge(src=src)
|
561
580
|
|
562
581
|
def delete_files(
|
563
582
|
self,
|
@@ -570,7 +589,7 @@ class Rclone:
|
|
570
589
|
) -> CompletedProcess:
|
571
590
|
"""
|
572
591
|
Delete files or directories.
|
573
|
-
|
592
|
+
|
574
593
|
Args:
|
575
594
|
files: Files to delete (single file/path or list)
|
576
595
|
check: Whether to verify deletions
|
@@ -578,7 +597,7 @@ class Rclone:
|
|
578
597
|
verbose: Whether to show detailed progress
|
579
598
|
max_partition_workers: Maximum number of partition workers
|
580
599
|
other_args: Additional command-line arguments
|
581
|
-
|
600
|
+
|
582
601
|
Returns:
|
583
602
|
CompletedProcess with the result of the delete operation
|
584
603
|
"""
|
@@ -591,28 +610,28 @@ class Rclone:
|
|
591
610
|
other_args=other_args,
|
592
611
|
)
|
593
612
|
|
594
|
-
def exists(self,
|
613
|
+
def exists(self, src: Dir | Remote | str | File) -> bool:
|
595
614
|
"""
|
596
615
|
Check if a file or directory exists.
|
597
|
-
|
616
|
+
|
598
617
|
Args:
|
599
|
-
|
600
|
-
|
618
|
+
src: Path to check (Dir, Remote, File, or path string)
|
619
|
+
|
601
620
|
Returns:
|
602
621
|
True if the path exists, False otherwise
|
603
622
|
"""
|
604
|
-
return self.impl.exists(
|
623
|
+
return self.impl.exists(src=src)
|
605
624
|
|
606
625
|
def is_synced(self, src: str | Dir, dst: str | Dir) -> bool:
|
607
626
|
"""
|
608
627
|
Check if two directories are in sync.
|
609
|
-
|
628
|
+
|
610
629
|
Compares the contents of src and dst to determine if they match.
|
611
|
-
|
630
|
+
|
612
631
|
Args:
|
613
632
|
src: Source directory (Dir object or path string)
|
614
633
|
dst: Destination directory (Dir object or path string)
|
615
|
-
|
634
|
+
|
616
635
|
Returns:
|
617
636
|
True if the directories are in sync, False otherwise
|
618
637
|
"""
|
@@ -621,10 +640,10 @@ class Rclone:
|
|
621
640
|
def modtime(self, src: str) -> str | Exception:
|
622
641
|
"""
|
623
642
|
Get the modification time of a file or directory.
|
624
|
-
|
643
|
+
|
625
644
|
Args:
|
626
645
|
src: Path to the file or directory
|
627
|
-
|
646
|
+
|
628
647
|
Returns:
|
629
648
|
Modification time as a string, or Exception if an error occurred
|
630
649
|
"""
|
@@ -633,10 +652,10 @@ class Rclone:
|
|
633
652
|
def modtime_dt(self, src: str) -> datetime | Exception:
|
634
653
|
"""
|
635
654
|
Get the modification time of a file or directory as a datetime object.
|
636
|
-
|
655
|
+
|
637
656
|
Args:
|
638
657
|
src: Path to the file or directory
|
639
|
-
|
658
|
+
|
640
659
|
Returns:
|
641
660
|
Modification time as a datetime object, or Exception if an error occurred
|
642
661
|
"""
|
@@ -649,13 +668,13 @@ class Rclone:
|
|
649
668
|
) -> Exception | None:
|
650
669
|
"""
|
651
670
|
Write text to a file.
|
652
|
-
|
671
|
+
|
653
672
|
Creates or overwrites the file at dst with the given text.
|
654
|
-
|
673
|
+
|
655
674
|
Args:
|
656
675
|
text: Text content to write
|
657
676
|
dst: Destination file path
|
658
|
-
|
677
|
+
|
659
678
|
Returns:
|
660
679
|
None if successful, Exception if an error occurred
|
661
680
|
"""
|
@@ -668,13 +687,13 @@ class Rclone:
|
|
668
687
|
) -> Exception | None:
|
669
688
|
"""
|
670
689
|
Write bytes to a file.
|
671
|
-
|
690
|
+
|
672
691
|
Creates or overwrites the file at dst with the given binary data.
|
673
|
-
|
692
|
+
|
674
693
|
Args:
|
675
694
|
data: Binary content to write
|
676
695
|
dst: Destination file path
|
677
|
-
|
696
|
+
|
678
697
|
Returns:
|
679
698
|
None if successful, Exception if an error occurred
|
680
699
|
"""
|
@@ -683,10 +702,10 @@ class Rclone:
|
|
683
702
|
def read_bytes(self, src: str) -> bytes | Exception:
|
684
703
|
"""
|
685
704
|
Read bytes from a file.
|
686
|
-
|
705
|
+
|
687
706
|
Args:
|
688
707
|
src: Source file path
|
689
|
-
|
708
|
+
|
690
709
|
Returns:
|
691
710
|
File contents as bytes, or Exception if an error occurred
|
692
711
|
"""
|
@@ -695,10 +714,10 @@ class Rclone:
|
|
695
714
|
def read_text(self, src: str) -> str | Exception:
|
696
715
|
"""
|
697
716
|
Read text from a file.
|
698
|
-
|
717
|
+
|
699
718
|
Args:
|
700
719
|
src: Source file path
|
701
|
-
|
720
|
+
|
702
721
|
Returns:
|
703
722
|
File contents as a string, or Exception if an error occurred
|
704
723
|
"""
|
@@ -714,16 +733,16 @@ class Rclone:
|
|
714
733
|
) -> Exception | None:
|
715
734
|
"""
|
716
735
|
Copy a slice of bytes from the src file to dst.
|
717
|
-
|
736
|
+
|
718
737
|
Extracts a portion of a file based on offset and length.
|
719
|
-
|
738
|
+
|
720
739
|
Args:
|
721
740
|
src: Source file path
|
722
741
|
offset: Starting position in the source file
|
723
742
|
length: Number of bytes to copy
|
724
743
|
outfile: Local file path to write the bytes to
|
725
744
|
other_args: Additional command-line arguments
|
726
|
-
|
745
|
+
|
727
746
|
Returns:
|
728
747
|
None if successful, Exception if an error occurred
|
729
748
|
"""
|
@@ -740,14 +759,14 @@ class Rclone:
|
|
740
759
|
) -> CompletedProcess:
|
741
760
|
"""
|
742
761
|
Copy a directory from source to destination.
|
743
|
-
|
762
|
+
|
744
763
|
Recursively copies all files and subdirectories.
|
745
|
-
|
764
|
+
|
746
765
|
Args:
|
747
766
|
src: Source directory (Dir object or path string)
|
748
767
|
dst: Destination directory (Dir object or path string)
|
749
768
|
args: Additional command-line arguments
|
750
|
-
|
769
|
+
|
751
770
|
Returns:
|
752
771
|
CompletedProcess with the result of the copy operation
|
753
772
|
"""
|
@@ -759,14 +778,14 @@ class Rclone:
|
|
759
778
|
) -> CompletedProcess:
|
760
779
|
"""
|
761
780
|
Copy a remote to another remote.
|
762
|
-
|
781
|
+
|
763
782
|
Copies all contents from one remote storage to another.
|
764
|
-
|
783
|
+
|
765
784
|
Args:
|
766
785
|
src: Source remote
|
767
786
|
dst: Destination remote
|
768
787
|
args: Additional command-line arguments
|
769
|
-
|
788
|
+
|
770
789
|
Returns:
|
771
790
|
CompletedProcess with the result of the copy operation
|
772
791
|
"""
|
@@ -782,20 +801,20 @@ class Rclone:
|
|
782
801
|
) -> Exception | None:
|
783
802
|
"""
|
784
803
|
Copy a large file to S3 with resumable upload capability.
|
785
|
-
|
804
|
+
|
786
805
|
This method splits the file into parts for parallel upload and can
|
787
806
|
resume interrupted transfers using a custom algorithm in python.
|
788
|
-
|
807
|
+
|
789
808
|
Particularly useful for very large files where network interruptions
|
790
809
|
are likely.
|
791
|
-
|
810
|
+
|
792
811
|
Args:
|
793
812
|
src: Source file path (format: remote:bucket/path/file)
|
794
813
|
dst: Destination file path (format: remote:bucket/path/file)
|
795
814
|
part_infos: Optional list of part information for resuming uploads
|
796
815
|
upload_threads: Number of parallel upload threads
|
797
816
|
merge_threads: Number of threads for merging uploaded parts
|
798
|
-
|
817
|
+
|
799
818
|
Returns:
|
800
819
|
None if successful, Exception if an error occurred
|
801
820
|
"""
|
@@ -822,9 +841,9 @@ class Rclone:
|
|
822
841
|
) -> Mount:
|
823
842
|
"""
|
824
843
|
Mount a remote or directory to a local path.
|
825
|
-
|
844
|
+
|
826
845
|
Makes remote storage accessible as a local filesystem.
|
827
|
-
|
846
|
+
|
828
847
|
Args:
|
829
848
|
src: Remote or directory to mount
|
830
849
|
outdir: Local path to mount to
|
@@ -836,7 +855,7 @@ class Rclone:
|
|
836
855
|
cache_dir_delete_on_exit: Whether to delete cache on exit
|
837
856
|
log: Path to write logs to
|
838
857
|
other_args: Additional command-line arguments
|
839
|
-
|
858
|
+
|
840
859
|
Returns:
|
841
860
|
Mount object representing the mounted filesystem
|
842
861
|
"""
|
@@ -861,19 +880,19 @@ class Rclone:
|
|
861
880
|
) -> HttpServer:
|
862
881
|
"""
|
863
882
|
Serve a remote or directory via HTTP.
|
864
|
-
|
883
|
+
|
865
884
|
Creates an HTTP server that provides access to the specified remote.
|
866
885
|
The returned HttpServer object includes a client for fetching files.
|
867
|
-
|
886
|
+
|
868
887
|
This is useful for providing web access to remote storage or for
|
869
888
|
accessing remote files from applications that support HTTP but not
|
870
889
|
the remote's native protocol.
|
871
|
-
|
890
|
+
|
872
891
|
Args:
|
873
892
|
src: Remote or directory to serve
|
874
893
|
addr: Network address and port to serve on (default: localhost:8080)
|
875
894
|
other_args: Additional arguments to pass to rclone
|
876
|
-
|
895
|
+
|
877
896
|
Returns:
|
878
897
|
HttpServer object with methods for accessing the served content
|
879
898
|
"""
|
@@ -890,9 +909,9 @@ class Rclone:
|
|
890
909
|
) -> SizeResult | Exception:
|
891
910
|
"""
|
892
911
|
Get the size of a list of files.
|
893
|
-
|
912
|
+
|
894
913
|
Calculates the total size of the specified files.
|
895
|
-
|
914
|
+
|
896
915
|
Args:
|
897
916
|
src: Base path for the files
|
898
917
|
files: List of file paths relative to src
|
@@ -900,10 +919,10 @@ class Rclone:
|
|
900
919
|
other_args: Additional command-line arguments
|
901
920
|
check: Whether to verify file integrity
|
902
921
|
verbose: Whether to show detailed output
|
903
|
-
|
922
|
+
|
904
923
|
Returns:
|
905
924
|
SizeResult with size information, or Exception if an error occurred
|
906
|
-
|
925
|
+
|
907
926
|
Example:
|
908
927
|
size_files("remote:bucket", ["path/to/file1", "path/to/file2"])
|
909
928
|
"""
|
@@ -919,10 +938,10 @@ class Rclone:
|
|
919
938
|
def size_file(self, src: str) -> SizeSuffix | Exception:
|
920
939
|
"""
|
921
940
|
Get the size of a file.
|
922
|
-
|
941
|
+
|
923
942
|
Args:
|
924
943
|
src: Path to the file
|
925
|
-
|
944
|
+
|
926
945
|
Returns:
|
927
946
|
SizeSuffix object representing the file size, or Exception if an error occurred
|
928
947
|
"""
|
@@ -1,4 +1,4 @@
|
|
1
|
-
rclone_api/__init__.py,sha256=
|
1
|
+
rclone_api/__init__.py,sha256=scamI3-3a5l0x14rkaDa4cREMpftBbtGZ33OGy3ZKS8,32204
|
2
2
|
rclone_api/cli.py,sha256=dibfAZIh0kXWsBbfp3onKLjyZXo54mTzDjUdzJlDlWo,231
|
3
3
|
rclone_api/completed_process.py,sha256=_IZ8IWK7DM1_tsbDEkH6wPZ-bbcrgf7A7smls854pmg,1775
|
4
4
|
rclone_api/config.py,sha256=f6jEAxVorGFr31oHfcsu5AJTtOJj2wR5tTSsbGGZuIw,2558
|
@@ -19,12 +19,12 @@ rclone_api/install.py,sha256=Xb1BRn8rQcSpSd4dzmvIOELP2zM2DytUeIZ6jzv738A,2893
|
|
19
19
|
rclone_api/log.py,sha256=VZHM7pNSXip2ZLBKMP7M1u-rp_F7zoafFDuR8CPUoKI,1271
|
20
20
|
rclone_api/mount.py,sha256=TE_VIBMW7J1UkF_6HRCt8oi_jGdMov4S51bm2OgxFAM,10045
|
21
21
|
rclone_api/process.py,sha256=tGooS5NLdPuqHh7hCH8SfK44A6LGftPQCPQUNgSo0a0,5714
|
22
|
-
rclone_api/rclone_impl.py,sha256=
|
22
|
+
rclone_api/rclone_impl.py,sha256=h9jDtUC08b_5jciRZL0L-GGMkxGYKnursylb9p2gksU,46145
|
23
23
|
rclone_api/remote.py,sha256=mTgMTQTwxUmbLjTpr-AGTId2ycXKI9mLX5L7PPpDIoc,520
|
24
24
|
rclone_api/rpath.py,sha256=Y1JjQWcie39EgQrq-UtbfDz5yDLCwwfu27W7AQXllSE,2860
|
25
25
|
rclone_api/scan_missing_folders.py,sha256=-8NCwpCaHeHrX-IepCoAEsX1rl8S-GOCxcIhTr_w3gA,4747
|
26
26
|
rclone_api/types.py,sha256=2ngxwpdNy88y0teeYJ5Vz5NiLK1rfaFx8Xf99i0J-Js,12155
|
27
|
-
rclone_api/util.py,sha256=
|
27
|
+
rclone_api/util.py,sha256=IOjutkZRIbgBChUemLbp6_siVDAYMZ1UlpJgWzV-Zvs,9387
|
28
28
|
rclone_api/assets/example.txt,sha256=lTBovRjiz0_TgtAtbA1C5hNi2ffbqnNPqkKg6UiKCT8,54
|
29
29
|
rclone_api/cmd/analyze.py,sha256=RHbvk1G5ZUc3qLqlm1AZEyQzd_W_ZjcbCNDvW4YpTKQ,1252
|
30
30
|
rclone_api/cmd/copy_large_s3.py,sha256=E0B7P-JJTuOM7wMZtwQHJCpoLhccJleh0mnMq8ZiSUo,3234
|
@@ -52,9 +52,9 @@ rclone_api/s3/multipart/upload_parts_inline.py,sha256=V7syKjFyVIe4U9Ahl5XgqVTzt9
|
|
52
52
|
rclone_api/s3/multipart/upload_parts_resumable.py,sha256=diJoUpVYow6No_dNgOZIYVsv43k4evb6zixqpzWJaUk,9771
|
53
53
|
rclone_api/s3/multipart/upload_parts_server_side_merge.py,sha256=Fp2pdrs5dONQI9LkfNolgAGj1-Z2V1SsRd0r0sreuXI,18040
|
54
54
|
rclone_api/s3/multipart/upload_state.py,sha256=f-Aq2NqtAaMUMhYitlICSNIxCKurWAl2gDEUVizLIqw,6019
|
55
|
-
rclone_api-1.5.
|
56
|
-
rclone_api-1.5.
|
57
|
-
rclone_api-1.5.
|
58
|
-
rclone_api-1.5.
|
59
|
-
rclone_api-1.5.
|
60
|
-
rclone_api-1.5.
|
55
|
+
rclone_api-1.5.4.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
|
56
|
+
rclone_api-1.5.4.dist-info/METADATA,sha256=juhrazrRWIB2URR-gfT_9tyZnxWr9m1s_UKOc7seIA4,32424
|
57
|
+
rclone_api-1.5.4.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
|
58
|
+
rclone_api-1.5.4.dist-info/entry_points.txt,sha256=fJteOlYVwgX3UbNuL9jJ0zUTuX2O79JFAeNgK7Sw7EQ,255
|
59
|
+
rclone_api-1.5.4.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
|
60
|
+
rclone_api-1.5.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|