Added tracker info to releases

This commit is contained in:
2026-03-20 22:14:28 -04:00
parent 8f58d8db82
commit 7cd556bab2
6 changed files with 73 additions and 23 deletions

View File

@@ -1 +1 @@
__version__ = "1.0.2" __version__ = "1.0.3"

View File

@@ -2,25 +2,30 @@ import importlib
from pathlib import Path from pathlib import Path
from pkgutil import iter_modules from pkgutil import iter_modules
from typing import Optional, Type from typing import Optional, Type
from xml.etree.ElementTree import Element
from watfag.parsers.generic.parsers import DataParser from watfag.parsers.generic.parsers import DataParser
from watfag.parsers.generic.watfag import * from watfag.parsers.generic.watfag import *
from watfag.parsers.generic.watfag import WATFAG from watfag.parsers.generic.watfag import WATFAG
from watfag.trackers import TrackerInfo
class Release: class Release:
def __init__( def __init__(
self, self,
unparsed_text, xml_result: Element,
dl_link, tracker_info: Optional[TrackerInfo] = None
**kwargs
): ):
self.original_text: str = unparsed_text self.xml: Element = xml_result
self.tracker_info: Optional[TrackerInfo] = tracker_info
self.original_text: str = ''
self.metadata_text: Optional[str] = '' self.metadata_text: Optional[str] = ''
self.dl_link: str = dl_link self.dl_link: str = ''
self.view_link: str = kwargs.get('view_link', dl_link) self.view_link: str = ''
self.size: int = kwargs.get('size', 0) self.size: int = 0
self.seeders: int = kwargs.get('seeders', 0) self.seeders: int = 0
self.tracker: str = ''
self.tracker_abbr: str = ''
self.seed_status: Optional[SeedStatus] = None self.seed_status: Optional[SeedStatus] = None
self.parser_results: dict[str, bool] = {} # Stores which parsers have been run and their results. self.parser_results: dict[str, bool] = {} # Stores which parsers have been run and their results.
@@ -37,6 +42,22 @@ class Release:
self.repack: Optional[Repack] = None self.repack: Optional[Repack] = None
self.multi: Optional[Multi] = None self.multi: Optional[Multi] = None
self._parse_xml()
def _parse_xml(self):
# Get the torznab attributes
attrs: dict[str, list[str]] = {}
for attr in self.xml.findall('torznab:attr', namespaces={'torznab': 'http://torznab.com/schemas/2015/feed'}):
attrs[attr.get('name')] = attrs.get(attr.get('name'), []) + [attr.get('value')]
self.original_text = self.xml.find('title').text
self.dl_link = self.xml.find('link').text
self.size = int(self.xml.find('size').text)
self.seeders = int(attrs.get('seeders')[0])
self.view_link = self.xml.find('comments').text
self.tracker = self.xml.find('jackettindexer').text
self.tracker_abbr = self.tracker_info.get_tracker_info(self.tracker).get('Abbreviation') if self.tracker_info else self.tracker
def __lt__(self, other): def __lt__(self, other):
return self.watfag < other.watfag return self.watfag < other.watfag

View File

@@ -2,15 +2,21 @@ import importlib
from pathlib import Path from pathlib import Path
from pkgutil import iter_modules from pkgutil import iter_modules
from typing import Optional from typing import Optional
from xml.etree.ElementTree import Element
from watfag.parsers.generic import Release, ParserManager from watfag.parsers.generic import Release, ParserManager
from watfag.trackers import TrackerInfo
class MovieRelease(Release): class MovieRelease(Release):
"""Holds info representing a release of a movie.""" """Holds info representing a release of a movie."""
def __init__(self, unparsed_text, dl_link, **kwargs): def __init__(
super().__init__(unparsed_text, dl_link, **kwargs) self,
xml_result: Element,
tracker_info: Optional[TrackerInfo] = None
):
super().__init__(xml_result, tracker_info)
self.year: int = 0 self.year: int = 0
self.edition: Optional[str] = None self.edition: Optional[str] = None

View File

@@ -2,14 +2,20 @@ import importlib
from pathlib import Path from pathlib import Path
from pkgutil import iter_modules from pkgutil import iter_modules
from typing import Optional from typing import Optional
from xml.etree.ElementTree import Element
from watfag.parsers.generic import Release, ParserManager from watfag.parsers.generic import Release, ParserManager
from watfag.trackers import TrackerInfo
class TVBoxSetRelease(Release): class TVBoxSetRelease(Release):
"""Holds info representing a release of a TV box set.""" """Holds info representing a release of a TV box set."""
def __init__(self, unparsed_text, dl_link, **kwargs): def __init__(
super().__init__(unparsed_text, dl_link, **kwargs) self,
xml_result: Element,
tracker_info: Optional[TrackerInfo] = None
):
super().__init__(xml_result, tracker_info)
self.seasons: Optional[str] = None self.seasons: Optional[str] = None
def __str__(self): def __str__(self):

View File

@@ -5,6 +5,7 @@ from httpx import AsyncClient
from watfag.parsers.generic import Release from watfag.parsers.generic import Release
from watfag.parsers.movie import MovieRelease, MovieParserManager from watfag.parsers.movie import MovieRelease, MovieParserManager
from watfag.parsers.tvboxset import TVBoxSetRelease, TVBoxSetParserManager from watfag.parsers.tvboxset import TVBoxSetRelease, TVBoxSetParserManager
from watfag.trackers import TrackerInfo
class Jackett: class Jackett:
@@ -13,6 +14,9 @@ class Jackett:
self.base_url = base_url self.base_url = base_url
self.movie_parser = MovieParserManager() self.movie_parser = MovieParserManager()
self.tvboxset_parser = TVBoxSetParserManager() self.tvboxset_parser = TVBoxSetParserManager()
self.tracker_info = TrackerInfo(
"https://raw.githubusercontent.com/HDVinnie/Private-Trackers-Spreadsheet/refs/heads/master/trackers.json"
)
async def get_capabilities(self): async def get_capabilities(self):
params = { params = {
@@ -45,21 +49,15 @@ class Jackett:
# Find out from categories what kind of result this is # Find out from categories what kind of result this is
if any(cat.startswith('2') for cat in attrs.get('category')): # This is a movie if any(cat.startswith('2') for cat in attrs.get('category')): # This is a movie
release = MovieRelease( release = MovieRelease(
item.find('title').text, item,
item.find('link').text, self.tracker_info
size=int(item.find('size').text),
seeders=int(attrs.get('seeders')[0]),
view_link=item.find('comments').text
) )
self.movie_parser.run_parsers(release) self.movie_parser.run_parsers(release)
releases.append(release) releases.append(release)
elif any(cat == '100027' for cat in attrs.get('category')): # This is a TV boxset elif any(cat == '100027' for cat in attrs.get('category')): # This is a TV boxset
release = TVBoxSetRelease( release = TVBoxSetRelease(
item.find('title').text, item,
item.find('link').text, self.tracker_info
size=int(item.find('size').text),
seeders=int(attrs.get('seeders')[0]),
view_link=item.find('comments').text
) )
self.tvboxset_parser.run_parsers(release) self.tvboxset_parser.run_parsers(release)
releases.append(release) releases.append(release)

19
src/watfag/trackers.py Normal file
View File

@@ -0,0 +1,19 @@
from typing import Optional
import httpx
class TrackerInfo:
def __init__(self, url):
self.url = url
self.json: Optional[dict] = None
def _refresh(self):
r = httpx.get(self.url)
r.raise_for_status()
self.json = r.json().get('trackers', [])
def get_tracker_info(self, tracker_name):
if self.json is None:
self._refresh()
return next((tracker for tracker in self.json if tracker['Name'] == tracker_name), None)