From 39339c5a3c7d99b2f398d37c81695b2821dbb73a Mon Sep 17 00:00:00 2001 From: lummotinny3 Date: Wed, 31 Jul 2024 11:07:53 -0400 Subject: [PATCH] Added upload.cx --- src/trackers/ULCX.py | 183 +++++++++++++++++++++++++++++++++++++++++++ upload.py | 10 ++- 2 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 src/trackers/ULCX.py diff --git a/src/trackers/ULCX.py b/src/trackers/ULCX.py new file mode 100644 index 0000000..1f88fc9 --- /dev/null +++ b/src/trackers/ULCX.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +# import discord +import asyncio +import requests +import distutils.util +import os +import platform + +from src.trackers.COMMON import COMMON +from src.console import console + + +class ULCX(): + """ + Edit for Tracker: + Edit BASE.torrent with announce and source + Check for duplicates + Set type/category IDs + Upload + """ + + ############################################################### + ######## EDIT ME ######## + ############################################################### + + # ALSO EDIT CLASS NAME ABOVE + + def __init__(self, config): + self.config = config + self.tracker = 'ULCX' + self.source_flag = 'ULCX' + self.upload_url = 'https://upload.cx/api/torrents/upload' + self.search_url = 'https://upload.cx/api/torrents/filter' + self.signature = f"\n[center][url=https://github.com/edge20200/Only-Uploader]Powered by Only-Uploader[/url][/center]" + self.banned_groups = ['Tigole', 'x0r', 'Judas', 'SPDVD', 'MeGusta', 'YIFY', 'SWTYBLZ', 'TAoE', 'TSP', 'TSPxL', 'LAMA', '4K4U', 'ION10', 'Will1869', 'TGx', 'Sicario', 'QxR', 'Hi10', 'EMBER', 'FGT', 'AROMA', 'd3g', 'nikt0', 'Grym', 'RARBG', 'iVy', 'FnP', 'EDGE2020', 'NuBz', 'NAHOM'] + pass + + async def get_cat_id(self, category_name): + category_id = { + 'MOVIE': '1', + 'TV': '2', + }.get(category_name, '0') + return category_id + + async def get_type_id(self, type): + type_id = { + 'DISC': '1', + 'REMUX': '2', + 'WEBDL': '4', + 'WEBRIP': '5', + 'HDTV': '6', + 'ENCODE': '3' + }.get(type, '0') + return type_id + + async def get_res_id(self, resolution): + resolution_id = { + '8640p':'10', + '4320p': '1', + '2160p': '2', + '1440p' : '3', + '1080p': '3', + '1080i':'4', + '720p': '5', + '576p': '6', + '576i': '7', + '480p': '8', + '480i': '9' + }.get(resolution, '10') + return resolution_id + + ############################################################### + ###### STOP HERE UNLESS EXTRA MODIFICATION IS NEEDED ###### + ############################################################### + + async def upload(self, meta): + common = COMMON(config=self.config) + await common.edit_torrent(meta, self.tracker, self.source_flag) + cat_id = await self.get_cat_id(meta['category']) + type_id = await self.get_type_id(meta['type']) + resolution_id = await self.get_res_id(meta['resolution']) + await common.unit3d_edit_desc(meta, self.tracker, self.signature) + region_id = await common.unit3d_region_ids(meta.get('region')) + distributor_id = await common.unit3d_distributor_ids(meta.get('distributor')) + if meta['anon'] == 0 and bool(distutils.util.strtobool(str(self.config['TRACKERS'][self.tracker].get('anon', "False")))) == False: + anon = 0 + else: + anon = 1 + + if meta['bdinfo'] != None: + mi_dump = None + bd_dump = open(f"{meta['base_dir']}/tmp/{meta['uuid']}/BD_SUMMARY_00.txt", 'r', encoding='utf-8').read() + else: + mi_dump = open(f"{meta['base_dir']}/tmp/{meta['uuid']}/MEDIAINFO.txt", 'r', encoding='utf-8').read() + bd_dump = None + desc = open(f"{meta['base_dir']}/tmp/{meta['uuid']}/[{self.tracker}]DESCRIPTION.txt", 'r').read() + open_torrent = open(f"{meta['base_dir']}/tmp/{meta['uuid']}/[{self.tracker}]{meta['clean_name']}.torrent", 'rb') + files = {'torrent': open_torrent} + data = { + 'name' : meta['name'], + 'description' : desc, + 'mediainfo' : mi_dump, + 'bdinfo' : bd_dump, + 'category_id' : cat_id, + 'type_id' : type_id, + 'resolution_id' : resolution_id, + 'tmdb' : meta['tmdb'], + 'imdb' : meta['imdb_id'].replace('tt', ''), + 'tvdb' : meta['tvdb_id'], + 'mal' : meta['mal_id'], + 'igdb' : 0, + 'anonymous' : anon, + 'stream' : meta['stream'], + 'sd' : meta['sd'], + 'keywords' : meta['keywords'], + 'personal_release' : int(meta.get('personalrelease', False)), + 'internal' : 0, + 'featured' : 0, + 'free' : 0, + 'doubleup' : 0, + 'sticky' : 0, + } + # Internal + if self.config['TRACKERS'][self.tracker].get('internal', False) == True: + if meta['tag'] != "" and (meta['tag'][1:] in self.config['TRACKERS'][self.tracker].get('internal_groups', [])): + data['internal'] = 1 + + if region_id != 0: + data['region_id'] = region_id + if distributor_id != 0: + data['distributor_id'] = distributor_id + if meta.get('category') == "TV": + data['season_number'] = meta.get('season_int', '0') + data['episode_number'] = meta.get('episode_int', '0') + headers = { + 'User-Agent': f'Upload Assistant/2.1 ({platform.system()} {platform.release()})' + } + params = { + 'api_token' : self.config['TRACKERS'][self.tracker]['api_key'].strip() + } + + if meta['debug'] == False: + response = requests.post(url=self.upload_url, files=files, data=data, headers=headers, params=params) + try: + console.print(response.json()) + except: + console.print("It may have uploaded, go check") + return + else: + console.print(f"[cyan]Request Data:") + console.print(data) + open_torrent.close() + + + + + + async def search_existing(self, meta): + dupes = [] + console.print("[yellow]Searching for existing torrents on site...") + params = { + 'api_token' : self.config['TRACKERS'][self.tracker]['api_key'].strip(), + 'tmdbId' : meta['tmdb'], + 'categories[]' : await self.get_cat_id(meta['category']), + 'types[]' : await self.get_type_id(meta['type']), + 'resolutions[]' : await self.get_res_id(meta['resolution']), + 'name' : "" + } + if meta.get('edition', "") != "": + params['name'] = params['name'] + f" {meta['edition']}" + try: + response = requests.get(url=self.search_url, params=params) + response = response.json() + for each in response['data']: + result = [each][0]['attributes']['name'] + # difference = SequenceMatcher(None, meta['clean_name'], result).ratio() + # if difference >= 0.05: + dupes.append(result) + except: + console.print('[bold red]Unable to search for existing torrents on site. Either the site is down or your API key is incorrect') + await asyncio.sleep(5) + + return dupes diff --git a/upload.py b/upload.py index 78a9310..7f41521 100755 --- a/upload.py +++ b/upload.py @@ -37,6 +37,7 @@ from src.trackers.FNP import FNP from src.trackers.CBR import CBR from src.trackers.UTP import UTP +from src.trackers.ULCX import ULCX import json from pathlib import Path import asyncio @@ -250,12 +251,13 @@ async def do_the_thing(base_dir): ####### Upload to Trackers ####### #################################### common = COMMON(config=config) - api_trackers = ['BLU', 'AITHER', 'STC', 'R4E', 'RF', 'ACM','LCD','LST','HUNO', 'SN', 'LT', 'NBL', 'ANT', 'JPTV', 'OE', 'BHDTV', 'RTF', 'OTW', 'FNP', 'CBR', 'UTP'] + api_trackers = ['BLU', 'AITHER', 'STC', 'R4E', 'RF', 'ACM','LCD','LST','HUNO', 'SN', 'LT', 'NBL', 'ANT', 'JPTV', 'OE', 'BHDTV', 'RTF', 'OTW', 'FNP', 'CBR', 'UTP', 'ULCX'] http_trackers = ['HDB', 'TTG', 'FL', 'PTER', 'HDT', 'MTV'] tracker_class_map = { - 'BLU' : BLU, 'BHD': BHD, 'AITHER' : AITHER, 'STC' : STC, 'R4E' : R4E, 'THR' : THR, 'HP' : HP, 'PTP' : PTP, 'RF' : RF, 'SN' : SN, - 'ACM' : ACM, 'HDB' : HDB, 'LCD': LCD, 'TTG' : TTG, 'LST' : LST, 'HUNO': HUNO, 'FL' : FL, 'LT' : LT, 'NBL' : NBL, 'ANT' : ANT, 'PTER': PTER, 'JPTV' : JPTV, - 'TL' : TL, 'HDT' : HDT, 'MTV': MTV, 'OE': OE, 'BHDTV': BHDTV, 'RTF': RTF, 'OTW': OTW, 'FNP': FNP, 'CBR': CBR, 'UTP': UTP} + 'BLU' : BLU, 'BHD': BHD, 'AITHER' : AITHER, 'STC' : STC, 'R4E' : R4E, 'THR' : THR, 'HP' : HP, 'PTP' : PTP, 'RF' : RF, + 'SN' : SN, 'ACM' : ACM, 'HDB' : HDB, 'LCD': LCD, 'TTG' : TTG, 'LST' : LST, 'HUNO': HUNO, 'FL' : FL, 'LT' : LT, 'NBL' : NBL, + 'ANT' : ANT, 'PTER': PTER, 'JPTV' : JPTV, 'TL' : TL, 'HDT' : HDT, 'MTV': MTV, 'OE': OE, 'BHDTV': BHDTV, 'RTF': RTF, + 'OTW': OTW, 'FNP': FNP, 'CBR': CBR, 'UTP': UTP, 'ULCX': ULCX} for tracker in trackers: if meta['name'].endswith('DUPE?'):