From 24fcba6bee514b676b639c01344ecf4e110dcc80 Mon Sep 17 00:00:00 2001 From: Sergey Khruschak Date: Tue, 3 Feb 2026 18:09:36 +0200 Subject: [PATCH] Torrent file name sanitizing (#390) Hi, I've added file names sanitization when saving the torrent file, as previously the import was failing on torrents with special characters in names. This fixes #367 --- media_manager/torrent/utils.py | 3 ++- pyproject.toml | 1 + uv.lock | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/media_manager/torrent/utils.py b/media_manager/torrent/utils.py index 2fb57d9..18a2534 100644 --- a/media_manager/torrent/utils.py +++ b/media_manager/torrent/utils.py @@ -9,6 +9,7 @@ import bencoder import libtorrent import patoolib import requests +from pathvalidate import sanitize_filename from requests.exceptions import InvalidSchema from media_manager.config import MediaManagerConfig @@ -132,7 +133,7 @@ def get_torrent_hash(torrent: IndexerQueryResult) -> str: :return: The hash of the torrent. """ torrent_filepath = ( - MediaManagerConfig().misc.torrent_directory / f"{torrent.title}.torrent" + MediaManagerConfig().misc.torrent_directory / f"{sanitize_filename(torrent.title)}.torrent" ) if torrent_filepath.exists(): log.warning(f"Torrent file already exists at: {torrent_filepath}") diff --git a/pyproject.toml b/pyproject.toml index 33038ac..e7319ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "sabnzbd-api>=0.1.2", "transmission-rpc>=7.0.11", "libtorrent>=2.0.11", + "pathvalidate>=3.3.1", ] [dependency-groups] diff --git a/uv.lock b/uv.lock index 51c539d..27bd392 100644 --- a/uv.lock +++ b/uv.lock @@ -864,6 +864,7 @@ dependencies = [ { name = "httpx-oauth" }, { name = "jsonschema" }, { name = "libtorrent" }, + { name = "pathvalidate" }, { name = "patool" }, { name = "pillow" }, { name = "psycopg", extra = ["binary"] }, @@ -903,6 +904,7 @@ requires-dist = [ { name = "httpx-oauth", specifier = ">=0.16.1" }, { name = "jsonschema", specifier = ">=4.24.0" }, { name = "libtorrent", specifier = ">=2.0.11" }, + { name = "pathvalidate", specifier = ">=3.3.1" }, { name = "patool", specifier = ">=4.0.1" }, { name = "pillow", specifier = ">=11.3.0" }, { name = "psycopg", extras = ["binary"], specifier = ">=3.2.9" }, @@ -946,6 +948,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "pathvalidate" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, +] + [[package]] name = "patool" version = "4.0.3"