rclone-api 1.1.42__py2.py3-none-any.whl → 1.1.44__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/rclone.py CHANGED
@@ -832,15 +832,22 @@ class Rclone:
832
832
  tmp_mnt = Path("tmp_mnt") / random_str(12)
833
833
  src_parent_path = Path(src).parent.as_posix()
834
834
  src_file = Path(src).name
835
- other_args: list[str] = ["--no-modtime", "--vfs-read-wait", "1s"]
835
+ other_args: list[str] = [
836
+ "--no-modtime",
837
+ # "--vfs-read-wait", "1s"
838
+ ]
836
839
  vfs_read_chunk_size = SizeSuffix(length // transfers)
837
840
  vfs_read_chunk_size_limit = SizeSuffix(length)
838
841
  vfs_read_chunk_streams = transfers
839
842
  vfs_disk_space_total_size = SizeSuffix(length)
843
+ # --max-read-ahead SizeSuffix
844
+ max_read_ahead = SizeSuffix(vfs_read_chunk_size.as_int())
845
+
840
846
  other_args += ["--vfs-read-chunk-size", str(vfs_read_chunk_size)]
841
847
  other_args += ["--vfs-read-chunk-size-limit", str(vfs_read_chunk_size_limit)]
842
848
  other_args += ["--vfs-read-chunk-streams", str(vfs_read_chunk_streams)]
843
849
  other_args += ["--vfs-disk-space-total-size", str(vfs_disk_space_total_size)]
850
+ other_args += ["--max-read-ahead", str(max_read_ahead)]
844
851
  other_args += ["--read-only"]
845
852
  if direct_io:
846
853
  other_args += ["--direct-io"]
@@ -920,7 +927,7 @@ class Rclone:
920
927
 
921
928
  allow_writes = allow_writes or False
922
929
  use_links = use_links or True
923
- verbose = get_verbose(verbose)
930
+ verbose = get_verbose(verbose) or (log is not None)
924
931
  vfs_cache_mode = vfs_cache_mode or "full"
925
932
  clean_mount(outdir, verbose=verbose)
926
933
  prepare_mount(outdir, verbose=verbose)
@@ -2,6 +2,7 @@ import time
2
2
  import warnings
3
3
  from pathlib import Path
4
4
  from queue import Queue
5
+ from threading import Event
5
6
 
6
7
  from rclone_api.s3.chunk_types import FileChunk, UploadState
7
8
  from rclone_api.util import locked_print
@@ -25,12 +26,16 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
25
26
 
26
27
 
27
28
  def file_chunker(
28
- upload_state: UploadState, max_chunks: int | None, output: Queue[FileChunk | None]
29
+ upload_state: UploadState,
30
+ max_chunks: int | None,
31
+ cancel_signal: Event,
32
+ output: Queue[FileChunk | None],
29
33
  ) -> None:
30
34
  count = 0
31
35
 
32
36
  def should_stop() -> bool:
33
37
  nonlocal count
38
+
34
39
  if max_chunks is None:
35
40
  return False
36
41
  if count >= max_chunks:
@@ -68,6 +73,12 @@ def file_chunker(
68
73
  return None
69
74
  return part_number
70
75
 
76
+ if cancel_signal.is_set():
77
+ print(
78
+ f"Cancel signal is set for file chunker while processing {file_path}, returning"
79
+ )
80
+ return
81
+
71
82
  while not should_stop():
72
83
  curr_parth_num = next_part_number()
73
84
  if curr_parth_num is None:
@@ -5,7 +5,7 @@ import warnings
5
5
  from concurrent.futures import ThreadPoolExecutor
6
6
  from pathlib import Path
7
7
  from queue import Queue
8
- from threading import Thread
8
+ from threading import Event, Thread
9
9
 
10
10
  from botocore.client import BaseClient
11
11
 
@@ -207,16 +207,21 @@ def upload_file_multipart(
207
207
  upload_info = upload_state.upload_info
208
208
 
209
209
  chunker_errors: Queue[Exception] = Queue()
210
+ cancel_chunker_event = Event()
210
211
 
211
212
  def chunker_task(
212
213
  upload_state=upload_state,
213
214
  output=filechunks,
214
215
  max_chunks=max_chunks_before_suspension,
216
+ cancel_signal=cancel_chunker_event,
215
217
  queue_errors=chunker_errors,
216
218
  ) -> None:
217
219
  try:
218
220
  file_chunker(
219
- upload_state=upload_state, output=output, max_chunks=max_chunks
221
+ upload_state=upload_state,
222
+ output=output,
223
+ max_chunks=max_chunks,
224
+ cancel_signal=cancel_signal,
220
225
  )
221
226
  except Exception as e:
222
227
  queue_errors.put(e)
@@ -228,25 +233,30 @@ def upload_file_multipart(
228
233
  thread_chunker.start()
229
234
 
230
235
  with ThreadPoolExecutor(max_workers=upload_threads) as executor:
231
- while True:
232
- file_chunk: FileChunk | None = filechunks.get()
233
- if file_chunk is None:
234
- break
236
+ try:
237
+ while True:
238
+ file_chunk: FileChunk | None = filechunks.get()
239
+ if file_chunk is None:
240
+ break
235
241
 
236
- def task(upload_info=upload_info, file_chunk=file_chunk):
237
- return handle_upload(upload_info, file_chunk)
242
+ def task(upload_info=upload_info, file_chunk=file_chunk):
243
+ return handle_upload(upload_info, file_chunk)
238
244
 
239
- fut = executor.submit(task)
245
+ fut = executor.submit(task)
240
246
 
241
- def done_cb(fut=fut):
242
- result = fut.result()
243
- if isinstance(result, Exception):
244
- warnings.warn(f"Error uploading part: {result}, skipping")
245
- return
246
- # upload_state.finished_parts.put(result)
247
- upload_state.add_finished(result)
247
+ def done_cb(fut=fut):
248
+ result = fut.result()
249
+ if isinstance(result, Exception):
250
+ warnings.warn(f"Error uploading part: {result}, skipping")
251
+ return
252
+ # upload_state.finished_parts.put(result)
253
+ upload_state.add_finished(result)
248
254
 
249
- fut.add_done_callback(done_cb)
255
+ fut.add_done_callback(done_cb)
256
+ except Exception:
257
+ cancel_chunker_event.set()
258
+ executor.shutdown(wait=False, cancel_futures=True)
259
+ raise
250
260
  # upload_state.finished_parts.put(None) # Signal the end of the queue
251
261
  upload_state.add_finished(None)
252
262
  thread_chunker.join()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.42
3
+ Version: 1.1.44
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -13,7 +13,7 @@ rclone_api/filelist.py,sha256=xbiusvNgaB_b_kQOZoHMJJxn6TWGtPrWd2J042BI28o,767
13
13
  rclone_api/group_files.py,sha256=H92xPW9lQnbNw5KbtZCl00bD6iRh9yRbCuxku4j_3dg,8036
14
14
  rclone_api/mount.py,sha256=ryAjkX4_kFeFZWLiBVpcGy2VilpvVhFbWeWfEX4jMKs,6104
15
15
  rclone_api/process.py,sha256=rBj_S86jC6nqCYop-jq8r9eMSteKeObxUrJMgH8LZvI,5084
16
- rclone_api/rclone.py,sha256=0JudOAyBbAa6hJqoCrWwcsX7K9NioR4MrGJ6ZekBTyE,42660
16
+ rclone_api/rclone.py,sha256=eLzqVz67GzIWev8FWztO2T1bp3U64mTGve28Ae3HafY,42886
17
17
  rclone_api/remote.py,sha256=O9WDUFQy9f6oT1HdUbTixK2eg0xtBBm8k4Xl6aa6K00,431
18
18
  rclone_api/rpath.py,sha256=8ZA_1wxWtskwcy0I8V2VbjKDmzPkiWd8Q2JQSvh-sYE,2586
19
19
  rclone_api/scan_missing_folders.py,sha256=Kulca2Q6WZodt00ATFHkmqqInuoPvBkhTcS9703y6po,4740
@@ -28,14 +28,14 @@ rclone_api/experimental/flags_base.py,sha256=ajU_czkTcAxXYU-SlmiCfHY7aCQGHvpCLqJ
28
28
  rclone_api/profile/mount_copy_bytes.py,sha256=Jsvb49CNTvkdSAkIAKDxBJ5TzAk7-dOuZdDrigiTjsY,5684
29
29
  rclone_api/s3/api.py,sha256=qxtRDUpHYqJ7StJRtP8U_PbF_BvYRg705568SyvF-R0,3770
30
30
  rclone_api/s3/basic_ops.py,sha256=hK3366xhVEzEcjz9Gk_8lFx6MRceAk72cax6mUrr6ko,2104
31
- rclone_api/s3/chunk_file.py,sha256=YELR-EzR7RHpzCDGpYdzlwu21NZW5wttIDvLoONI4aU,3477
31
+ rclone_api/s3/chunk_file.py,sha256=D6wM9Nuu73LNGC8JCCfevqjF3qdZ21mQxYQClFLZLMU,3726
32
32
  rclone_api/s3/chunk_types.py,sha256=LbXayXY1KgVU1LkdbASD_BQ7TpVpwVnzMjtz--8LBaE,10316
33
33
  rclone_api/s3/create.py,sha256=wgfkapv_j904CfKuWyiBIWJVxfAx_ftemFSUV14aT68,3149
34
34
  rclone_api/s3/types.py,sha256=yBnJ38Tjk6RlydJ-sqZ7DSfyFloy8KDYJ0mv3vlOzLE,1388
35
- rclone_api/s3/upload_file_multipart.py,sha256=1jQAdk35Fa9Tcq36bS65262cs7AcNG2DAFQ-NdYlWSw,9961
36
- rclone_api-1.1.42.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
- rclone_api-1.1.42.dist-info/METADATA,sha256=vIQ6apt1qDwDIAosms80GILhpDxFHYoR1J4jtPdshCU,4537
38
- rclone_api-1.1.42.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
- rclone_api-1.1.42.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
- rclone_api-1.1.42.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
- rclone_api-1.1.42.dist-info/RECORD,,
35
+ rclone_api/s3/upload_file_multipart.py,sha256=y9azNAU8QH5Ovwz33V2HZwNmJdlFjJg-jrXLZ1gtMds,10364
36
+ rclone_api-1.1.44.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
+ rclone_api-1.1.44.dist-info/METADATA,sha256=KzqVSRiWt6tJgyNu9ehdXyj_ZQoZeX3YkLy5TPPcbo0,4537
38
+ rclone_api-1.1.44.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
+ rclone_api-1.1.44.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
+ rclone_api-1.1.44.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
+ rclone_api-1.1.44.dist-info/RECORD,,