Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add support for CBR #326

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ A simple tool to take the work out of uploading.
- Can re-use existing torrents instead of hashing new
- Generates proper name for your upload using Mediainfo/BDInfo and TMDb/IMDb conforming to site rules
- Checks for existing releases already on site
- Uploads to PTP/BLU/BHD/Aither/THR/STC/R4E(limited)/STT/HP/ACM/LCD/LST/NBL/ANT/FL/HUNO/RF/SN
- Uploads to PTP/BLU/BHD/Aither/THR/STC/R4E(limited)/STT/HP/ACM/LCD/LST/NBL/ANT/FL/HUNO/RF/SN/CBR
- Adds to your client with fast resume, seeding instantly (rtorrent/qbittorrent/deluge/watch folder)
- ALL WITH MINIMAL INPUT!
- Currently works with .mkv/.mp4/Blu-ray/DVD/HD-DVDs
Expand Down
23 changes: 20 additions & 3 deletions cogs/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from src.trackers.AITHER import AITHER
from src.trackers.STC import STC
from src.trackers.LCD import LCD
from src.trackers.CBR import CBR
from data.config import config

import discord
Expand Down Expand Up @@ -419,7 +420,10 @@ async def send_embed_and_upload(self,ctx,meta):
await asyncio.sleep(0.3)
if "LCD" in each.replace(' ', ''):
await message.add_reaction(config['DISCORD']['discord_emojis']['LCD'])
await asyncio.sleep(0.3)
await asyncio.sleep(0.3)
if "CBR" in each.replace(' ', ''):
await message.add_reaction(config['DISCORD']['discord_emojis']['CBR'])
await asyncio.sleep(0.3)
await message.add_reaction(config['DISCORD']['discord_emojis']['MANUAL'])
await asyncio.sleep(0.3)
await message.add_reaction(config['DISCORD']['discord_emojis']['CANCEL'])
Expand Down Expand Up @@ -511,7 +515,10 @@ def check(reaction, user):
await stc.edit_desc(meta)
if manual_tracker.upper() == "LCD":
lcd = LCD(config=config)
await lcd.edit_desc(meta)
await lcd.edit_desc(meta)
if manual_tracker.upper() == "CBR":
cbr = CBR(config=config)
await cbr.edit_desc(meta)
archive_url = await prep.package(meta)
upload_embed_description = upload_embed_description.replace('MANUAL', '~~MANUAL~~')
if archive_url == False:
Expand Down Expand Up @@ -571,7 +578,17 @@ def check(reaction, user):
await client.add_to_client(meta, "LCD")
upload_embed_description = upload_embed_description.replace('LCD', '~~LCD~~')
upload_embed = discord.Embed(title=f"Uploaded `{meta['name']}` to:", description=upload_embed_description, color=0x00ff40)
await msg.edit(embed=upload_embed)
await msg.edit(embed=upload_embed)
if "CBR" in tracker_list:
cbr = CBR(config=config)
dupes = await cbr.search_existing(meta)
meta = await self.dupe_embed(dupes, meta, tracker_emojis, channel)
if meta['upload'] == True:
await cbr.upload(meta)
await client.add_to_client(meta, "CBR")
upload_embed_description = upload_embed_description.replace('CBR', '~~CBR~~')
upload_embed = discord.Embed(title=f"Uploaded `{meta['name']}` to:", description=upload_embed_description, color=0x00ff40)
await msg.edit(embed=upload_embed)
return None


Expand Down
7 changes: 6 additions & 1 deletion data/example-config.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

"TRACKERS" : {
# Which trackers do you want to upload to?
"default_trackers" : "BLU, BHD, AITHER, STC, STT, SN, THR, R4E, HP, ACM, PTP, LCD, LST, PTER, NBL, ANT, MTV",
"default_trackers" : "BLU, BHD, AITHER, STC, STT, SN, THR, R4E, HP, ACM, PTP, LCD, LST, PTER, NBL, ANT, MTV, CBR",

"BLU" : {
"useAPI" : False, # Set to True if using BLU
Expand Down Expand Up @@ -139,6 +139,11 @@
"announce_url" : "https://locadora.cc/announce/customannounceurl",
# "anon" : False
},
"CBR" : {
"api_key" : "CBR api key",
"announce_url" : "https://capybarabr.com/announce/customannounceurl",
# "anon" : False
},
"LST" : {
"api_key" : "LST api key",
"announce_url" : "https://lst.gg/announce/customannounceurl",
Expand Down
189 changes: 189 additions & 0 deletions src/trackers/CBR.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# -*- 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 CBR():
"""
Edit for Tracker:
Edit BASE.torrent with announce and source
Check for duplicates
Set type/category IDs
Upload
"""
def __init__(self, config):
self.config = config
self.tracker = 'CBR'
self.source_flag = 'CapybaraBR'
self.search_url = 'https://capybarabr.com/api/torrents/filter'
self.torrent_url = 'https://capybarabr.com/api/torrents/'
self.upload_url = 'https://capybarabr.com/api/torrents/upload'
self.signature = f"\n[center][img]https://i.ibb.co/tYNzwgd/thanks-cbr.png[/img][/center]"
self.banned_groups = [""]
pass

async def upload(self, meta):
common = COMMON(config=self.config)
await common.edit_torrent(meta, self.tracker, self.source_flag)
await common.unit3d_edit_desc(meta, self.tracker, self.signature)
cat_id = await self.get_cat_id(meta['category'], meta.get('edition', ''), meta)
type_id = await self.get_type_id(meta['type'])
resolution_id = await self.get_res_id(meta['resolution'])
region_id = await common.unit3d_region_ids(meta.get('region'))
distributor_id = await common.unit3d_distributor_ids(meta.get('distributor'))
name = await self.edit_name(meta)
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']}/[CBR]DESCRIPTION.txt", 'r').read()
open_torrent = open(f"{meta['base_dir']}/tmp/{meta['uuid']}/[CBR]{meta['clean_name']}.torrent", 'rb')
files = {'torrent': ("placeholder.torrent", open_torrent, "application/x-bittorrent")}
data = {
'name' : 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 get_cat_id(self, category_name, edition, meta):
category_id = {
'MOVIE': '1',
'TV': '2',
'ANIMES': '4'
}.get(category_name, '0')
if meta['anime'] == True and category_id == '2':
category_id = '4'
return category_id

async def get_type_id(self, type):
type_id = {
'DISC': '1',
'REMUX': '2',
'ENCODE': '3',
'WEBDL': '4',
'WEBRIP': '5',
'HDTV': '6'
}.get(type, '0')
return type_id

async def get_res_id(self, resolution):
resolution_id = {
'4320p': '1',
'2160p': '2',
'1080p': '3',
'1080i':'4',
'720p': '5',
'576p': '6',
'576i': '7',
'480p': '8',
'480i': '9',
'Other': '10',
}.get(resolution, '10')
return resolution_id




async def search_existing(self, meta):
dupes = []
console.print("[yellow]Buscando por duplicatas no tracker...")
params = {
'api_token' : self.config['TRACKERS'][self.tracker]['api_key'].strip(),
'tmdbId' : meta['tmdb'],
'categories[]' : await self.get_cat_id(meta['category'], meta.get('edition', ''), meta),
'types[]' : await self.get_type_id(meta['type']),
'resolutions[]' : await self.get_res_id(meta['resolution']),
'name' : ""
}
if meta['category'] == 'TV':
params['name'] = params['name'] + f" {meta.get('season', '')}{meta.get('episode', '')}"
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]Não foi possivel buscar no tracker torrents duplicados. O tracker está offline ou sua api está incorreta')
await asyncio.sleep(5)

return dupes

async def edit_name(self, meta):


name = meta['uuid'].replace('.mkv','').replace('.mp4','').replace(".", " ").replace("DDP2 0","DDP2.0").replace("DDP5 1","DDP5.1").replace("H 264","H.264").replace("H 265","H.265").replace("DD+7 1","DDP7.1").replace("AAC2 0","AAC2.0").replace('DD5 1','DD5.1').replace('DD2 0','DD2.0').replace('TrueHD 7 1','TrueHD 7.1').replace('DTS-HD MA 7 1','DTS-HD MA 7.1').replace('DTS-HD MA 5 1','DTS-HD MA 5.1').replace("TrueHD 5 1","TrueHD 5.1").replace("DTS-X 7 1","DTS-X 7.1").replace("DTS-X 5 1","DTS-X 5.1").replace("FLAC 2 0","FLAC 2.0").replace("FLAC 2 0","FLAC 2.0").replace("FLAC 5 1","FLAC 5.1").replace("DD1 0","DD1.0").replace("DTS ES 5 1","DTS ES 5.1").replace("DTS5 1","DTS 5.1").replace("AAC1 0","AAC1.0").replace("DD+5 1","DDP5.1").replace("DD+2 0","DDP2.0").replace("DD+1 0","DDP1.0")

return name
5 changes: 3 additions & 2 deletions upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from src.trackers.OE import OE
from src.trackers.BHDTV import BHDTV
from src.trackers.RTF import RTF
from src.trackers.CBR import CBR
import json
from pathlib import Path
import asyncio
Expand Down Expand Up @@ -246,12 +247,12 @@ async def do_the_thing(base_dir):
####### Upload to Trackers #######
####################################
common = COMMON(config=config)
api_trackers = ['BLU', 'AITHER', 'STC', 'R4E', 'STT', 'RF', 'ACM','LCD','LST','HUNO', 'SN', 'LT', 'NBL', 'ANT', 'JPTV', 'TDC', 'OE', 'BHDTV', 'RTF']
api_trackers = ['BLU', 'AITHER', 'STC', 'R4E', 'STT', 'RF', 'ACM','LCD','LST','HUNO', 'SN', 'LT', 'NBL', 'ANT', 'JPTV', 'TDC', 'OE', 'BHDTV', 'RTF', 'CBR']
http_trackers = ['HDB', 'TTG', 'FL', 'PTER', 'HDT', 'MTV']
tracker_class_map = {
'BLU' : BLU, 'BHD': BHD, 'AITHER' : AITHER, 'STC' : STC, 'R4E' : R4E, 'THR' : THR, 'STT' : STT, '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, 'TDC' : TDC, 'HDT' : HDT, 'MTV': MTV, 'OE': OE, 'BHDTV': BHDTV, 'RTF':RTF}
'TL' : TL, 'TDC' : TDC, 'HDT' : HDT, 'MTV': MTV, 'OE': OE, 'BHDTV': BHDTV, 'RTF':RTF,'CBR':CBR}

for tracker in trackers:
if meta['name'].endswith('DUPE?'):
Expand Down