From 89cf6aabf2973753c303c780755a836d6512fe28 Mon Sep 17 00:00:00 2001 From: death916 Date: Thu, 29 Jan 2026 04:14:47 -0800 Subject: [PATCH 1/4] time limit --- src/c2cscrape.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/c2cscrape.py b/src/c2cscrape.py index 6758045..9f7bc26 100644 --- a/src/c2cscrape.py +++ b/src/c2cscrape.py @@ -19,7 +19,7 @@ class TorrentScrape: def __init__(self): self.url = "https://knaben.org/search/coast%20to%20coast%20am/0/1/date" self.episodes = [] - self.download_amount = 5 + self.download_amount: int = 5 self.last_download = None self.last_download_link = None self.headers = { @@ -133,12 +133,12 @@ class Qbittorrent: for link in links: try: + # "/" added for creating subdir so abs finds properly self.download_path = self.download_path + "/" - torrent.torrents_add(urls=link, save_path=self.download_path) torrent.torrents_add( - urls=link, - save_path=self.download_path, + urls=link, save_path=self.download_path, seeding_time_limit=1 ) + logging.info(f"Added torrent {link} to qbittorrent") except Exception as e: logging.error(f"Error adding torrent {link} to qbittorrent: {e}") From 18dda2271f255279b67470f8ac7543ab0651ff20 Mon Sep 17 00:00:00 2001 From: death916 Date: Thu, 29 Jan 2026 04:53:30 -0800 Subject: [PATCH 2/4] try nfo parse --- src/c2cscrape.py | 179 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git a/src/c2cscrape.py b/src/c2cscrape.py index 9f7bc26..a462350 100644 --- a/src/c2cscrape.py +++ b/src/c2cscrape.py @@ -87,6 +87,179 @@ class TorrentScrape: logging.info("Returning link to qbit") return links # need to return link later to qbit but need to decide logic + def generate_nfo_content(self, content): + lines = [line.strip() for line in content.splitlines()] + # Remove separator lines if present + lines = [line for line in lines if not set(line).issubset({"-"}) and line] + + info = { + "title": "Unknown Title", + "host": "Unknown Host", + "guests": [], + "date": "Unknown Date", + "description": "", + } + + # Heuristic parsing + if lines: + info["title"] = lines[0] + + desc_lines = [] + parsing_desc = False + + for i, line in enumerate(lines): + if i == 0: + continue + + lower_line = line.lower() + if lower_line.startswith("hosted by"): + info["host"] = line.split("by", 1)[1].strip() + elif lower_line.startswith("host:"): + info["host"] = line.split(":", 1)[1].strip() + elif lower_line.startswith("guests:") or lower_line.startswith("guest:"): + if ":" in line: + val = line.split(":", 1)[1].strip() + if val: + info["guests"].append(val) + if i + 1 < len(lines): + next_line = lines[i + 1] + # Check if next line is a date or month, if not, assume it's a guest continuation + is_date = any( + x in next_line.lower() + for x in [ + "friday", + "monday", + "tuesday", + "wednesday", + "thursday", + "saturday", + "sunday", + "january", + "february", + "march", + "april", + "may", + "june", + "july", + "august", + "september", + "october", + "november", + "december", + ] + ) + if not is_date: + info["guests"].append(next_line) + + elif any( + day in lower_line + for day in [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday", + ] + ) and any( + month in lower_line + for month in [ + "january", + "february", + "march", + "april", + "may", + "june", + "july", + "august", + "september", + "october", + "november", + "december", + ] + ): + info["date"] = line + parsing_desc = True + elif parsing_desc: + desc_lines.append(line) + # Fallback for simple format: if we are deep in file and haven't found date, treat as description + elif not parsing_desc and i > 3 and not info.get("date") == "Unknown Date": + desc_lines.append(line) + + info["description"] = "\n".join(desc_lines) + + # Copyright year extraction + year = "202X" + if "," in info["date"]: + try: + year = info["date"].split(",")[-1].strip() + except: + pass + + nfo_template = f"""General Information +=================== + Title: {info["title"]} + Author: Coast to Coast AM + Read By: {info["host"]} + Copyright: (c){year} Premiere Networks + Genre: Talk Radio / Paranormal + Publisher: Coast to Coast AM + Duration: 04:00:00 (Approx) + +Media Information +================= + Source Format: MP3 + Source Sample Rate: 44100 Hz + Source Channels: 2 + Source Bitrate: 64 kbits + + Encoded Codec: MP3 + Encoded Sample Rate: 44100 Hz + Encoded Channels: 2 + Encoded Bitrate: 64 kbits + +Book Description +================ +{info["description"]} + +Guest(s): {", ".join(info["guests"])} +""" + return nfo_template + + def add_nfo(self): + """Add nfo file to episode folders by reading the downloaded .txt""" + if not os.path.exists(self.download_location): + logging.warning( + f"Download path {self.download_location} does not exist. Skipping NFO generation." + ) + return + + logging.info( + f"Scanning {self.download_location} for .txt files to generate .nfo..." + ) + + for root, dirs, files in os.walk(self.download_location): + for file in files: + if file.endswith(".txt") and not file.endswith("_debug.txt"): + txt_path = os.path.join(root, file) + nfo_path = os.path.splitext(txt_path)[0] + ".nfo" + + if os.path.exists(nfo_path): + continue + + try: + with open(txt_path, "r", encoding="utf-8") as f: + content = f.read() + + nfo_content = self.generate_nfo_content(content) + if nfo_content: + with open(nfo_path, "w", encoding="utf-8") as f: + f.write(nfo_content) + logging.info(f"Created NFO: {nfo_path}") + except Exception as e: + logging.error(f"Failed to create NFO for {txt_path}: {e}") + class Qbittorrent: def __init__(self): @@ -155,7 +328,11 @@ if __name__ == "__main__": link = scraper.get_torrent_link() torrent = Qbittorrent() torrent.get_credentials() - torrent.add_torrent(link) + if link: + torrent.add_torrent(link) + + # Process NFOs for existing downloads + scraper.add_nfo() """ try: while True: From d9c443d090297c96a4dcb646aee3cf5577a9ef94 Mon Sep 17 00:00:00 2001 From: death916 Date: Fri, 30 Jan 2026 01:14:20 -0800 Subject: [PATCH 3/4] try nfo parse2 --- src/c2cscrape.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/c2cscrape.py b/src/c2cscrape.py index a462350..5f91a53 100644 --- a/src/c2cscrape.py +++ b/src/c2cscrape.py @@ -229,17 +229,22 @@ Guest(s): {", ".join(info["guests"])} def add_nfo(self): """Add nfo file to episode folders by reading the downloaded .txt""" - if not os.path.exists(self.download_location): + # Ensure we are using the path from the environment + download_location = os.getenv("QB_DOWNLOAD_PATH") + + if not download_location: + logging.warning("QB_DOWNLOAD_PATH is not set. Skipping NFO generation.") + return + + if not os.path.exists(download_location): logging.warning( - f"Download path {self.download_location} does not exist. Skipping NFO generation." + f"Download path {download_location} does not exist. Skipping NFO generation." ) return - logging.info( - f"Scanning {self.download_location} for .txt files to generate .nfo..." - ) + logging.info(f"Scanning {download_location} for .txt files to generate .nfo...") - for root, dirs, files in os.walk(self.download_location): + for root, dirs, files in os.walk(download_location): for file in files: if file.endswith(".txt") and not file.endswith("_debug.txt"): txt_path = os.path.join(root, file) From 3b396711908daea84b1fbba6ba74ca6e58df89dc Mon Sep 17 00:00:00 2001 From: death916 Date: Fri, 30 Jan 2026 01:48:25 -0800 Subject: [PATCH 4/4] try nfo parse3 --- src/c2cscrape.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c2cscrape.py b/src/c2cscrape.py index 5f91a53..eae7961 100644 --- a/src/c2cscrape.py +++ b/src/c2cscrape.py @@ -230,7 +230,7 @@ Guest(s): {", ".join(info["guests"])} def add_nfo(self): """Add nfo file to episode folders by reading the downloaded .txt""" # Ensure we are using the path from the environment - download_location = os.getenv("QB_DOWNLOAD_PATH") + download_location = os.getenv("QB_DOWNLOAD_PATH") or self.download_location if not download_location: logging.warning("QB_DOWNLOAD_PATH is not set. Skipping NFO generation.")