qBitrr2 5.8.7__py3-none-any.whl → 5.8.8__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.
qBitrr/webui.py CHANGED
@@ -1664,6 +1664,30 @@ class WebUI:
1664
1664
  }
1665
1665
  _populate_process_metadata(arr, kind, payload)
1666
1666
  procs.append(payload)
1667
+ # qBit category manager processes
1668
+ for process, meta in list(self.manager._process_registry.items()):
1669
+ if meta.get("role") != "category_manager":
1670
+ continue
1671
+ instance_name = meta.get("instance", "")
1672
+ cat = meta.get("category", f"qbit-{instance_name}")
1673
+ manager = self.manager.qbit_category_managers.get(instance_name)
1674
+ category_count = len(manager.managed_categories) if manager else 0
1675
+ try:
1676
+ alive = bool(process.is_alive())
1677
+ pid = getattr(process, "pid", None)
1678
+ except Exception:
1679
+ alive = False
1680
+ pid = None
1681
+ procs.append(
1682
+ {
1683
+ "category": cat,
1684
+ "name": f"qBit-{instance_name}",
1685
+ "kind": "category",
1686
+ "pid": pid,
1687
+ "alive": alive,
1688
+ "categoryCount": category_count,
1689
+ }
1690
+ )
1667
1691
  return {"processes": procs}
1668
1692
 
1669
1693
  @app.get("/api/processes")
@@ -1679,8 +1703,56 @@ class WebUI:
1679
1703
 
1680
1704
  def _restart_process(category: str, kind: str):
1681
1705
  kind_normalized = kind.lower()
1682
- if kind_normalized not in ("search", "torrent", "all"):
1683
- return jsonify({"error": "kind must be search, torrent or all"}), 400
1706
+ if kind_normalized not in ("search", "torrent", "all", "category"):
1707
+ return jsonify({"error": "kind must be search, torrent, category or all"}), 400
1708
+
1709
+ # Handle category manager restart
1710
+ if kind_normalized == "category":
1711
+ target_proc = None
1712
+ target_meta = None
1713
+ for proc, meta in list(self.manager._process_registry.items()):
1714
+ if meta.get("role") == "category_manager" and meta.get("category") == category:
1715
+ target_proc = proc
1716
+ target_meta = meta
1717
+ break
1718
+ if target_proc is None:
1719
+ return jsonify({"error": f"Unknown category manager {category}"}), 404
1720
+ instance_name = target_meta.get("instance", "")
1721
+ try:
1722
+ target_proc.kill()
1723
+ except Exception:
1724
+ pass
1725
+ try:
1726
+ target_proc.terminate()
1727
+ except Exception:
1728
+ pass
1729
+ try:
1730
+ self.manager.child_processes.remove(target_proc)
1731
+ except Exception:
1732
+ pass
1733
+ self.manager._process_registry.pop(target_proc, None)
1734
+ manager = self.manager.qbit_category_managers.get(instance_name)
1735
+ if manager is None:
1736
+ return (
1737
+ jsonify({"error": f"No category manager for instance {instance_name}"}),
1738
+ 404,
1739
+ )
1740
+ import pathos
1741
+
1742
+ new_proc = pathos.helpers.mp.Process(
1743
+ target=manager.run_processing_loop,
1744
+ name=f"qBitCategory-{instance_name}",
1745
+ daemon=False,
1746
+ )
1747
+ new_proc.start()
1748
+ self.manager.child_processes.append(new_proc)
1749
+ self.manager._process_registry[new_proc] = {
1750
+ "category": category,
1751
+ "role": "category_manager",
1752
+ "instance": instance_name,
1753
+ }
1754
+ return jsonify({"status": "ok", "restarted": ["category"]})
1755
+
1684
1756
  managed = _managed_objects()
1685
1757
  if not managed:
1686
1758
  if not _ensure_arr_manager_ready():
@@ -2092,6 +2164,129 @@ class WebUI:
2092
2164
  def web_arr_list():
2093
2165
  return jsonify(_arr_list_payload())
2094
2166
 
2167
+ @app.get("/web/qbit/categories")
2168
+ def web_qbit_categories():
2169
+ """Get all qBit-managed and Arr-managed categories with seeding statistics."""
2170
+ categories_data = []
2171
+
2172
+ # Add qBit-managed categories
2173
+ if self.manager.qbit_category_managers:
2174
+ for instance_name, manager in self.manager.qbit_category_managers.items():
2175
+ client = self.manager.get_client(instance_name)
2176
+ if not client:
2177
+ continue
2178
+
2179
+ for category in manager.managed_categories:
2180
+ try:
2181
+ torrents = client.torrents_info(category=category)
2182
+
2183
+ # Calculate statistics
2184
+ total_count = len(torrents)
2185
+ seeding_count = len(
2186
+ [t for t in torrents if t.state in ("uploading", "stalledUP")]
2187
+ )
2188
+ total_size = sum(t.size for t in torrents)
2189
+ avg_ratio = (
2190
+ sum(t.ratio for t in torrents) / total_count if total_count else 0
2191
+ )
2192
+ avg_seeding_time = (
2193
+ sum(t.seeding_time for t in torrents) / total_count
2194
+ if total_count
2195
+ else 0
2196
+ )
2197
+
2198
+ # Get seeding config for this category
2199
+ seeding_config = manager.get_seeding_config(category)
2200
+
2201
+ categories_data.append(
2202
+ {
2203
+ "category": category,
2204
+ "instance": instance_name,
2205
+ "managedBy": "qbit",
2206
+ "torrentCount": total_count,
2207
+ "seedingCount": seeding_count,
2208
+ "totalSize": total_size,
2209
+ "avgRatio": round(avg_ratio, 2),
2210
+ "avgSeedingTime": avg_seeding_time,
2211
+ "seedingConfig": {
2212
+ "maxRatio": seeding_config.get("MaxUploadRatio", -1),
2213
+ "maxTime": seeding_config.get("MaxSeedingTime", -1),
2214
+ "removeMode": seeding_config.get("RemoveTorrent", -1),
2215
+ "downloadLimit": seeding_config.get(
2216
+ "DownloadRateLimitPerTorrent", -1
2217
+ ),
2218
+ "uploadLimit": seeding_config.get(
2219
+ "UploadRateLimitPerTorrent", -1
2220
+ ),
2221
+ },
2222
+ }
2223
+ )
2224
+ except Exception as e:
2225
+ self.logger.debug(
2226
+ "Error fetching qBit category '%s' stats for instance '%s': %s",
2227
+ category,
2228
+ instance_name,
2229
+ e,
2230
+ )
2231
+ continue
2232
+
2233
+ # Add Arr-managed categories
2234
+ if hasattr(self.manager, "arr_manager") and self.manager.arr_manager:
2235
+ for arr in self.manager.arr_manager.managed_objects.values():
2236
+ try:
2237
+ # Get the qBit instance for this Arr (use default for now)
2238
+ client = self.manager.client
2239
+ if not client:
2240
+ continue
2241
+
2242
+ category = arr.category
2243
+ torrents = client.torrents_info(category=category)
2244
+
2245
+ # Calculate statistics
2246
+ total_count = len(torrents)
2247
+ seeding_count = len(
2248
+ [t for t in torrents if t.state in ("uploading", "stalledUP")]
2249
+ )
2250
+ total_size = sum(t.size for t in torrents)
2251
+ avg_ratio = (
2252
+ sum(t.ratio for t in torrents) / total_count if total_count else 0
2253
+ )
2254
+ avg_seeding_time = (
2255
+ sum(t.seeding_time for t in torrents) / total_count
2256
+ if total_count
2257
+ else 0
2258
+ )
2259
+
2260
+ categories_data.append(
2261
+ {
2262
+ "category": category,
2263
+ "instance": arr._name,
2264
+ "managedBy": "arr",
2265
+ "torrentCount": total_count,
2266
+ "seedingCount": seeding_count,
2267
+ "totalSize": total_size,
2268
+ "avgRatio": round(avg_ratio, 2),
2269
+ "avgSeedingTime": avg_seeding_time,
2270
+ "seedingConfig": {
2271
+ "maxRatio": arr.seeding_mode_global_max_upload_ratio,
2272
+ "maxTime": arr.seeding_mode_global_max_seeding_time,
2273
+ "removeMode": arr.seeding_mode_global_remove_torrent,
2274
+ "downloadLimit": arr.seeding_mode_global_download_limit,
2275
+ "uploadLimit": arr.seeding_mode_global_upload_limit,
2276
+ },
2277
+ }
2278
+ )
2279
+ except Exception as e:
2280
+ self.logger.debug(
2281
+ "Error fetching Arr category '%s' stats for instance '%s': %s",
2282
+ getattr(arr, "category", "unknown"),
2283
+ getattr(arr, "_name", "unknown"),
2284
+ e,
2285
+ )
2286
+ continue
2287
+
2288
+ return jsonify({"categories": categories_data, "ready": True})
2289
+
2095
2290
  @app.get("/api/meta")
2096
2291
  def api_meta():
2097
2292
  if (resp := require_token()) is not None:
@@ -2221,11 +2416,21 @@ class WebUI:
2221
2416
  name = getattr(arr, "_name", k)
2222
2417
  category = getattr(arr, "category", k)
2223
2418
  arrs.append({"category": category, "name": name, "type": t, "alive": alive})
2419
+ # WebUI settings
2420
+ webui_settings = {
2421
+ "LiveArr": CONFIG.get("WebUI.LiveArr", fallback=True),
2422
+ "GroupSonarr": CONFIG.get("WebUI.GroupSonarr", fallback=True),
2423
+ "GroupLidarr": CONFIG.get("WebUI.GroupLidarr", fallback=True),
2424
+ "Theme": CONFIG.get("WebUI.Theme", fallback="Dark"),
2425
+ "ViewDensity": CONFIG.get("WebUI.ViewDensity", fallback="Comfortable"),
2426
+ }
2427
+
2224
2428
  return {
2225
2429
  "qbit": qb, # Legacy single-instance (default) for backward compatibility
2226
2430
  "qbitInstances": qbit_instances, # Multi-instance info
2227
2431
  "arrs": arrs,
2228
2432
  "ready": _ensure_arr_manager_ready(),
2433
+ "webui": webui_settings,
2229
2434
  }
2230
2435
 
2231
2436
  @app.get("/api/status")
@@ -2421,6 +2626,7 @@ class WebUI:
2421
2626
  "WebUI.GroupSonarr",
2422
2627
  "WebUI.GroupLidarr",
2423
2628
  "WebUI.Theme",
2629
+ "WebUI.ViewDensity",
2424
2630
  }
2425
2631
  webui_restart_keys = {
2426
2632
  "WebUI.Host",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qBitrr2
3
- Version: 5.8.7
3
+ Version: 5.8.8
4
4
  Summary: Intelligent automation for qBittorrent and *Arr apps (Radarr/Sonarr/Lidarr) - health monitoring, instant imports, quality upgrades, request integration
5
5
  Home-page: https://github.com/Feramance/qBitrr
6
6
  Author: Feramance
@@ -171,7 +171,7 @@ Access the WebUI at `http://<host>:6969/ui` after startup.
171
171
 
172
172
  ## ✨ Key Features
173
173
 
174
- - **🚀 Multi-qBittorrent Support (v3.0+)** – Manage torrents across multiple qBittorrent instances for load balancing, redundancy, and VPN isolation
174
+ - **🚀 Multi-qBittorrent Support (v5.7.x+)** – Manage torrents across multiple qBittorrent instances for load balancing, redundancy, and VPN isolation
175
175
  - **🚑 Torrent Health Monitoring** – Detect stalled/failed downloads, auto-blacklist, trigger re-searches
176
176
  - **🔍 Automated Search** – Missing media, quality upgrades, custom format scoring
177
177
  - **🎯 Request Integration** – Pull requests from Overseerr/Ombi, prioritize user-requested media
@@ -206,7 +206,7 @@ Access the WebUI at `http://<host>:6969/ui` after startup.
206
206
  CompletedDownloadFolder = "/path/to/completed"
207
207
  ```
208
208
 
209
- ### 🆕 Multi-qBittorrent (v3.0+)
209
+ ### 🆕 Multi-qBittorrent (v5.7.x+)
210
210
 
211
211
  Manage torrents across multiple qBittorrent instances:
212
212
 
@@ -1,24 +1,25 @@
1
1
  qBitrr/__init__.py,sha256=smiPIV7d2lMJ_KTtFdAVlxLEBobFTheILdgry1iqpjQ,405
2
- qBitrr/arss.py,sha256=7UUELHKrvGrWax6UE26YY0ZRSplEqiczgQLio9ssOsM,360730
2
+ qBitrr/arss.py,sha256=EUy9Sze2t4in9S918laDrSdYQgC_FjoBNyja6EiwBZY,363464
3
3
  qBitrr/auto_update.py,sha256=3mqlKKGnaWR5dNI58LN5WbHOMFRDWBsOs0zIC79QzQk,13359
4
- qBitrr/bundled_data.py,sha256=Ll0oR4Y1809sEdB2gCEuQptr-XZfCz51QDfXGITCqxg,221
4
+ qBitrr/bundled_data.py,sha256=3UB7Vl3cnyAfM08eB741MW0L5FTjJHpuenBU_wBv-hc,221
5
5
  qBitrr/config.py,sha256=BtvzQCQnRHEGzNykEa-WsiWKPjwXCb7wMx994z3rWMs,6306
6
- qBitrr/config_version.py,sha256=eWfc7DuthsDGwv2WJAZ7uB7srSqxaUD3Oj9kac3HbFE,4208
7
- qBitrr/database.py,sha256=CCVW2T33RGfWSH3tTRjoWoQ1yQ5LCkRjqdOz5MKsXHg,4795
6
+ qBitrr/config_version.py,sha256=1u9qaBoRqnZk8Zxi4_d_j5VeRtJxSZDHLarVyokSqw4,4208
7
+ qBitrr/database.py,sha256=gv_X550XrHQ6tCKrpXxHL7xjVh0U1GP9Pk3_M_kRl-Q,5605
8
8
  qBitrr/db_lock.py,sha256=ZM6TQagBOkcS7h9BDGsdxhCo5aJ5SMvtKSM_X7HLu8M,15375
9
9
  qBitrr/db_recovery.py,sha256=4kS9mWKrBYE9135m7cxvCOriSxz6lz7Dw4MT6gz81SM,6438
10
10
  qBitrr/env_config.py,sha256=299u_uEoyxlM_ceTD0Z_i41JdYjSHmqO6FKe7qGFgTM,2866
11
11
  qBitrr/errors.py,sha256=5_n1x0XX4UvMlieC_J1Hc5pq5JD17orfjJy9KfxDXA4,1107
12
12
  qBitrr/ffprobe.py,sha256=2IM0iuPPTEb0xHmN1OetQoBd80-Nmv5Oq7P6o-mjBd0,4019
13
- qBitrr/gen_config.py,sha256=U827i2xg1mywgx7nV9_cfhiDFN6ITz_1SUwP6LjnraQ,48391
13
+ qBitrr/gen_config.py,sha256=9jTc2HuMOsCYXuSBNuxobJiwvG5f04vZKHj7ZQv94o0,53855
14
14
  qBitrr/home_path.py,sha256=zvBheAR2xvr8LBZRk1FyqfnALE-eFzsY9CyqyZDjxiE,626
15
15
  qBitrr/logger.py,sha256=f3LNcvl4lizTxQMXjFzv5urpPbUYEkaSGVGFP39cNbk,9005
16
- qBitrr/main.py,sha256=0nTY4V8ze6mDrQln9qrxIc7SuE6PShx1Zg_T5xb-XGU,51176
16
+ qBitrr/main.py,sha256=Oc3DLf6-vgOwiebiJ5rqIdQPyIlJ0NScRUif68eelvM,60374
17
+ qBitrr/qbit_category_manager.py,sha256=iShzJKrg6TOvY1BeFJZONwOHVBIv919hoO-Mxa7RC6c,10047
17
18
  qBitrr/search_activity_store.py,sha256=JuJ0PQxSPBguacyqus2I4_g3qEYReOhZbghOjJOoE7o,1770
18
19
  qBitrr/tables.py,sha256=hAHYmpSjdbXyOXABUDXmQKFgf_TQLrgYlCQPZEZWN8o,6187
19
20
  qBitrr/utils.py,sha256=T10win016yHwMMJlJ4yuPTRUI9m-AS_a_MouiAJAtC8,8190
20
21
  qBitrr/versioning.py,sha256=vjQ55rMInuEte9PXQo29FLxF0ff643Ttm3_ri5ghXPM,4542
21
- qBitrr/webui.py,sha256=9EVcKlB4ZcGhzUSazxsPuVg2--SMD2wfth6kXWd4eYA,138704
22
+ qBitrr/webui.py,sha256=f6XzljjJGtZdNh8AVV7RTah3RLLR5ASMeWJgGi88ll4,148742
22
23
  qBitrr/static/favicon-16x16.png,sha256=LrsZjRNNIivd0M-6OEghkY0bCYQNz_88kh-A6DDUpC4,1063
23
24
  qBitrr/static/favicon-32x32.png,sha256=n3S3d7McOUokBxHEItYH2lEPmrgU7z0z652jeRrFwVQ,3398
24
25
  qBitrr/static/favicon-48x48.png,sha256=r-co_lnPpXOLIptGm8FNZ4kM7QQkanwz_7vRxUAeqi0,6808
@@ -31,17 +32,21 @@ qBitrr/static/logov2-clean.svg,sha256=7m2shg7Tdyee7RFKb9tYP35OiEN6TzoXVCBGSPYBjj
31
32
  qBitrr/static/manifest.json,sha256=xg3ZiPDIhlZ2Wlaq4KKlcsoND-b9cA0-51cRf2rDYRQ,840
32
33
  qBitrr/static/sw.js,sha256=7YrOxAFxZdfWk1IDtsSfApgQEwpnamipyEmMRcStp1I,3215
33
34
  qBitrr/static/vite.svg,sha256=__cChi4Uw84Bm4HYbgegc0dkysIspdu-hULUpoLkgrI,1498
34
- qBitrr/static/assets/ArrView.js,sha256=gOMoN9V66Ktjxj772Q70jazBu2y_sOyrUqRISx0YCBk,70797
35
- qBitrr/static/assets/ArrView.js.map,sha256=LLEzw7x_XOdFVik33IhEBsWZX2Mn-RkRefzaT10Zbtg,269435
36
- qBitrr/static/assets/ConfigView.js,sha256=X9-ovxOiExIMFDaDqZ-ajJJJSGzQsObNjgOLFKy2PIw,72036
37
- qBitrr/static/assets/ConfigView.js.map,sha256=puLlBaPUmBXEUH9YWazhIshZE2DbH6LYMQMnumswwss,290042
38
- qBitrr/static/assets/LogsView.js,sha256=W76pJiNn9PzdSiHNYXvQ9KajOcneyewdnxWjudao7L0,119172
39
- qBitrr/static/assets/LogsView.js.map,sha256=yzdMUlhQ4NJMy3AGA5IX_gUu59l-Mrkr6o2pisLPnPU,473243
40
- qBitrr/static/assets/ProcessesView.js,sha256=kSj5EaOvuXmYSubs1PtfHfDxtIMM_r3VEpvyBSApKnQ,8700
41
- qBitrr/static/assets/ProcessesView.js.map,sha256=975P9fLI3OpJZQy6vtOhTWSqbFXoN-i5xzvzgif8R_Y,31217
42
- qBitrr/static/assets/app.css,sha256=L7jo9n_6V3iEPoNsVX455r08Dw_BPEwgi-cDpTe7VJs,59279
43
- qBitrr/static/assets/app.js,sha256=Scj3SOq9O1o9tHopB4YkXlvrec_liMJfh4nAiuSTUY0,209156
44
- qBitrr/static/assets/app.js.map,sha256=04TrzsCM_5Tsrog5e-uw6jy9mNXC0dX_dIxJdSjRh50,948995
35
+ qBitrr/static/assets/ArrView.js,sha256=eugCRq3EciIMesT5lqWSGYJs_sWnY7Hx7Gf6AfjTWUM,67404
36
+ qBitrr/static/assets/ArrView.js.map,sha256=9OuWzKZUNIV0b44zFaVagOsYsnkXgFmWIaFLksKP_G8,261896
37
+ qBitrr/static/assets/ConfigView.js,sha256=5lldcn78FDXXFC33CUKI5pbfs8CWeOLAa1oTmyRRAdU,74836
38
+ qBitrr/static/assets/ConfigView.js.map,sha256=EfJGJ3wp5OO8-2gH4jl60TgDdOIit0Aa3iW36pqkfHg,300118
39
+ qBitrr/static/assets/LogsView.js,sha256=JWSiqhP8Sz3Q0uyqN1B-qjoxSlJYwALxamLPwc73lW8,120519
40
+ qBitrr/static/assets/LogsView.js.map,sha256=1Up1sUIdA3Z6GTdrQFaTVpxe4ZPWNGTXR0CW9eBfa8k,477954
41
+ qBitrr/static/assets/ProcessesView.js,sha256=vcDtCedEUb3QOJ2KPLTbiQh7HnZanhT606fxDmL7fXc,9739
42
+ qBitrr/static/assets/ProcessesView.js.map,sha256=nhB3Fh6UJ0nhZmPnjyZ7ePcbb-VXFV7C9gHVAXDmkiA,35009
43
+ qBitrr/static/assets/QbitCategoriesView.js,sha256=WlWzTYjwMaeU4jwp7je8CmLxkRDlKp8OI0BQWzq5kjU,4473
44
+ qBitrr/static/assets/QbitCategoriesView.js.map,sha256=POSCXYQmOJhWBgteC3KIYf3E7CZDkP0qJIK0Kjv7j6Q,14480
45
+ qBitrr/static/assets/StableTable.js,sha256=vR1UmKePzpsTqwPO_fd5hK88q1UUI4HgPi6ptU4NTow,865
46
+ qBitrr/static/assets/StableTable.js.map,sha256=OnLQZ5xLunOBgKFaDJ3bsYu3l5t9PwZq2__in7mfp8c,3209
47
+ qBitrr/static/assets/app.css,sha256=kcD6mLGMoB6eZr9YuPQpI-SVDOMB5U18wfJyaDDaVMQ,62273
48
+ qBitrr/static/assets/app.js,sha256=J0v1k8bef7FxE32ZPmPBMcI5Wfz6iBbl_IOrtwFfM0c,329861
49
+ qBitrr/static/assets/app.js.map,sha256=ocbIy2qFlOdez6qlVapYn_994VKQrDfzUbHLgiapMDc,1675897
45
50
  qBitrr/static/assets/build.svg,sha256=27zJoFZFP0MMNjnviRKjOUbGLu2D-1EcIpiMAfOXnJA,46338
46
51
  qBitrr/static/assets/check-mark.svg,sha256=P4sn_w6VKsXjhqzeFYoQmaPtUFJ_QwPWq-aD_dPJJqU,9198
47
52
  qBitrr/static/assets/close.svg,sha256=au7m-xbkwpqz2ZLUi6kj4VzTqIX36eC3dKjPGMUVLnU,8697
@@ -56,18 +61,18 @@ qBitrr/static/assets/process.svg,sha256=MjYdVD-V2ppLmYkFxxdGZD2_vZoxkFXlknN4Lu3_
56
61
  qBitrr/static/assets/react-select.esm.js,sha256=BBt1p7Jty3eEXT3eCJUjupm8ospqtunBLDe7VScnffw,87207
57
62
  qBitrr/static/assets/react-select.esm.js.map,sha256=JylFlRCyyE4DQCRLxx3J_21hH_g1kaGWdTbo2Rrnl28,434216
58
63
  qBitrr/static/assets/refresh-arrow.svg,sha256=OUoCjJcWftxZhuu_y55yaK5u-_yMJz8T3V1VW6OVpaE,42996
59
- qBitrr/static/assets/table.js,sha256=dz6u3f2buNU35dD6CjutUfP445qE50DcCT5slrKF6HQ,51212
64
+ qBitrr/static/assets/table.js,sha256=65UYsWZTg1ImtPmj6VgOuS42Kzxev0b2iJNMiSNxyaw,51212
60
65
  qBitrr/static/assets/table.js.map,sha256=nZBl5yvXF-Tai0DrQO2tRy8FNrKIrmbKW12No1kEp3Y,219738
61
66
  qBitrr/static/assets/trash.svg,sha256=tLOjR43oeZbwF5q122mSjMCQ_1rn_HccGhHRZeV2IB0,15217
62
67
  qBitrr/static/assets/up-arrow.svg,sha256=HyOwDB7w7lMiJQjM8TbkhUn0tYWAzp-MHg8c0wiVly0,34508
63
68
  qBitrr/static/assets/useInterval.js,sha256=zm4pu9wHmALteKqv_vW7W3y4NA6hNpHFU2XhESsiolk,287
64
69
  qBitrr/static/assets/useInterval.js.map,sha256=3KvsE2Do5LepkgpP-0XBHeGOprIQiDIdKJ6CgOwNCv0,1002
65
- qBitrr/static/assets/vendor.js,sha256=uDL8OA1Nbl4ZlnDVLXOmaKPBVqK6pBsoDiRriXdDk04,11357
66
- qBitrr/static/assets/vendor.js.map,sha256=Nj3zAKcjMhDma3lqUKGqQvwozZmbx4SEMBKBLXTi9io,42253
70
+ qBitrr/static/assets/vendor.js,sha256=a0DLsM2_pLLaGl-lrbiG4kFjmAaVonBGNZ-6PALexQ8,11357
71
+ qBitrr/static/assets/vendor.js.map,sha256=4J-X0n_bKs6iVl82Az1mqxCzNGMraUwYQ99x55buMOs,42253
67
72
  qBitrr/static/assets/visibility.svg,sha256=258DiSuUKs2SH9dhhDDU88JQfLAlNQMvOGewc9uaTK4,9767
68
- qbitrr2-5.8.7.dist-info/licenses/LICENSE,sha256=P978aVGi7dPbKz8lfvdiryOS5IjTAU7AA47XhBhVBlI,1066
69
- qbitrr2-5.8.7.dist-info/METADATA,sha256=pipq_Pdmiv6gk8_Rz5EOSNPU0bqLnMt_2Ll8sATIcuY,11549
70
- qbitrr2-5.8.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
71
- qbitrr2-5.8.7.dist-info/entry_points.txt,sha256=MIR-l5s31VBs9qlv3HiAaMdpOOyy0MNGfM7Ib1-fKeQ,43
72
- qbitrr2-5.8.7.dist-info/top_level.txt,sha256=jIINodarzsPcQeTf-vvK8-_g7cQ8CvxEg41ms14K97g,7
73
- qbitrr2-5.8.7.dist-info/RECORD,,
73
+ qbitrr2-5.8.8.dist-info/licenses/LICENSE,sha256=P978aVGi7dPbKz8lfvdiryOS5IjTAU7AA47XhBhVBlI,1066
74
+ qbitrr2-5.8.8.dist-info/METADATA,sha256=XcDjTb2VN76QZJZWKazN3t2EBYoAxtKBA9L5-IG9asg,11553
75
+ qbitrr2-5.8.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
76
+ qbitrr2-5.8.8.dist-info/entry_points.txt,sha256=MIR-l5s31VBs9qlv3HiAaMdpOOyy0MNGfM7Ib1-fKeQ,43
77
+ qbitrr2-5.8.8.dist-info/top_level.txt,sha256=jIINodarzsPcQeTf-vvK8-_g7cQ8CvxEg41ms14K97g,7
78
+ qbitrr2-5.8.8.dist-info/RECORD,,