library 3.2.5__tar.gz → 3.2.6__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.
Files changed (159) hide show
  1. {library-3.2.5 → library-3.2.6}/.github/README.md +13 -1
  2. {library-3.2.5 → library-3.2.6}/PKG-INFO +14 -2
  3. {library-3.2.5 → library-3.2.6}/library/__main__.py +1 -1
  4. {library-3.2.5 → library-3.2.6}/library/playback/torrents_info.py +40 -26
  5. {library-3.2.5 → library-3.2.6}/library/usage.py +12 -0
  6. {library-3.2.5 → library-3.2.6}/library/utils/arggroups.py +10 -0
  7. {library-3.2.5 → library-3.2.6}/pyproject.toml +1 -1
  8. {library-3.2.5 → library-3.2.6}/LICENSE +0 -0
  9. {library-3.2.5 → library-3.2.6}/library/__init__.py +0 -0
  10. {library-3.2.5 → library-3.2.6}/library/assets/__init__.py +0 -0
  11. {library-3.2.5 → library-3.2.6}/library/assets/calibre.css +0 -0
  12. {library-3.2.5 → library-3.2.6}/library/assets/kotobago.png +0 -0
  13. {library-3.2.5 → library-3.2.6}/library/createdb/__init__.py +0 -0
  14. {library-3.2.5 → library-3.2.6}/library/createdb/av.py +0 -0
  15. {library-3.2.5 → library-3.2.6}/library/createdb/computer_info.py +0 -0
  16. {library-3.2.5 → library-3.2.6}/library/createdb/computers_add.py +0 -0
  17. {library-3.2.5 → library-3.2.6}/library/createdb/fs_add.py +0 -0
  18. {library-3.2.5 → library-3.2.6}/library/createdb/fs_add_metadata.py +0 -0
  19. {library-3.2.5 → library-3.2.6}/library/createdb/gallery_add.py +0 -0
  20. {library-3.2.5 → library-3.2.6}/library/createdb/gallery_backend.py +0 -0
  21. {library-3.2.5 → library-3.2.6}/library/createdb/getty_add.py +0 -0
  22. {library-3.2.5 → library-3.2.6}/library/createdb/hn_add.py +0 -0
  23. {library-3.2.5 → library-3.2.6}/library/createdb/links_add.py +0 -0
  24. {library-3.2.5 → library-3.2.6}/library/createdb/nicotine_import.py +0 -0
  25. {library-3.2.5 → library-3.2.6}/library/createdb/places_import.py +0 -0
  26. {library-3.2.5 → library-3.2.6}/library/createdb/reddit_add.py +0 -0
  27. {library-3.2.5 → library-3.2.6}/library/createdb/row_add.py +0 -0
  28. {library-3.2.5 → library-3.2.6}/library/createdb/site_add.py +0 -0
  29. {library-3.2.5 → library-3.2.6}/library/createdb/substack.py +0 -0
  30. {library-3.2.5 → library-3.2.6}/library/createdb/subtitle.py +0 -0
  31. {library-3.2.5 → library-3.2.6}/library/createdb/tables_add.py +0 -0
  32. {library-3.2.5 → library-3.2.6}/library/createdb/tabs_add.py +0 -0
  33. {library-3.2.5 → library-3.2.6}/library/createdb/tildes.py +0 -0
  34. {library-3.2.5 → library-3.2.6}/library/createdb/torrents_add.py +0 -0
  35. {library-3.2.5 → library-3.2.6}/library/createdb/tube_add.py +0 -0
  36. {library-3.2.5 → library-3.2.6}/library/createdb/tube_backend.py +0 -0
  37. {library-3.2.5 → library-3.2.6}/library/createdb/web_add.py +0 -0
  38. {library-3.2.5 → library-3.2.6}/library/data/__init__.py +0 -0
  39. {library-3.2.5 → library-3.2.6}/library/data/dictionary.pkl +0 -0
  40. {library-3.2.5 → library-3.2.6}/library/data/ffmpeg_errors.py +0 -0
  41. {library-3.2.5 → library-3.2.6}/library/data/http_errors.py +0 -0
  42. {library-3.2.5 → library-3.2.6}/library/data/imagemagick_errors.py +0 -0
  43. {library-3.2.5 → library-3.2.6}/library/data/unar_errors.py +0 -0
  44. {library-3.2.5 → library-3.2.6}/library/data/wordbank.py +0 -0
  45. {library-3.2.5 → library-3.2.6}/library/data/yt_dlp_errors.py +0 -0
  46. {library-3.2.5 → library-3.2.6}/library/editdb/__init__.py +0 -0
  47. {library-3.2.5 → library-3.2.6}/library/editdb/dedupe_db.py +0 -0
  48. {library-3.2.5 → library-3.2.6}/library/editdb/dedupe_media.py +0 -0
  49. {library-3.2.5 → library-3.2.6}/library/editdb/merge_online_local.py +0 -0
  50. {library-3.2.5 → library-3.2.6}/library/editdb/mpv_watchlater.py +0 -0
  51. {library-3.2.5 → library-3.2.6}/library/editdb/pushshift.py +0 -0
  52. {library-3.2.5 → library-3.2.6}/library/editdb/reddit_selftext.py +0 -0
  53. {library-3.2.5 → library-3.2.6}/library/files/__init__.py +0 -0
  54. {library-3.2.5 → library-3.2.6}/library/files/christen.py +0 -0
  55. {library-3.2.5 → library-3.2.6}/library/files/sample_compare.py +0 -0
  56. {library-3.2.5 → library-3.2.6}/library/files/sample_hash.py +0 -0
  57. {library-3.2.5 → library-3.2.6}/library/files/similar_files.py +0 -0
  58. {library-3.2.5 → library-3.2.6}/library/folders/__init__.py +0 -0
  59. {library-3.2.5 → library-3.2.6}/library/folders/big_dirs.py +0 -0
  60. {library-3.2.5 → library-3.2.6}/library/folders/filter_src.py +0 -0
  61. {library-3.2.5 → library-3.2.6}/library/folders/merge_mv.py +0 -0
  62. {library-3.2.5 → library-3.2.6}/library/folders/mergerfs_cp.py +0 -0
  63. {library-3.2.5 → library-3.2.6}/library/folders/mount_stats.py +0 -0
  64. {library-3.2.5 → library-3.2.6}/library/folders/move_list.py +0 -0
  65. {library-3.2.5 → library-3.2.6}/library/folders/scatter.py +0 -0
  66. {library-3.2.5 → library-3.2.6}/library/folders/similar_folders.py +0 -0
  67. {library-3.2.5 → library-3.2.6}/library/fsdb/__init__.py +0 -0
  68. {library-3.2.5 → library-3.2.6}/library/fsdb/disk_usage.py +0 -0
  69. {library-3.2.5 → library-3.2.6}/library/fsdb/filesystem.py +0 -0
  70. {library-3.2.5 → library-3.2.6}/library/fsdb/folder_stats.py +0 -0
  71. {library-3.2.5 → library-3.2.6}/library/fsdb/search_db.py +0 -0
  72. {library-3.2.5 → library-3.2.6}/library/lb.py +0 -0
  73. {library-3.2.5 → library-3.2.6}/library/mediadb/__init__.py +0 -0
  74. {library-3.2.5 → library-3.2.6}/library/mediadb/block.py +0 -0
  75. {library-3.2.5 → library-3.2.6}/library/mediadb/db_history.py +0 -0
  76. {library-3.2.5 → library-3.2.6}/library/mediadb/db_media.py +0 -0
  77. {library-3.2.5 → library-3.2.6}/library/mediadb/db_playlists.py +0 -0
  78. {library-3.2.5 → library-3.2.6}/library/mediadb/download.py +0 -0
  79. {library-3.2.5 → library-3.2.6}/library/mediadb/download_status.py +0 -0
  80. {library-3.2.5 → library-3.2.6}/library/mediadb/history.py +0 -0
  81. {library-3.2.5 → library-3.2.6}/library/mediadb/history_add.py +0 -0
  82. {library-3.2.5 → library-3.2.6}/library/mediadb/optimize_db.py +0 -0
  83. {library-3.2.5 → library-3.2.6}/library/mediadb/playlists.py +0 -0
  84. {library-3.2.5 → library-3.2.6}/library/mediadb/redownload.py +0 -0
  85. {library-3.2.5 → library-3.2.6}/library/mediadb/search.py +0 -0
  86. {library-3.2.5 → library-3.2.6}/library/mediadb/stats.py +0 -0
  87. {library-3.2.5 → library-3.2.6}/library/mediafiles/__init__.py +0 -0
  88. {library-3.2.5 → library-3.2.6}/library/mediafiles/images_to_pdf.py +0 -0
  89. {library-3.2.5 → library-3.2.6}/library/mediafiles/media_check.py +0 -0
  90. {library-3.2.5 → library-3.2.6}/library/mediafiles/pdf_edit.py +0 -0
  91. {library-3.2.5 → library-3.2.6}/library/mediafiles/process_ffmpeg.py +0 -0
  92. {library-3.2.5 → library-3.2.6}/library/mediafiles/process_image.py +0 -0
  93. {library-3.2.5 → library-3.2.6}/library/mediafiles/process_media.py +0 -0
  94. {library-3.2.5 → library-3.2.6}/library/mediafiles/process_text.py +0 -0
  95. {library-3.2.5 → library-3.2.6}/library/mediafiles/torrents_dump.py +0 -0
  96. {library-3.2.5 → library-3.2.6}/library/mediafiles/torrents_start.py +0 -0
  97. {library-3.2.5 → library-3.2.6}/library/mediafiles/unardel.py +0 -0
  98. {library-3.2.5 → library-3.2.6}/library/misc/__init__.py +0 -0
  99. {library-3.2.5 → library-3.2.6}/library/misc/dedupe_czkawka.py +0 -0
  100. {library-3.2.5 → library-3.2.6}/library/misc/export_text.py +0 -0
  101. {library-3.2.5 → library-3.2.6}/library/misc/search_help.py +0 -0
  102. {library-3.2.5 → library-3.2.6}/library/multidb/__init__.py +0 -0
  103. {library-3.2.5 → library-3.2.6}/library/multidb/allocate_torrents.py +0 -0
  104. {library-3.2.5 → library-3.2.6}/library/multidb/copy_play_counts.py +0 -0
  105. {library-3.2.5 → library-3.2.6}/library/multidb/merge_dbs.py +0 -0
  106. {library-3.2.5 → library-3.2.6}/library/playback/__init__.py +0 -0
  107. {library-3.2.5 → library-3.2.6}/library/playback/links_open.py +0 -0
  108. {library-3.2.5 → library-3.2.6}/library/playback/media_player.py +0 -0
  109. {library-3.2.5 → library-3.2.6}/library/playback/media_printer.py +0 -0
  110. {library-3.2.5 → library-3.2.6}/library/playback/play_actions.py +0 -0
  111. {library-3.2.5 → library-3.2.6}/library/playback/playback_control.py +0 -0
  112. {library-3.2.5 → library-3.2.6}/library/playback/post_actions.py +0 -0
  113. {library-3.2.5 → library-3.2.6}/library/playback/surf.py +0 -0
  114. {library-3.2.5 → library-3.2.6}/library/playback/tabs_open.py +0 -0
  115. {library-3.2.5 → library-3.2.6}/library/playback/torrents_remaining.py +0 -0
  116. {library-3.2.5 → library-3.2.6}/library/readme.py +0 -0
  117. {library-3.2.5 → library-3.2.6}/library/tablefiles/__init__.py +0 -0
  118. {library-3.2.5 → library-3.2.6}/library/tablefiles/columns.py +0 -0
  119. {library-3.2.5 → library-3.2.6}/library/tablefiles/eda.py +0 -0
  120. {library-3.2.5 → library-3.2.6}/library/tablefiles/incremental_diff.py +0 -0
  121. {library-3.2.5 → library-3.2.6}/library/tablefiles/markdown_tables.py +0 -0
  122. {library-3.2.5 → library-3.2.6}/library/tablefiles/mcda.py +0 -0
  123. {library-3.2.5 → library-3.2.6}/library/tablefiles/plot.py +0 -0
  124. {library-3.2.5 → library-3.2.6}/library/text/__init__.py +0 -0
  125. {library-3.2.5 → library-3.2.6}/library/text/cluster_sort.py +0 -0
  126. {library-3.2.5 → library-3.2.6}/library/text/combinations.py +0 -0
  127. {library-3.2.5 → library-3.2.6}/library/text/expand_links.py +0 -0
  128. {library-3.2.5 → library-3.2.6}/library/text/extract_links.py +0 -0
  129. {library-3.2.5 → library-3.2.6}/library/text/extract_text.py +0 -0
  130. {library-3.2.5 → library-3.2.6}/library/text/json_keys_rename.py +0 -0
  131. {library-3.2.5 → library-3.2.6}/library/text/markdown_links.py +0 -0
  132. {library-3.2.5 → library-3.2.6}/library/text/nouns.py +0 -0
  133. {library-3.2.5 → library-3.2.6}/library/text/regex_sort.py +0 -0
  134. {library-3.2.5 → library-3.2.6}/library/text/timestamps.py +0 -0
  135. {library-3.2.5 → library-3.2.6}/library/utils/__init__.py +0 -0
  136. {library-3.2.5 → library-3.2.6}/library/utils/arg_utils.py +0 -0
  137. {library-3.2.5 → library-3.2.6}/library/utils/argparse_utils.py +0 -0
  138. {library-3.2.5 → library-3.2.6}/library/utils/consts.py +0 -0
  139. {library-3.2.5 → library-3.2.6}/library/utils/date_utils.py +0 -0
  140. {library-3.2.5 → library-3.2.6}/library/utils/db_utils.py +0 -0
  141. {library-3.2.5 → library-3.2.6}/library/utils/devices.py +0 -0
  142. {library-3.2.5 → library-3.2.6}/library/utils/file_utils.py +0 -0
  143. {library-3.2.5 → library-3.2.6}/library/utils/filter_engine.py +0 -0
  144. {library-3.2.5 → library-3.2.6}/library/utils/gui.py +0 -0
  145. {library-3.2.5 → library-3.2.6}/library/utils/iterables.py +0 -0
  146. {library-3.2.5 → library-3.2.6}/library/utils/log_utils.py +0 -0
  147. {library-3.2.5 → library-3.2.6}/library/utils/mpv_utils.py +0 -0
  148. {library-3.2.5 → library-3.2.6}/library/utils/nums.py +0 -0
  149. {library-3.2.5 → library-3.2.6}/library/utils/objects.py +0 -0
  150. {library-3.2.5 → library-3.2.6}/library/utils/path_utils.py +0 -0
  151. {library-3.2.5 → library-3.2.6}/library/utils/pd_utils.py +0 -0
  152. {library-3.2.5 → library-3.2.6}/library/utils/printing.py +0 -0
  153. {library-3.2.5 → library-3.2.6}/library/utils/processes.py +0 -0
  154. {library-3.2.5 → library-3.2.6}/library/utils/remote_processes.py +0 -0
  155. {library-3.2.5 → library-3.2.6}/library/utils/shell_utils.py +0 -0
  156. {library-3.2.5 → library-3.2.6}/library/utils/sql_utils.py +0 -0
  157. {library-3.2.5 → library-3.2.6}/library/utils/sqlgroups.py +0 -0
  158. {library-3.2.5 → library-3.2.6}/library/utils/strings.py +0 -0
  159. {library-3.2.5 → library-3.2.6}/library/utils/web.py +0 -0
@@ -99,7 +99,7 @@ To stop playing press Ctrl+C in either the terminal or mpv
99
99
  <details><summary>List all subcommands</summary>
100
100
 
101
101
  $ library
102
- library (v3.2.005; 102 subcommands)
102
+ library (v3.2.006; 102 subcommands)
103
103
 
104
104
  Create database subcommands:
105
105
  ╭─────────────────┬──────────────────────────────────────────╮
@@ -3042,6 +3042,18 @@ Inspired somewhat by https://nikkhokkho.sourceforge.io/?page=FileOptimizer
3042
3042
 
3043
3043
  library torrents query
3044
3044
 
3045
+ Positional torrent searches use the path aligned with torrent status by default.
3046
+ Search a specific path field or both fields with --path-search:
3047
+
3048
+ library torrents --dl --path-search save /mnt/d4/
3049
+ library torrents --dl --path-search both /mnt/d4/
3050
+
3051
+ Find incomplete torrents whose temp and final paths use different drives.
3052
+ --different-drives searches both path fields unless --path-search is specified:
3053
+
3054
+ library torrents --dl --different-drives
3055
+ library torrents --dl --different-drives /mnt/d4/
3056
+
3045
3057
  Aggregate torrent info (torrents-status)
3046
3058
 
3047
3059
  library torrents -pa
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: library
3
- Version: 3.2.5
3
+ Version: 3.2.6
4
4
  Summary: xk media library
5
5
  Author-Email: Jacob Chapman <7908073+chapmanjacobd@users.noreply.github.com>
6
6
  License: BSD 3-Clause License
@@ -207,7 +207,7 @@ To stop playing press Ctrl+C in either the terminal or mpv
207
207
  <details><summary>List all subcommands</summary>
208
208
 
209
209
  $ library
210
- library (v3.2.005; 102 subcommands)
210
+ library (v3.2.006; 102 subcommands)
211
211
 
212
212
  Create database subcommands:
213
213
  ╭─────────────────┬──────────────────────────────────────────╮
@@ -3150,6 +3150,18 @@ Inspired somewhat by https://nikkhokkho.sourceforge.io/?page=FileOptimizer
3150
3150
 
3151
3151
  library torrents query
3152
3152
 
3153
+ Positional torrent searches use the path aligned with torrent status by default.
3154
+ Search a specific path field or both fields with --path-search:
3155
+
3156
+ library torrents --dl --path-search save /mnt/d4/
3157
+ library torrents --dl --path-search both /mnt/d4/
3158
+
3159
+ Find incomplete torrents whose temp and final paths use different drives.
3160
+ --different-drives searches both path fields unless --path-search is specified:
3161
+
3162
+ library torrents --dl --different-drives
3163
+ library torrents --dl --different-drives /mnt/d4/
3164
+
3153
3165
  Aggregate torrent info (torrents-status)
3154
3166
 
3155
3167
  library torrents -pa
@@ -5,7 +5,7 @@ from tabulate import tabulate
5
5
  from library.utils import argparse_utils, iterables
6
6
  from library.utils.log_utils import log
7
7
 
8
- __version__ = "3.2.005"
8
+ __version__ = "3.2.006"
9
9
 
10
10
  progs = {
11
11
  "Create database subcommands": {
@@ -297,6 +297,8 @@ def filter_torrents_by_criteria(args, torrents):
297
297
 
298
298
  if args.private is not None:
299
299
  torrents = [t for t in torrents if args.private is t.private]
300
+ if args.different_drives:
301
+ torrents = [t for t in torrents if torrent_paths_on_different_drives(t)]
300
302
  if args.no_tagged:
301
303
  tags = set(args.no_tagged)
302
304
  torrents = [t for t in torrents if tags.isdisjoint(t.tags.split(", "))]
@@ -309,7 +311,7 @@ def filter_torrents_by_criteria(args, torrents):
309
311
  for t in torrents
310
312
  if strings.glob_match_all(
311
313
  args.torrent_search,
312
- [t.name, t.comment, t.save_path if t.state_enum.is_complete else t.download_path, t.hash],
314
+ [t.name, t.comment, *torrent_paths_for_search(args, t), t.hash],
313
315
  )
314
316
  ]
315
317
  if args.torrent_exclude:
@@ -318,7 +320,7 @@ def filter_torrents_by_criteria(args, torrents):
318
320
  for t in torrents
319
321
  if not strings.glob_match_any(
320
322
  args.torrent_exclude,
321
- [t.name, t.comment, t.save_path if t.state_enum.is_complete else t.download_path, t.hash],
323
+ [t.name, t.comment, *torrent_paths_for_search(args, t), t.hash],
322
324
  )
323
325
  ]
324
326
  if args.torrent_include:
@@ -327,7 +329,7 @@ def filter_torrents_by_criteria(args, torrents):
327
329
  for t in torrents
328
330
  if strings.glob_match_any(
329
331
  args.torrent_include,
330
- [t.name, t.comment, t.save_path if t.state_enum.is_complete else t.download_path, t.hash],
332
+ [t.name, t.comment, *torrent_paths_for_search(args, t), t.hash],
331
333
  )
332
334
  ]
333
335
  if args.file_search:
@@ -502,6 +504,36 @@ def map_value_status(t, status):
502
504
  return MAP_VALUE.get(status, t.state == status)
503
505
 
504
506
 
507
+ def torrent_paths_for_search(args, t):
508
+ path_search = getattr(args, "path_search", None)
509
+ if path_search is None:
510
+ path_search = "both" if getattr(args, "different_drives", False) else "status"
511
+ if path_search == "download":
512
+ return [t.download_path]
513
+ if path_search == "save":
514
+ return [t.save_path]
515
+ if path_search == "both":
516
+ return [t.download_path, t.save_path]
517
+ return [t.save_path if t.state_enum.is_complete else t.download_path]
518
+
519
+
520
+ def torrent_paths_on_different_drives(t):
521
+ if not t.download_path or not t.save_path:
522
+ return False
523
+ return path_utils.mountpoint(t.download_path) != path_utils.mountpoint(t.save_path)
524
+
525
+
526
+ def set_torrent_paths(qbt_client, t, temp_path, download_path):
527
+ save_path = download_path if download_path is not None else t.save_path
528
+ if save_path:
529
+ print(" ", t.save_path, "==>", save_path)
530
+ qbt_client.torrents_set_location(str(save_path), torrent_hashes=[t.hash])
531
+
532
+ if temp_path is not None:
533
+ print(" ", t.download_path, "-->", temp_path)
534
+ qbt_client.torrents_set_download_path(str(temp_path), torrent_hashes=[t.hash])
535
+
536
+
505
537
  def torrents_info():
506
538
  args = parse_args()
507
539
 
@@ -914,21 +946,6 @@ def torrents_info():
914
946
  k not in args.defaults for k in ["temp_drive", "temp_prefix", "download_drive", "download_prefix"]
915
947
  )
916
948
  if args.move or alt_move_syntax:
917
-
918
- def set_temp_path(t, temp_path):
919
- if temp_path is None:
920
- return
921
-
922
- print(" ", t.download_path, "-->", temp_path)
923
- qbt_client.torrents_set_download_path(str(temp_path), torrent_hashes=[t.hash])
924
-
925
- def set_download_path(t, download_path):
926
- if download_path is None:
927
- return
928
-
929
- print(" ", t.save_path, "==>", download_path)
930
- qbt_client.torrents_set_save_path(str(download_path), torrent_hashes=[t.hash])
931
-
932
949
  for idx, t in enumerate(torrents):
933
950
  print("Moving", idx + 1, "of", len(torrents))
934
951
 
@@ -993,28 +1010,25 @@ def torrents_info():
993
1010
  log.debug("download_path %s", download_path)
994
1011
 
995
1012
  new_path = download_path if t.state_enum.is_complete else temp_path
1013
+ if new_path is None:
1014
+ new_path = t.save_path if t.state_enum.is_complete else t.download_path
996
1015
  if args.simulate:
997
1016
  print("Moving", t.content_path, "to", new_path)
998
1017
  continue
999
1018
 
1000
1019
  content_path = Path(t.content_path) if t.content_path else None
1001
- if content_path and content_path.exists():
1020
+ if content_path and content_path.exists() and new_path is not None:
1002
1021
  if content_path.is_file():
1003
1022
  print("Moving file", content_path, "to", new_path)
1004
1023
  merge_mv.move(args, [str(content_path)], str(new_path))
1005
1024
  else:
1006
- new_path /= content_path.name
1025
+ new_path = Path(new_path) / content_path.name
1007
1026
  print("Moving folder", content_path, "to", new_path)
1008
1027
  merge_mv.move(args, [str(content_path)], str(new_path))
1009
1028
 
1010
1029
  if not (args.delete_files or args.delete_rows):
1011
1030
  # update metadata
1012
- if t.state_enum.is_complete: # temp path first
1013
- set_temp_path(t, temp_path)
1014
- set_download_path(t, download_path)
1015
- else: # download path first
1016
- set_download_path(t, download_path)
1017
- set_temp_path(t, temp_path)
1031
+ set_torrent_paths(qbt_client, t, temp_path, download_path)
1018
1032
 
1019
1033
  if not originally_stopped:
1020
1034
  qbt_client.torrents_start(torrent_hashes=[t.hash])
@@ -1991,6 +1991,18 @@ torrents_info = """library torrents-info
1991
1991
 
1992
1992
  library torrents query
1993
1993
 
1994
+ Positional torrent searches use the path aligned with torrent status by default.
1995
+ Search a specific path field or both fields with --path-search:
1996
+
1997
+ library torrents --dl --path-search save /mnt/d4/
1998
+ library torrents --dl --path-search both /mnt/d4/
1999
+
2000
+ Find incomplete torrents whose temp and final paths use different drives.
2001
+ --different-drives searches both path fields unless --path-search is specified:
2002
+
2003
+ library torrents --dl --different-drives
2004
+ library torrents --dl --different-drives /mnt/d4/
2005
+
1994
2006
  Aggregate torrent info (torrents-status)
1995
2007
 
1996
2008
  library torrents -pa
@@ -2795,6 +2795,16 @@ def qBittorrent_torrents(parent_parser):
2795
2795
  help="Include torrents with files currently in use by processes",
2796
2796
  )
2797
2797
  parser.add_argument("--private", action=argparse.BooleanOptionalAction, help="Match only private torrents")
2798
+ parser.add_argument(
2799
+ "--different-drives",
2800
+ action=argparse.BooleanOptionalAction,
2801
+ help="Include torrents whose incomplete and final paths are on different mountpoints",
2802
+ )
2803
+ parser.add_argument(
2804
+ "--path-search",
2805
+ choices=["status", "download", "save", "both"],
2806
+ help="Path used by positional torrent searches: status, download, save, or both",
2807
+ )
2798
2808
 
2799
2809
  parser.add_argument(
2800
2810
  "--sizes",
@@ -35,7 +35,7 @@ dynamic = []
35
35
  name = "library"
36
36
  readme = ".github/README.md"
37
37
  requires-python = ">=3.12"
38
- version = "3.2.5"
38
+ version = "3.2.6"
39
39
 
40
40
  [project.license]
41
41
  file = "LICENSE"
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