rclone-api 1.4.2__py2.py3-none-any.whl → 1.4.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.
@@ -8,7 +8,6 @@ from concurrent.futures import Future, ThreadPoolExecutor
8
8
  from dataclasses import dataclass
9
9
  from datetime import datetime
10
10
  from pathlib import Path
11
- from tempfile import TemporaryDirectory
12
11
 
13
12
  from rclone_api.dir_listing import DirListing
14
13
  from rclone_api.http_server import HttpServer
@@ -249,6 +248,8 @@ def copy_file_parts(
249
248
  threads: int = 1,
250
249
  ) -> Exception | None:
251
250
  """Copy parts of a file from source to destination."""
251
+ from rclone_api.util import random_str
252
+
252
253
  if dst_dir.endswith("/"):
253
254
  dst_dir = dst_dir[:-1]
254
255
  src_size = self.size_file(src)
@@ -311,65 +312,72 @@ def copy_file_parts(
311
312
  print(info_json)
312
313
 
313
314
  finished_tasks: list[UploadPart] = []
315
+ tmp_dir = str(Path("chunks") / random_str(12))
316
+ import atexit
317
+ import shutil
318
+
319
+ atexit.register(lambda: shutil.rmtree(tmp_dir, ignore_errors=True))
314
320
 
315
321
  with self.serve_http(src_dir) as http_server:
316
- with TemporaryDirectory() as tmp_dir:
317
- tmpdir: Path = Path(tmp_dir)
318
- write_semaphore = threading.Semaphore(threads)
319
- with ThreadPoolExecutor(max_workers=threads) as upload_executor:
320
- with ThreadPoolExecutor(max_workers=threads) as read_executor:
321
- for part_info in part_infos:
322
- part_number: int = part_info.part_number
323
- range: Range = part_info.range
324
- offset: SizeSuffix = SizeSuffix(range.start)
325
- length: SizeSuffix = SizeSuffix(range.end - range.start)
326
- end = offset + length
327
- suffix = _gen_name(part_number, offset, end)
328
- part_dst = f"{dst_dir}/{suffix}"
329
-
330
- def _read_task(
322
+ tmpdir: Path = Path(tmp_dir)
323
+ write_semaphore = threading.Semaphore(threads)
324
+ with ThreadPoolExecutor(max_workers=threads) as upload_executor:
325
+ with ThreadPoolExecutor(max_workers=threads) as read_executor:
326
+ for part_info in part_infos:
327
+ part_number: int = part_info.part_number
328
+ range: Range = part_info.range
329
+ offset: SizeSuffix = SizeSuffix(range.start)
330
+ length: SizeSuffix = SizeSuffix(range.end - range.start)
331
+ end = offset + length
332
+ suffix = _gen_name(part_number, offset, end)
333
+ part_dst = f"{dst_dir}/{suffix}"
334
+
335
+ def _read_task(
336
+ src_name=src_name,
337
+ http_server=http_server,
338
+ tmpdir=tmpdir,
339
+ offset=offset,
340
+ length=length,
341
+ part_dst=part_dst,
342
+ ) -> UploadPart:
343
+ return read_task(
331
344
  src_name=src_name,
332
345
  http_server=http_server,
333
346
  tmpdir=tmpdir,
334
347
  offset=offset,
335
348
  length=length,
336
349
  part_dst=part_dst,
337
- ) -> UploadPart:
338
- return read_task(
339
- src_name=src_name,
340
- http_server=http_server,
341
- tmpdir=tmpdir,
342
- offset=offset,
343
- length=length,
344
- part_dst=part_dst,
345
- )
346
-
347
- read_fut: Future[UploadPart] = read_executor.submit(_read_task)
348
-
349
- # Releases the semaphore when the write task is done
350
- def queue_upload_task(
351
- read_fut=read_fut,
352
- ) -> None:
353
- upload_part = read_fut.result()
354
- upload_fut: Future[UploadPart] = upload_executor.submit(
355
- upload_task, self, upload_part
356
- )
357
- # SEMAPHORE RELEASE!!!
358
- upload_fut.add_done_callback(
359
- lambda _: write_semaphore.release()
360
- )
361
- upload_fut.add_done_callback(
362
- lambda fut: finished_tasks.append(fut.result())
363
- )
364
-
365
- read_fut.add_done_callback(queue_upload_task)
366
- # SEMAPHORE ACQUIRE!!!
367
- # If we are back filled on the writers, then we stall.
368
- write_semaphore.acquire()
350
+ )
351
+
352
+ read_fut: Future[UploadPart] = read_executor.submit(_read_task)
353
+
354
+ # Releases the semaphore when the write task is done
355
+ def queue_upload_task(
356
+ read_fut=read_fut,
357
+ ) -> None:
358
+ upload_part = read_fut.result()
359
+ upload_fut: Future[UploadPart] = upload_executor.submit(
360
+ upload_task, self, upload_part
361
+ )
362
+ # SEMAPHORE RELEASE!!!
363
+ upload_fut.add_done_callback(
364
+ lambda _: write_semaphore.release()
365
+ )
366
+ upload_fut.add_done_callback(
367
+ lambda fut: finished_tasks.append(fut.result())
368
+ )
369
+
370
+ read_fut.add_done_callback(queue_upload_task)
371
+ # SEMAPHORE ACQUIRE!!!
372
+ # If we are back filled on the writers, then we stall.
373
+ write_semaphore.acquire()
369
374
 
370
375
  exceptions: list[Exception] = [
371
376
  t.exception for t in finished_tasks if t.exception is not None
372
377
  ]
378
+
379
+ shutil.rmtree(tmp_dir, ignore_errors=True)
380
+
373
381
  if len(exceptions) > 0:
374
382
  return Exception(f"Failed to copy parts: {exceptions}", exceptions)
375
383
 
rclone_api/rclone_impl.py CHANGED
@@ -1234,7 +1234,19 @@ class RcloneImpl:
1234
1234
  """
1235
1235
  addr = addr or f"localhost:{find_free_port()}"
1236
1236
  _, subpath = src.split(":", 1) # might not work on local paths.
1237
- cmd_list: list[str] = ["serve", "http", "--addr", addr, src]
1237
+ cmd_list: list[str] = [
1238
+ "serve",
1239
+ "http",
1240
+ "--addr",
1241
+ addr,
1242
+ src,
1243
+ "--vfs-disk-space-total-size",
1244
+ "0",
1245
+ "--vfs-read-chunk-size-limit",
1246
+ "512M",
1247
+ "--vfs-cache-mode",
1248
+ "off",
1249
+ ]
1238
1250
  if serve_http_log:
1239
1251
  cmd_list += ["--log-file", str(serve_http_log)]
1240
1252
  cmd_list += ["-vvvv"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.2
3
+ Version: 1.4.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
@@ -18,7 +18,7 @@ rclone_api/http_server.py,sha256=YrILbxK0Xpnpkm8l9uGEXH_AOCGPUX8Cx33jKVtu7ZM,820
18
18
  rclone_api/log.py,sha256=VZHM7pNSXip2ZLBKMP7M1u-rp_F7zoafFDuR8CPUoKI,1271
19
19
  rclone_api/mount.py,sha256=TE_VIBMW7J1UkF_6HRCt8oi_jGdMov4S51bm2OgxFAM,10045
20
20
  rclone_api/process.py,sha256=BGXJTZVT__jeaDyjN8_kRycliOhkBErMPdHO1hKRvJE,5271
21
- rclone_api/rclone_impl.py,sha256=BAnRi4jB_TLRHwZE_mQfX7b1L1SODn3XhdHL7hozTAs,47960
21
+ rclone_api/rclone_impl.py,sha256=HTvWbD0cWhqrIfUPzqCDp3Av1uCEBOoVO0BQrBYmjQM,48205
22
22
  rclone_api/remote.py,sha256=mTgMTQTwxUmbLjTpr-AGTId2ycXKI9mLX5L7PPpDIoc,520
23
23
  rclone_api/rpath.py,sha256=Y1JjQWcie39EgQrq-UtbfDz5yDLCwwfu27W7AQXllSE,2860
24
24
  rclone_api/scan_missing_folders.py,sha256=-8NCwpCaHeHrX-IepCoAEsX1rl8S-GOCxcIhTr_w3gA,4747
@@ -32,7 +32,7 @@ rclone_api/cmd/save_to_db.py,sha256=ylvnhg_yzexM-m6Zr7XDiswvoDVSl56ELuFAdb9gqBY,
32
32
  rclone_api/db/__init__.py,sha256=OSRUdnSWUlDTOHmjdjVmxYTUNpTbtaJ5Ll9sl-PfZg0,40
33
33
  rclone_api/db/db.py,sha256=YRnYrCaXHwytQt07uEZ_mMpvPHo9-0IWcOb95fVOOfs,10086
34
34
  rclone_api/db/models.py,sha256=v7qaXUehvsDvU51uk69JI23fSIs9JFGcOa-Tv1c_wVs,1600
35
- rclone_api/detail/copy_file_parts.py,sha256=KgLl5vVF67RLqZ1aUmRR98BvoqTrbcFzPY9oZd0yyI0,12316
35
+ rclone_api/detail/copy_file_parts.py,sha256=2XA2jLCdxkenqEVCFOo3yNrYEkziNTU_Mlsp0Ra-vkg,12291
36
36
  rclone_api/detail/walk.py,sha256=-54NVE8EJcCstwDoaC_UtHm73R2HrZwVwQmsnv55xNU,3369
37
37
  rclone_api/experimental/flags.py,sha256=qCVD--fSTmzlk9hloRLr0q9elzAOFzPsvVpKM3aB1Mk,2739
38
38
  rclone_api/experimental/flags_base.py,sha256=ajU_czkTcAxXYU-SlmiCfHY7aCQGHvpCLqJ-Z8uZLk0,2102
@@ -47,9 +47,9 @@ rclone_api/s3/multipart/file_info.py,sha256=8v_07_eADo0K-Nsv7F0Ac1wcv3lkIsrR3MaR
47
47
  rclone_api/s3/multipart/finished_piece.py,sha256=TcwA58-qgKBiskfHrePoCWaSSep6Za9psZEpzrLUUhE,1199
48
48
  rclone_api/s3/multipart/upload_info.py,sha256=d6_OfzFR_vtDzCEegFfzCfWi2kUBUV4aXZzqAEVp1c4,1874
49
49
  rclone_api/s3/multipart/upload_state.py,sha256=f-Aq2NqtAaMUMhYitlICSNIxCKurWAl2gDEUVizLIqw,6019
50
- rclone_api-1.4.2.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
51
- rclone_api-1.4.2.dist-info/METADATA,sha256=oRC3WBMs6KdWFK8NOJOaa2LjKC4ze4tKy7fQlU63uIA,4627
52
- rclone_api-1.4.2.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
53
- rclone_api-1.4.2.dist-info/entry_points.txt,sha256=fJteOlYVwgX3UbNuL9jJ0zUTuX2O79JFAeNgK7Sw7EQ,255
54
- rclone_api-1.4.2.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
55
- rclone_api-1.4.2.dist-info/RECORD,,
50
+ rclone_api-1.4.4.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
51
+ rclone_api-1.4.4.dist-info/METADATA,sha256=qUjt3zZ0FKik4AqUkdvWOGhIrShXrgFOwEsfROcVRSE,4627
52
+ rclone_api-1.4.4.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
53
+ rclone_api-1.4.4.dist-info/entry_points.txt,sha256=fJteOlYVwgX3UbNuL9jJ0zUTuX2O79JFAeNgK7Sw7EQ,255
54
+ rclone_api-1.4.4.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
55
+ rclone_api-1.4.4.dist-info/RECORD,,