diff --git a/data/example-config.py b/data/example-config.py index 0827842ac..e063a5306 100644 --- a/data/example-config.py +++ b/data/example-config.py @@ -676,6 +676,16 @@ # Send uploads to LUME modq for staff approval "modq": False, }, + "MB": { + # Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name + "link_dir_name": "", + # "useAPI": False, Set to True if using this tracker for automatic ID searching or description parsing + "useAPI": False, + "api_key": "", + "anon": False, + # Send uploads to Malayabits modq for staff approval + "modq": False, + }, "MTV": { # Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name "link_dir_name": "", diff --git a/src/trackers/MB.py b/src/trackers/MB.py new file mode 100644 index 000000000..66ac796f5 --- /dev/null +++ b/src/trackers/MB.py @@ -0,0 +1,102 @@ +# Upload Assistant © 2025 Audionut & wastaken7 — Licensed under UAPL v1.0 +from typing import Any + +from src.console import console +from src.languages import languages_manager +from src.trackers.COMMON import COMMON +from src.trackers.UNIT3D import UNIT3D + +class MB(UNIT3D): + """ + Edit for Tracker: + Edit BASE.torrent with announce and source + Check for duplicates + Set type/category IDs + Upload + """ + + def __init__(self, config: dict[str, Any]) -> None: + super().__init__(config, tracker_name='MB') + self.config: Config = config + self.common = COMMON(config) + self.tracker = 'MB' + self.base_url = 'https://malayabits.cc' + self.banned_url = f'{self.base_url}/api/bannedReleaseGroups' + self.id_url = f'{self.base_url}/api/torrents/' + self.upload_url = f'{self.base_url}/api/torrents/upload' + self.search_url = f'{self.base_url}/api/torrents/filter' + self.torrent_url = f'{self.base_url}/torrents/' + self.trumping_url = f'{self.base_url}/api/reports/torrents/' + self.banned_groups = [] + pass + + async def get_flag(self, meta, flag_name): + config_flag = self.config['TRACKERS'][self.tracker].get(flag_name) + if config_flag is not None: + return 1 if config_flag else 0 + + return 1 if meta.get(flag_name, False) else 0 + + async def edit_name(self, meta): + malayabits_name = meta['name'] + resolution = meta.get('resolution') + video_codec = meta.get('video_codec') + video_encode = meta.get('video_encode') + name_type = meta.get('type', "") + source = meta.get('source', "") + + if not meta.get('audio_languages'): + await process_desc_language(meta, desc=None, tracker=self.tracker) + elif meta.get('audio_languages'): + audio_languages = meta['audio_languages'][0].upper() + if audio_languages and not await has_english_language(audio_languages): + if (name_type == "REMUX" and source in ("PAL DVD", "NTSC DVD", "DVD")): + malayabits_name = malayabits_name.replace(str(meta['year']), f"{meta['year']} {audio_languages}", 1) + elif not meta.get('is_disc') == "BDMV": + malayabits_name = malayabits_name.replace(meta['resolution'], f"{audio_languages} {meta['resolution']}", 1) + + if name_type == "DVDRIP": + source = "DVDRip" + malayabits_name = malayabits_name.replace(f"{meta['source']} ", "", 1) + malayabits_name = malayabits_name.replace(f"{meta['video_encode']}", "", 1) + malayabits_name = malayabits_name.replace(f"{source}", f"{resolution} {source}", 1) + malayabits_name = malayabits_name.replace((meta['audio']), f"{meta['audio']}{video_encode}", 1) + + elif meta['is_disc'] == "DVD" or (name_type == "REMUX" and source in ("PAL DVD", "NTSC DVD", "DVD")): + malayabits_name = malayabits_name.replace((meta['source']), f"{resolution} {meta['source']}", 1) + malayabits_name = malayabits_name.replace((meta['audio']), f"{video_codec} {meta['audio']}", 1) + + return malayabits_name + + async def get_cat_id(self, category_name): + category_id = { + 'MOVIE': '1', + 'TV': '2', + 'Musik': '3', + }.get(category_name, '0') + return category_id + + async def get_res_id(self, resolution=None, reverse=False): + resolution_mapping = { + '8640p': '10', + '4320p': '1', + '2160p': '2', + '1440p': '3', + '1080p': '3', + '1080i': '4', + '720p': '5', + '576p': '6', + '576i': '7', + '480p': '8', + '480i': '9', + } + + if reverse: + # Return reverse mapping of IDs to resolutions + return {v: k for k, v in resolution_mapping.items()} + elif resolution is not None: + # Return the ID for the given resolution + return resolution_mapping.get(resolution, '10') # Default to '10' for unknown resolutions + else: + # Return the full mapping + return resolution_mapping diff --git a/src/trackersetup.py b/src/trackersetup.py index ae2f13493..eda84a83f 100644 --- a/src/trackersetup.py +++ b/src/trackersetup.py @@ -51,6 +51,7 @@ from src.trackers.LST import LST from src.trackers.LT import LT from src.trackers.LUME import LUME +from src.trackers.MB import MB from src.trackers.MTV import MTV from src.trackers.NBL import NBL from src.trackers.OE import OE @@ -1339,13 +1340,13 @@ async def make_trumpable_report(self, meta: Meta, tracker: str) -> bool: tracker_class_map: dict[str, type[Any]] = { 'A4K': A4K, 'ACM': ACM, 'AITHER': AITHER, 'ANT': ANT, 'AR': AR, 'ASC': ASC, 'AZ': AZ, 'BHD': BHD, 'BHDTV': BHDTV, 'BJS': BJS, 'BLU': BLU, 'BT': BT, 'CBR': CBR, 'CZ': CZ, 'DC': DC, 'DP': DP, 'DT': DT, 'EMUW': EMUW, 'FNP': FNP, 'FF': FF, 'FL': FL, 'FRIKI': FRIKI, 'GPW': GPW, 'HDB': HDB, 'HDS': HDS, 'HDT': HDT, 'HHD': HHD, 'HUNO': HUNO, 'ITT': ITT, - 'IHD': IHD, 'IS': IS, 'LCD': LCD, 'LDU': LDU, 'LST': LST, 'LT': LT, 'LUME': LUME, 'MTV': MTV, 'NBL': NBL, 'OE': OE, 'OTW': OTW, 'PHD': PHD, 'PT': PT, 'PTP': PTP, 'PTER': PTER, 'PTS': PTS, 'PTT': PTT, + 'IHD': IHD, 'IS': IS, 'LCD': LCD, 'LDU': LDU, 'LST': LST, 'LT': LT, 'LUME': LUME, 'MB': MB, 'MTV': MTV, 'NBL': NBL, 'OE': OE, 'OTW': OTW, 'PHD': PHD, 'PT': PT, 'PTP': PTP, 'PTER': PTER, 'PTS': PTS, 'PTT': PTT, 'R4E': R4E, 'RAS': RAS, 'RF': RF, 'RTF': RTF, 'SAM': SAM, 'SHRI': SHRI, 'SN': SN, 'SP': SP, 'SPD': SPD, 'STC': STC, 'THR': THR, 'TIK': TIK, 'TL': TL, 'TLZ': TLZ, 'TOS': TOS, 'TVC': TVC, 'TTG': TTG, 'TTR': TTR, 'ULCX': ULCX, 'UTP': UTP, 'YOINK': YOINK, 'YUS': YUS } api_trackers = { - 'A4K', 'ACM', 'AITHER', 'BHD', 'BLU', 'CBR', 'DP', 'DT', 'EMUW', 'FNP', 'FRIKI', 'HHD', 'HUNO', 'IHD', 'ITT', 'LCD', 'LDU', 'LST', 'LT', 'LUME', + 'A4K', 'ACM', 'AITHER', 'BHD', 'BLU', 'CBR', 'DP', 'DT', 'EMUW', 'FNP', 'FRIKI', 'HHD', 'HUNO', 'IHD', 'ITT', 'LCD', 'LDU', 'LST', 'LT', 'LUME', 'MB', 'OE', 'OTW', 'PT', 'PTT', 'RAS', 'RF', 'R4E', 'SAM', 'SHRI', 'SP', 'STC', 'TIK', 'TLZ', 'TOS', 'TTR', 'ULCX', 'UTP', 'YOINK', 'YUS' }