rclone-api 1.1.45__py2.py3-none-any.whl → 1.1.46__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/mount.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import platform
3
+ import shutil
3
4
  import subprocess
4
5
  import time
5
6
  import warnings
@@ -19,6 +20,8 @@ class Mount:
19
20
  mount_path: Path
20
21
  process: Process
21
22
  read_only: bool
23
+ cache_dir: Path | None = None
24
+ cache_dir_delete_on_exit: bool | None = None
22
25
  _closed: bool = False
23
26
 
24
27
  def __post_init__(self):
@@ -32,6 +35,8 @@ class Mount:
32
35
  return
33
36
  self._closed = True
34
37
  clean_mount(self, verbose=False, wait=wait)
38
+ if self.cache_dir and self.cache_dir_delete_on_exit:
39
+ _cache_dir_delete_on_exit(self.cache_dir)
35
40
 
36
41
  def __enter__(self) -> "Mount":
37
42
  return self
@@ -179,3 +184,11 @@ def clean_mount(mount: Mount | Path, verbose: bool = False, wait=True) -> None:
179
184
  else:
180
185
  if verbose:
181
186
  print(f"{mount_path} successfully cleaned up.")
187
+
188
+
189
+ def _cache_dir_delete_on_exit(cache_dir: Path) -> None:
190
+ if cache_dir.exists():
191
+ try:
192
+ shutil.rmtree(cache_dir)
193
+ except Exception as e:
194
+ warnings.warn(f"Error removing cache directory {cache_dir}: {e}")
rclone_api/rclone.py CHANGED
@@ -852,30 +852,35 @@ class Rclone:
852
852
  if direct_io:
853
853
  other_args += ["--direct-io"]
854
854
 
855
- try:
856
- # use scoped mount to do the read, then write the bytes to the destination
857
- with self.scoped_mount(
858
- src_parent_path,
859
- tmp_mnt,
860
- use_links=True,
861
- verbose=mount_log is not None,
862
- vfs_cache_mode="minimal",
863
- other_args=other_args,
864
- log=mount_log,
865
- ):
866
- src_file_mnt = tmp_mnt / src_file
867
- with open(src_file_mnt, "rb") as f:
868
- f.seek(offset)
869
- data = f.read(length)
870
- if outfile is None:
871
- return data
872
- with open(outfile, "wb") as out:
873
- out.write(data)
874
- del data
875
- return bytes(0)
876
-
877
- except Exception as e:
878
- return e
855
+ with TemporaryDirectory() as tmpdir:
856
+ cache_dir = Path(tmpdir) / "cache"
857
+ other_args += ["--cache-dir", str(cache_dir.absolute())]
858
+ try:
859
+ # use scoped mount to do the read, then write the bytes to the destination
860
+ with self.scoped_mount(
861
+ src_parent_path,
862
+ tmp_mnt,
863
+ use_links=True,
864
+ verbose=mount_log is not None,
865
+ vfs_cache_mode="minimal",
866
+ other_args=other_args,
867
+ log=mount_log,
868
+ cache_dir=cache_dir,
869
+ cache_dir_delete_on_exit=True,
870
+ ):
871
+ src_file_mnt = tmp_mnt / src_file
872
+ with open(src_file_mnt, "rb") as f:
873
+ f.seek(offset)
874
+ data = f.read(length)
875
+ if outfile is None:
876
+ return data
877
+ with open(outfile, "wb") as out:
878
+ out.write(data)
879
+ del data
880
+ return bytes(0)
881
+
882
+ except Exception as e:
883
+ return e
879
884
 
880
885
  def copy_dir(
881
886
  self, src: str | Dir, dst: str | Dir, args: list[str] | None = None
@@ -909,6 +914,8 @@ class Rclone:
909
914
  use_links: bool | None = None,
910
915
  vfs_cache_mode: str | None = None,
911
916
  verbose: bool | None = None,
917
+ cache_dir: Path | None = None,
918
+ cache_dir_delete_on_exit: bool | None = None,
912
919
  log: Path | None = None,
913
920
  other_args: list[str] | None = None,
914
921
  ) -> Mount:
@@ -941,6 +948,9 @@ class Rclone:
941
948
  if vfs_cache_mode:
942
949
  cmd_list.append("--vfs-cache-mode")
943
950
  cmd_list.append(vfs_cache_mode)
951
+ if cache_dir:
952
+ cmd_list.append("--cache-dir")
953
+ cmd_list.append(str(cache_dir.absolute()))
944
954
  if debug_fuse:
945
955
  cmd_list.append("--debug-fuse")
946
956
  if verbose:
@@ -949,7 +959,13 @@ class Rclone:
949
959
  cmd_list += other_args
950
960
  proc = self._launch_process(cmd_list, log=log)
951
961
  mount_read_only = not allow_writes
952
- mount: Mount = Mount(mount_path=outdir, process=proc, read_only=mount_read_only)
962
+ mount: Mount = Mount(
963
+ mount_path=outdir,
964
+ process=proc,
965
+ read_only=mount_read_only,
966
+ cache_dir=cache_dir,
967
+ cache_dir_delete_on_exit=cache_dir_delete_on_exit,
968
+ )
953
969
  return mount
954
970
 
955
971
  @contextmanager
@@ -962,6 +978,8 @@ class Rclone:
962
978
  vfs_cache_mode: str | None = None,
963
979
  verbose: bool | None = None,
964
980
  log: Path | None = None,
981
+ cache_dir: Path | None = None,
982
+ cache_dir_delete_on_exit: bool | None = None,
965
983
  other_args: list[str] | None = None,
966
984
  ) -> Generator[Mount, None, None]:
967
985
  """Like mount, but can be used in a context manager."""
@@ -973,6 +991,8 @@ class Rclone:
973
991
  use_links=use_links,
974
992
  vfs_cache_mode=vfs_cache_mode,
975
993
  verbose=verbose,
994
+ cache_dir=cache_dir,
995
+ cache_dir_delete_on_exit=cache_dir_delete_on_exit,
976
996
  log=log,
977
997
  other_args=other_args,
978
998
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.45
3
+ Version: 1.1.46
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -11,9 +11,9 @@ rclone_api/exec.py,sha256=Pd7pUBd8ib5MzqvMybG2DQISPRbDRu20VjVRL2mLAVY,1076
11
11
  rclone_api/file.py,sha256=EP5yT2dZ0H2p7CY5n0y5k5pHhIliV25pm8KOwBklUTk,1863
12
12
  rclone_api/filelist.py,sha256=xbiusvNgaB_b_kQOZoHMJJxn6TWGtPrWd2J042BI28o,767
13
13
  rclone_api/group_files.py,sha256=H92xPW9lQnbNw5KbtZCl00bD6iRh9yRbCuxku4j_3dg,8036
14
- rclone_api/mount.py,sha256=RgzGfJakHxgiTsLu0bFX4ZYIzr4GAdIH8CMlz-M-hsY,6267
14
+ rclone_api/mount.py,sha256=_19IXIm3PHoXc78dIvFwkVT7QKp7Z0ian_bbhqF5Uq0,6723
15
15
  rclone_api/process.py,sha256=rBj_S86jC6nqCYop-jq8r9eMSteKeObxUrJMgH8LZvI,5084
16
- rclone_api/rclone.py,sha256=-cMgLNykn4JFP83-sFeVWArFl28173LXgdWvpPr0_rE,42933
16
+ rclone_api/rclone.py,sha256=ODHPq1OKKzOUgi7QPDc1UZHZLSoG9SkxnT1MXpoggx4,43823
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
@@ -33,9 +33,9 @@ rclone_api/s3/chunk_types.py,sha256=LbXayXY1KgVU1LkdbASD_BQ7TpVpwVnzMjtz--8LBaE,
33
33
  rclone_api/s3/create.py,sha256=wgfkapv_j904CfKuWyiBIWJVxfAx_ftemFSUV14aT68,3149
34
34
  rclone_api/s3/types.py,sha256=yBnJ38Tjk6RlydJ-sqZ7DSfyFloy8KDYJ0mv3vlOzLE,1388
35
35
  rclone_api/s3/upload_file_multipart.py,sha256=y9azNAU8QH5Ovwz33V2HZwNmJdlFjJg-jrXLZ1gtMds,10364
36
- rclone_api-1.1.45.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
- rclone_api-1.1.45.dist-info/METADATA,sha256=ZLx1uXz3hoeN194vwCxzj98SdfbBtdfRAeDtMKqafE0,4537
38
- rclone_api-1.1.45.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
- rclone_api-1.1.45.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
- rclone_api-1.1.45.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
- rclone_api-1.1.45.dist-info/RECORD,,
36
+ rclone_api-1.1.46.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
+ rclone_api-1.1.46.dist-info/METADATA,sha256=EsjWo8M-ncF3sRre9SnUMVBhFShdVLsFcE9VtAbwLS0,4537
38
+ rclone_api-1.1.46.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
+ rclone_api-1.1.46.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
+ rclone_api-1.1.46.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
+ rclone_api-1.1.46.dist-info/RECORD,,