Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
876 commits
Select commit Hold shift + click to select a range
73bdcc9
docker: run as non-root + arm64 support (#1105)
richardr1126 Jan 11, 2026
8ac3f56
update docker documentation
Audionut Jan 11, 2026
cecb4cb
webui browse roots
Audionut Jan 11, 2026
22516ac
add secondary dupe check arg (#1118)
Audionut Jan 11, 2026
f62918a
release notes
Audionut Jan 11, 2026
7c70a1f
TVDB: graceful handling of hard errors
Audionut Jan 12, 2026
419926f
fixes
Audionut Jan 12, 2026
f2a9375
Revert "fixes"
Audionut Jan 12, 2026
9b74417
add strict type checking (#1114)
wastaken7 Jan 12, 2026
1501070
update(CI): comments in prs
Audionut Jan 12, 2026
fd8cc3e
chore(CI): don't fire on draft
Audionut Jan 12, 2026
b2ab2c8
piece limited tracker improvements (#1121)
Audionut Jan 12, 2026
693f6ed
fix edition handing
Audionut Jan 12, 2026
3e43c3d
MTV: catch specific upload error
Audionut Jan 12, 2026
70d5c3b
LT: Fix [CAST] tag (#1123)
ninboy Jan 13, 2026
f414ba4
BJS: add support for uploads without IMDb, adult media detection (#1124)
wastaken7 Jan 13, 2026
55f1323
print improvements
Audionut Jan 13, 2026
4ea0d67
ANT: increase verbosity in exception messages
Audionut Jan 13, 2026
c20d2e9
Update site upload error response handling
Audionut Jan 13, 2026
2d2c4c4
RTF: attempt 10 yr period to current day
Audionut Jan 14, 2026
c11b7f1
feat: add TOS tracker support (#1120)
CptCherry Jan 14, 2026
f6511c1
fix(edition): always uppercase
Audionut Jan 14, 2026
6d367e5
fix(glob1): depreciated
Audionut Jan 15, 2026
4e9b340
fix(glob): python 3.9 compatibility
Audionut Jan 15, 2026
c7bb1ae
ANT: send releasegroup
Audionut Jan 15, 2026
f9ddf1c
CBR: update banned groups (#1125)
wastaken7 Jan 15, 2026
5a15276
move tooling to master
Audionut Jan 16, 2026
54971ac
chore(ci): fix action run to completion
Audionut Jan 16, 2026
7efa4b9
pin ruff version
Audionut Jan 16, 2026
9e1ddcf
ruff checks
Audionut Jan 16, 2026
47ab953
Add explicit isort configuration for Ruff
Audionut Jan 16, 2026
3b3fba8
Add detailed diagnostics to Ruff lint step
Audionut Jan 16, 2026
573cec2
chore(ci): split workflow
Audionut Jan 16, 2026
25c5ee2
chore(ci): fix commenting
Audionut Jan 16, 2026
f6ce8f0
fix(ci): pin safety to v2 cil
Audionut Jan 17, 2026
05a54de
fix(ci): safety comment handling
Audionut Jan 17, 2026
623829b
fix(ci): fix indentation and commenting
Audionut Jan 17, 2026
d867d16
chore(code): update tooling with strict annotations (#1126)
Audionut Jan 18, 2026
99edd70
add catch for auro3d
Audionut Jan 18, 2026
3b789a3
BJS: Limit concurrent AJAX requests to prevent 503 errors (#1129)
wastaken7 Jan 18, 2026
2897e01
fix docker building
Audionut Jan 18, 2026
877ad1e
TL: Handle DVDRIP type (#1128)
WOSSFOSS Jan 18, 2026
7cc1766
ANT: clarify tagging
Audionut Jan 18, 2026
680abfe
fix packed image uploading
Audionut Jan 18, 2026
b008b46
fix generic episode titles
Audionut Jan 18, 2026
fbb03bf
PTP: add to early validate credentials pathway
Audionut Jan 18, 2026
6eabee8
update release notes
Audionut Jan 18, 2026
48372da
fix disc based valid torrent check
Audionut Jan 18, 2026
84c3242
webui: fix browse roots
Audionut Jan 18, 2026
40f4f69
Add Aura4K (#1130)
Audionut Jan 18, 2026
71976e1
set minimum required uploaded images (#1132)
Audionut Jan 18, 2026
a40a0a4
fix tracker name change prints
Audionut Jan 19, 2026
4af50ab
ANT: Fix media type for discs (#1134)
wastaken7 Jan 20, 2026
5461d1e
Implement BDinfo diff viewer for dupe detection (#1131)
wastaken7 Jan 20, 2026
baff2fa
chore(ci): docker one build
Audionut Jan 20, 2026
767ea66
chore(videolist): add debugging
Audionut Jan 20, 2026
864d3de
ANT: fix the audio format to comply with the new values (#1136)
wastaken7 Jan 20, 2026
f77acdf
ANT: fix flag change
Audionut Jan 21, 2026
1984391
PTP: fix newlines in multiple mediainfos
Audionut Jan 22, 2026
282a114
chore(bandit): add ignores
Audionut Jan 22, 2026
95880cf
fix: replace SVG logos with PNG format in ANT, BJS, and GPW (#1142)
wastaken7 Jan 22, 2026
252fa1c
A4K: img hoster update and banned groups (#1143)
mlnl221 Jan 22, 2026
e9c387a
HUNO: Multiple Languages in torrent title (#1138)
9Oc Jan 23, 2026
2541c1a
TL: DVDRIP check to correct block (#1137)
WOSSFOSS Jan 23, 2026
ed7b765
Add support for Luminarr (LUME) (#1146)
wastaken7 Jan 23, 2026
f143d43
fix(ASC): improve overview handling and enhance layout data caching (…
wastaken7 Jan 23, 2026
3efa2bc
UTP; tracker related changes and misc updates (#1139)
maksii Jan 23, 2026
3289701
Stop tracking web_ui node_modules
Audionut Jan 23, 2026
1be23e6
LUME: rules compliance update
Audionut Jan 24, 2026
59e1d20
LST: add trumping support (#1150)
Audionut Jan 24, 2026
a76207c
fix torrent trumping flow (#1151)
Audionut Jan 24, 2026
a8ce2ee
Fix: strip trailing slashes from base URLs in Radarr, Sonarr, and qBi…
maksii Jan 24, 2026
e62f281
Enhance service mapping in region.py by adding new entries for uk-UA …
maksii Jan 24, 2026
3c10277
dedupe language lists
Audionut Jan 24, 2026
8d61a3f
ffmpeg: convert colorspace
Audionut Jan 24, 2026
83f8182
show "applies a naming change for this release" in dupe scenario (#1156)
maksii Jan 24, 2026
aac8d13
fix tmdb callers
Audionut Jan 24, 2026
389e133
fix season pack trump handling
Audionut Jan 26, 2026
0983efb
LST: ensure trumping torrent link is inserted into all messages
Audionut Jan 27, 2026
764c29f
refactor(GPW): streamline HTML file saving, fix DVD upload, API chang…
wastaken7 Jan 28, 2026
4b1f836
AZ: remove manual and daily episode titles (#1174)
wastaken7 Jan 28, 2026
604ba1d
TOS : Fix scene detection (#1176)
CptCherry Jan 28, 2026
9bce768
refactor(SHRI): switch to abbreviated language codes and remove CINEM…
tdrkmn Jan 28, 2026
6e32a4d
qui reference updated (#1158)
maksii Jan 28, 2026
13500a8
Refactor WebUI (#1141)
Audionut Jan 28, 2026
82f0cdd
fix: ffmpeg bin handling (#1157)
Audionut Jan 28, 2026
91a2044
chore(docs): formatting
Audionut Jan 28, 2026
74a9953
chore(docs): markdown headers
Audionut Jan 28, 2026
4602ada
chore(docs): fix headers
Audionut Jan 28, 2026
a6277f8
refactor(webui): json parsing fallbacks (#1178)
Audionut Jan 28, 2026
079fee1
fix(webui): improve arg handling
Audionut Jan 28, 2026
1f7144c
update config fallback handling (#1179)
Audionut Jan 28, 2026
ccb5baf
refactor(DC): improve torrent naming logic to handle scene and clean …
wastaken7 Jan 28, 2026
b9b8c7a
fix(webui): path sanitization (#1185)
Audionut Jan 28, 2026
ce009e3
fix(webui): input types (#1186)
Audionut Jan 28, 2026
98ebddd
feat(UTP): add hybrid tag to torrent naming (#1181)
maksii Jan 28, 2026
1c2d7db
fix(LCD): resolution mapping for 1080i (#1184)
wastaken7 Jan 28, 2026
185e7dc
release notes
Audionut Jan 28, 2026
bd91577
v7.0.0
github-actions[bot] Jan 28, 2026
cd39ecd
fix torrent validation check
Audionut Jan 30, 2026
4aa9642
fix(ci): exclude data dir
Audionut Jan 30, 2026
e212b57
Add option to delay torrent injections (#1192)
wastaken7 Jan 30, 2026
7cc329e
refactor(webui): improve proxy handling (#1195)
Audionut Jan 30, 2026
940cf96
feat(upload): implement graceful shutdown handling for script and ser…
maksii Jan 30, 2026
c93cb2b
validate description links
Audionut Jan 30, 2026
6c994d0
fix cross-seed key setting
Audionut Jan 30, 2026
8621158
feat(dp): enhance dual and multi-audio track management for multiling…
skler1 Jan 30, 2026
7df4839
Fix argument in screenshot_header method (#1197)
wastaken7 Jan 31, 2026
1a9a26d
Enhance documentation for tracker settings and inject delay (#1196)
wastaken7 Jan 31, 2026
f6cd151
minor docs update
Audionut Jan 31, 2026
41dffeb
OTW: fix genre check handling
Audionut Jan 31, 2026
83785e0
Update bdinfo to pre-built binaries (#1200)
Audionut Jan 31, 2026
e661be2
bump bdinfo version
Audionut Jan 31, 2026
029a79d
fix(category): Improve category matching
Audionut Feb 1, 2026
92aa753
bump bdinfo version
Audionut Feb 1, 2026
57e9210
bump bdinfo version
Audionut Feb 1, 2026
8d7d5ab
bump bdinfo version
Audionut Feb 1, 2026
8945791
release notes
Audionut Feb 1, 2026
2457380
v7.0.1
github-actions[bot] Feb 1, 2026
f087110
fix(audio): set object based channel layout as LFE when not proper ch…
Audionut Feb 2, 2026
0bec16e
fix(meta): allow override automatic daily show decision
Audionut Feb 2, 2026
5fabd3f
Add bilibili to services (#1203)
WOSSFOSS Feb 2, 2026
989d7ca
RTF: improve api key update
Audionut Feb 2, 2026
15d7ac7
fix(audio): bad copy/paste
Audionut Feb 2, 2026
82b6294
fix(meta): title objects in none
Audionut Feb 2, 2026
1bfa698
fix(cleanup): handle asyncio cancellation
Audionut Feb 3, 2026
acd339c
DP(feat) - remove -NOGROUP (#1210)
emb3r-zzz Feb 4, 2026
1aa1e12
add 'Brasil Paralelo' service (#1209)
wastaken7 Feb 4, 2026
150acc1
fix(ASC, BT): skip upload if IMDb is missing (#1208)
wastaken7 Feb 4, 2026
f826c64
fix(bdmv): refactor playlist handling (#1213)
Audionut Feb 4, 2026
77aac01
bump bdinfo version
Audionut Feb 4, 2026
219c4f8
BHD: don't error on missing details id
Audionut Feb 5, 2026
1599f7f
fix(tvdb): series name from external id based search
Audionut Feb 5, 2026
bdff010
Webui prompt fixes (#1212)
Audionut Feb 6, 2026
8983f4e
Add additional content quality checks (#1164)
WOSSFOSS Feb 6, 2026
040f6d0
feat(webui): Add desclink and descfile webui assistance to select and…
maksii Feb 7, 2026
6c20128
SHRI: Fixed the audio language tag building following rules (#1207)
Feb 7, 2026
bdc14a9
bump bdinfo
Audionut Feb 7, 2026
08f29ec
simplify playlist handling
Audionut Feb 7, 2026
945fc73
v7.0.2
github-actions[bot] Feb 7, 2026
42fc2cc
BJS: change TMDb output, skip tags for existing groups (#1229)
wastaken7 Feb 9, 2026
f35a556
feat(webui): add search functionality to file browser (#1228)
thatonePRguy Feb 11, 2026
e036ff7
Fix mkbrr: Resolve TypeError (int vs str) and support system binary p…
Spy-God Feb 11, 2026
652e135
feat(webui): add mobile responsive layout for main and config views (…
thatonePRguy Feb 11, 2026
a76b6ac
Add DesiTorrents (DT) tracker support (#1224)
Spy-God Feb 11, 2026
231797a
BJS(fix): Don't skip tags (#1239)
wastaken7 Feb 12, 2026
c9dbd01
shutdown (#1238)
Audionut Feb 12, 2026
3efe0fe
action
Audionut Feb 12, 2026
81302c1
fix DT
Audionut Feb 13, 2026
452bcff
refactor(docker): enhance Docker setup and documentation (#1245)
maksii Feb 15, 2026
2014d84
reset tvdb series name
Audionut Feb 18, 2026
0991595
SHRI(fix): WEBRIP type (#1255)
tdrkmn Feb 18, 2026
6818dbd
Update bluray_com.py to fix extract_cover_images (#1252)
9Oc Feb 18, 2026
f8a3679
fix(bdmv): manual resolution handling
Audionut Feb 19, 2026
df93bbd
fix(tvdb): handle when year not in alias
Audionut Feb 22, 2026
ccb96f0
CBR: enable request search (#1267)
wastaken7 Feb 25, 2026
92febfe
BLU: update banned groups (#1263)
vmt5m3mjb Feb 25, 2026
7f58728
GPW: Add avc codec_map (#1256)
xslidi Feb 25, 2026
557dd86
Aither: fix language requirements (#1264)
vmt5m3mjb Feb 25, 2026
ebc6ab7
A4K: fix language requirements (#1265)
vmt5m3mjb Feb 25, 2026
49fd729
LST: fix language requirements (#1266)
vmt5m3mjb Feb 25, 2026
8a1ee44
TVC: Add constants and refactor description building methods (#1261)
Lusephur Feb 25, 2026
3dc255b
GPW: fix new group torrent uploading failure (#1258)
xslidi Mar 2, 2026
316d950
A4K: adding foreign language changes & img hosters (#1260)
mlnl221 Mar 2, 2026
e5dffce
DC: Add option to disable metadata-based names for torrents (#1268)
wastaken7 Mar 2, 2026
da8bff5
AvistaZ Network: Fix raw DVD names (#1269)
wastaken7 Mar 2, 2026
5c51bf3
fix(DVD): scantype handling (#1270)
Audionut Mar 2, 2026
d2e31b4
NBL api update (#1274)
Audionut Mar 3, 2026
e26f94f
release notes
Audionut Mar 3, 2026
31571aa
v7.1.0
github-actions[bot] Mar 3, 2026
cb8964c
original language mapping (#1278)
Audionut Mar 5, 2026
a6ed307
fix: override default rate limit for health endpoint
Audionut Mar 13, 2026
829a6d6
Fix continue anyway on banned group detection (#1275)
mrz948 Mar 13, 2026
f277cb6
fix(IS): cartoon category and upload success_text (#1284)
wastaken7 Mar 13, 2026
84b6f7f
AITHER: support new DV HDR flags (#1287)
markhc Mar 13, 2026
c5d0b9c
release notes
Audionut Mar 13, 2026
468e996
v7.1.1
github-actions[bot] Mar 13, 2026
d551035
fix: compose file to follow health endpoint limit
Audionut Mar 14, 2026
38ce348
Fix mod_queue_opt_in for all UNIT3D trackers, remove #import discord …
Oha-you Mar 14, 2026
7df0d14
fix(BJS): media runtime (#1290)
wastaken7 Mar 15, 2026
8b48a6f
fix(HDS): remove incompatible BBCode tags (#1302)
wastaken7 Mar 22, 2026
88b2212
fix(DC): remove incompatible BBCode tags (#1303)
wastaken7 Mar 22, 2026
d31a196
fix(SPD): remove incompatible BBCode tags (#1304)
wastaken7 Mar 22, 2026
574fbf6
fix(TL): remove incompatible BBCode tags (#1305)
wastaken7 Mar 22, 2026
e6192b9
fix(LUME): enforce MKV container requirement for non-disc uploads (#1…
wastaken7 Mar 22, 2026
d015934
fix(SPD): handle missing subtitle and audio languages gracefully (#1307)
wastaken7 Mar 22, 2026
1495a88
fix(OE): update default type_id mapping (Other/Unknown) (#1308)
wastaken7 Mar 22, 2026
db3c983
fix(HDS): duplicate search pagination and minimum resolution check (#…
wastaken7 Mar 22, 2026
421bab0
fix: Ignore the MediaInfo template for DVDs (#1310)
wastaken7 Mar 22, 2026
b204df0
fix(SHRI): remove SUBS tag and update island release shoutout (#1313)
tdrkmn Mar 22, 2026
0570e4b
fix(EMUW): duplicate detection (#1299)
HichamLL04 Mar 22, 2026
14c491f
fix scan detection
Audionut Mar 22, 2026
126045c
PTP: fix login on cookie expiration
Audionut Mar 22, 2026
105a92f
PTP: fix expired cookie handling
Audionut Mar 23, 2026
1d607db
Aither: add hdr10p handling
Audionut Mar 24, 2026
db2fa5a
AITHER: fix HDR/HDR10P mutually exclusive values (#1323)
9Oc Mar 26, 2026
86a532d
add DARKROOM to region.py (#1319)
wastaken7 Mar 26, 2026
6f2574d
THR: fix image rehosting
Audionut Mar 26, 2026
ceee681
skip tmdb images from existing descriptions
Audionut Mar 26, 2026
60b8a9a
LDU: don't except from a nonsense weeb decision
Audionut Mar 26, 2026
01cb0c3
fix: languages use stable deduping
Audionut Mar 26, 2026
1a7ab78
TL: fix anilist url handling
Audionut Mar 26, 2026
f2b0a52
retry anilist.co
Audionut Mar 26, 2026
d3bccf0
fix: catch daily episodes in dupe checking
Audionut Mar 26, 2026
71960c0
NBL: language handling
Audionut Mar 27, 2026
e7f49e6
fix: edition not upper
Audionut Mar 28, 2026
db27855
ANT: fix tag handling
Audionut Mar 28, 2026
7efa0c3
release notes
Audionut Mar 28, 2026
aea5ded
v7.1.2
github-actions[bot] Mar 28, 2026
0fabdb0
mkbrr: add windows arm support
Audionut Mar 29, 2026
a5a7693
fix: bdmv playlist scoring
Audionut Mar 31, 2026
daef192
OTW: only 1 resolution per episode
Audionut Apr 7, 2026
8040523
fix(ASC): missing TMDB data for description building (#1331)
wastaken7 Apr 10, 2026
f5e420b
feat: add support for CBR pending torrents API (#1332)
wastaken7 Apr 12, 2026
cf42a25
ANT bdinfo update (#1334)
Audionut Apr 14, 2026
2d1b0cf
Improved season pack pattern check for anime (#1335)
ppkhoa Apr 14, 2026
25e2101
v7.1.3
github-actions[bot] Apr 14, 2026
27cb44e
ANT: key in header
Audionut Apr 15, 2026
d1da3dc
DP: banned groups
Audionut Apr 15, 2026
4066131
BHD: encode settings
Audionut Apr 15, 2026
323b3e3
fix tvmovie handle when no imdb
Audionut Apr 15, 2026
2f614c5
fix: ffmpeg round to even scale
Audionut Apr 16, 2026
f09d394
v7.1.4
github-actions[bot] Apr 16, 2026
3a4e5e6
ulcx: remove hybrid from web
Audionut Apr 21, 2026
39c7e8c
Only allow MKV for non-disc on BLU (#1342)
glibbright Apr 23, 2026
1954346
Allow modified SD content upload at BHD (#1343)
glibbright Apr 23, 2026
2e9e7c0
Add more banned groups to BHD tracker (#1344)
glibbright Apr 23, 2026
e355dcb
Add validation for media container types in BHD (#1346)
glibbright Apr 23, 2026
b33e4c4
ANT: just return api message
Audionut Apr 23, 2026
994e314
validate mediainfo debugging
Audionut Apr 24, 2026
6ab394f
fix aither flags
Audionut Apr 27, 2026
18b455f
v7.1.5
github-actions[bot] Apr 27, 2026
4ccc94b
fix rtorrent skip check
Audionut Apr 30, 2026
f3c1bf3
fix: docker version tracking
Audionut May 4, 2026
338e21b
chore: update qbittorrent-api dependency version (#1356)
wastaken7 May 5, 2026
83a77d6
fix(GPW): update request data handling, add exclusive arg and auto up…
wastaken7 May 5, 2026
7bdf433
BJS: limit director/creator fields to 1 person and fix type hint (#1358)
wastaken7 May 5, 2026
737aa95
v7.1.6
github-actions[bot] May 5, 2026
ea724fa
Actually skip GPW when additional checks fail (#1360)
WOSSFOSS May 7, 2026
8b28b1d
feat(trackers/bjs): refactor duplicate search for new layout (#1361)
wastaken7 May 8, 2026
f9758aa
fix: Uploading FraMeSToR releases from BHD to Aither (#1362)
GamerGirlN6467 May 11, 2026
f384bc0
Fix key type for frame_info retrieval (#1363)
GizmoBal May 11, 2026
ffd4150
Fix SP modq not being applied (#1364)
brrbie May 11, 2026
f553c35
v7.1.7
github-actions[bot] May 11, 2026
429c2a1
fix(tvdb): don't rely on slug
Audionut May 16, 2026
c8c573d
NBL: fix ignoredupes
Audionut May 17, 2026
0f827e3
fix(trackers/is): successful upload detection (#1372)
wastaken7 May 19, 2026
3e39d5d
PTP: fix poster rehosting (#1375)
Audionut May 21, 2026
1a5242a
fix(edition): ignore sole IMDb edition
Audionut May 29, 2026
c3ec850
last readme
Audionut Jun 14, 2026
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
Prev Previous commit
Next Next commit
feat: add TOS tracker support (Audionut#1120)
Co-authored-by: Audionut <audionut@riseup.net>
Co-authored-by: wastaken7 <46319635+wastaken7@users.noreply.github.com>
  • Loading branch information
3 people authored Jan 14, 2026
commit c11b7f15a03f9abf67db14f0ccf3173aaccf5330
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ Many thanks to all who have contributed.
|ShareIsland|SHRI|SkipTheCommerials|STC|
|SpeedApp|SPD|Swarmazon|SN|
|The Leach Zone|TLZ|ToTheGlory|TTG|
|TorrentHR|THR|Torrenteros|TTR|
|TorrentLeech|TL|TVChaosUK|TVC|
|ULCX|ULCX|UTOPIA|UTP|
|YOiNKED|YOINK|YUSCENE|YUS|
|TheOldSchool|TOS|TorrentHR|THR|
|Torrenteros|TTR|TorrentLeech|TL|
|TVChaosUK|TVC|ULCX|ULCX|
|UTOPIA|UTP|YOiNKED|YOINK|
|YUSCENE|YUS|||

## **Setup:**
- **REQUIRES AT LEAST PYTHON 3.9 AND PIP3**
Expand Down
13 changes: 12 additions & 1 deletion data/example-config.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@

"TRACKERS": {
# Which trackers do you want to upload to?
# Available tracker: ACM, AITHER, ANT, AR, ASC, AZ, BHD, BHDTV, BJS, BLU, BT, CBR, CZ, DC, DP, EMUW, FF, FL, FNP, FRIKI, GPW, HDB, HDS, HDT, HHD, HUNO, IHD, IS, ITT, LCD, LDU, LST, LT, MTV, NBL, OE, OTW, PHD, PT, PTER, PTP, PTS, PTT, R4E, RAS, RF, RTF, SAM, SHRI, SN, SP, SPD, STC, THR, TIK, TL, TLZ, TTG, TTR, TVC, ULCX, UTP, YOINK, YUS
# Available tracker: ACM, AITHER, ANT, AR, ASC, AZ, BHD, BHDTV, BJS, BLU, BT, CBR, CZ, DC, DP, EMUW, FF, FL, FNP, FRIKI, GPW, HDB, HDS, HDT, HHD, HUNO, IHD, IS, ITT, LCD, LDU, LST, LT, MTV, NBL, OE, OTW, PHD, PT, PTER, PTP, PTS, PTT, R4E, RAS, RF, RTF, SAM, SHRI, SN, SP, SPD, STC, THR, TIK, TL, TLZ, TOS, TTG, TTR, TVC, ULCX, UTP, YOINK, YUS
# Only add the trackers you want to upload to on a regular basis
"default_trackers": "",

Expand Down Expand Up @@ -825,6 +825,17 @@
"api_key": "",
"anon": False,
},
"TOS": {
# Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name
"link_dir_name": "",
# Mon profil > Réglages > Clé API
"api_key": "",
# Mon profil > Réglages > Passkey
"announce_url": "https://theoldschool.cc/announce/PasskeyHere",
"anon": False,
# Upload with Exclusive flag (team of staff only)
"exclusive": False,
},
"TTG": {
# Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name
"link_dir_name": "",
Expand Down
5 changes: 3 additions & 2 deletions docs/cli-args.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,14 @@ Note: if a manual TMDb or IMDb id is present in the incoming `meta` before parsi

### Misc metadata flags

- `--not-anime`: Manually mark release as not anime. NOTE: invokes a quicker processing path for TV content when metadata ids (such as TMDB) are also provided
- `--not-anime`: Manually mark release as not anime. NOTE: invokes a quicker processing path for TV content when metadata ids (such as TMDB) are also provided.
- `-year`, `--year YYYY`: Override the year found.
- `-mc`, `--commentary`: Manually indicate commentary tracks are included.
- `-sfxs`, `--sfx-subtitles`: Manually indicate “SFX subtitles” are included.
- `-e`, `--extras`: Indicates extras are included (mainly Blu-ray discs).
- `-sort`, `--sorted-filelist`: Use the largest video file instead of the first video file found. NOTE: useful for anime content when additional content is present in a folder
- `-sort`, `--sorted-filelist`: Use the largest video file instead of the first video file found. NOTE: useful for anime content when additional content is present in a folder.
- `-kf`, `--keep-folder`: Keep the folder containing the single file (only when supplying a directory).
- `-knfo`, `--keep-nfo`: Keep nfo file where applicable for specific tracker/s. With single files, must be used in conjunction with `--keep-folder` above.
- `-reg`, `--region REGION`: Region for discs.

## Tracker-specific references (existing torrent ids/links)
Expand Down
1 change: 1 addition & 0 deletions src/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ def parse(self, args, meta):
parser.add_argument('-nfo', '--nfo', action='store_true', required=False, help="Use .nfo in directory for description")
parser.add_argument('-k', '--keywords', nargs=1, required=False, help="Add comma separated keywords e.g. 'keyword, keyword2, etc'")
parser.add_argument('-kf', '--keep-folder', action='store_true', required=False, help="Keep the folder containing the single file. Works only when supplying a directory as input. For uploads with poor filenames, like some scene.")
parser.add_argument('-knfo', '--keep-nfo', action='store_true', required=False, help="For specific trackers only, allows to keep nfo files. With single files, must be used in conjuction with --keep-folder to find the nfo in the same folder as the file.", dest="keep_nfo")
parser.add_argument('-reg', '--region', nargs=1, required=False, help="Region for discs")
parser.add_argument('-a', '--anon', action='store_true', required=False, help="Upload anonymously")
parser.add_argument('-st', '--stream', action='store_true', required=False, help="Stream Optimized Upload")
Expand Down
2 changes: 1 addition & 1 deletion src/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ def bloated_check(meta, audio_languages, is_eng_original_with_non_eng=False):
if isinstance(audio_languages, str):
audio_languages = [audio_languages]

bloat_is_allowed = ["ASC", "BJS", "BT", "CBR", "DC", "FF", "LCD", "SAM", "SHRI", "SP", "TL"]
bloat_is_allowed = ["ASC", "BJS", "BT", "CBR", "DC", "FF", "LCD", "SAM", "SHRI", "SP", "TL", "TOS"]
tracker_allowed_bloat_language = {
"AITHER": "en",
"ANT": "en",
Expand Down
1 change: 1 addition & 0 deletions src/clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -3161,6 +3161,7 @@ async def match_tracker_url(tracker_urls, meta):
'thr': ["torrenthr"],
'tl': ["tracker.tleechreload", "tracker.torrentleech"],
'tlz': ["https://tlzdigital.com/"],
'tos': ["https://theoldschool.cc"],
'ttr': ["https://torrenteros.org"],
'tvc': ["https://tvchaosuk.com"],
'ulcx': ["https://upload.cx"],
Expand Down
75 changes: 43 additions & 32 deletions src/torrentcreate.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,39 +168,50 @@ async def create_torrent(
include: list[str] = []
exclude: list[str] = []

if meta['isdir']:
if meta['keep_folder']:
cli_ui.info('--keep-folder was specified. Using complete folder for torrent creation.')
if not meta.get('tv_pack', False):
folder_name = os.path.basename(str(path))
include = [
f"{folder_name}/{os.path.basename(f)}"
for f in meta['filelist']
]
exclude = ["*", "*/**"]
if meta['keep_folder']:
console.print('--keep-folder was specified. Using complete folder for torrent creation.')
# specific nfo catch for certain trackers. BASE catch should prevent unintentional inclusion by default
if meta.get('keep_nfo', False) and "BASE" not in output_filename:
console.print('--keep-nfo was specified. Including NFO files in torrent.')
include = ["*.mkv", "*.mp4", "*.ts", "*.nfo"]
exclude = ["*.*", "*sample.mkv"]
meta['mkbrr'] = False
elif not meta.get('tv_pack', False):
folder_name = os.path.basename(str(path))
include = [
f"{folder_name}/{os.path.basename(f)}"
for f in meta['filelist']
]
exclude = ["*", "*/**"]

elif meta['isdir']:
if meta.get('keep_nfo', False) and not meta.get('is_disc', False) and "BASE" not in output_filename:
console.print('--keep-nfo was specified. Including NFO files in torrent.')
include = ["*.mkv", "*.mp4", "*.ts", "*.nfo"]
exclude = ["*.*", "*sample.mkv"]
meta['mkbrr'] = False
elif meta.get('is_disc', False):
include = []
exclude = []
elif not meta.get('tv_pack', False):
path_dir = os.fspath(path)
os.chdir(path_dir)
globs = glob.glob1(path_dir, "*.mkv") + glob.glob1(path_dir, "*.mp4") + glob.glob1(path_dir, "*.ts")
no_sample_globs = [
os.path.abspath(f"{path_dir}{os.sep}{file}") for file in globs
if not file.lower().endswith('sample.mkv') or "!sample" in file.lower()
]
if len(no_sample_globs) == 1:
path = meta['filelist'][0]
exclude = ["*.*", "*sample.mkv", "!sample*.*"] if not meta['is_disc'] else []
include = ["*.mkv", "*.mp4", "*.ts"] if not meta['is_disc'] else []
else:
if meta.get('is_disc', False):
include = []
exclude = []
elif not meta.get('tv_pack', False):
path_dir = os.fspath(path)
os.chdir(path_dir)
globs = glob.glob1(path_dir, "*.mkv") + glob.glob1(path_dir, "*.mp4") + glob.glob1(path_dir, "*.ts")
no_sample_globs = [
os.path.abspath(f"{path_dir}{os.sep}{file}") for file in globs
if not file.lower().endswith('sample.mkv') or "!sample" in file.lower()
]
if len(no_sample_globs) == 1:
path = meta['filelist'][0]
exclude = ["*.*", "*sample.mkv", "!sample*.*"] if not meta['is_disc'] else []
include = ["*.mkv", "*.mp4", "*.ts"] if not meta['is_disc'] else []
else:
folder_name = os.path.basename(str(path))
include = [
f"{folder_name}/{os.path.basename(f)}"
for f in meta['filelist']
]
exclude = ["*", "*/**"]
folder_name = os.path.basename(str(path))
include = [
f"{folder_name}/{os.path.basename(f)}"
for f in meta['filelist']
]
exclude = ["*", "*/**"]
else:
exclude = ["*.*", "*sample.mkv", "!sample*.*"] if not meta['is_disc'] else []
include = ["*.mkv", "*.mp4", "*.ts"] if not meta['is_disc'] else []
Expand Down
94 changes: 85 additions & 9 deletions src/trackers/COMMON.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import hashlib
import httpx
import json
import langcodes
import os
import re
import secrets
import sys
from langcodes import tag_parser
from src.bbcode import BBCODE
from src.console import console
from src.exportmi import exportInfo
Expand Down Expand Up @@ -1019,20 +1021,74 @@ async def read_and_clean():
async def check_language_requirements(
self,
meta: dict[str, Any],
tracker,
languages_to_check,
check_audio=False,
check_subtitle=False,
require_both=False,
):
"""Check if the given media meets language requirements."""
tracker: str,
languages_to_check: List[str],
check_audio: bool = False,
check_subtitle: bool = False,
require_both: bool = False,
original_language: bool = False,
) -> bool:
"""
Check if the media metadata meets specific language requirements for audio and/or subtitles.

The function evaluates whether the provided media contains the required languages.
It can also handle logic for original language tracks and cross-reference them
with subtitles if the primary audio requirement isn't met.

:param meta: Dictionary containing media metadata (audio_languages, subtitle_languages, etc.).
:type meta: dict[str, Any]
:param tracker: Name of the tracker being processed, used for logging/output.
:type tracker: str
:param languages_to_check: A list of language names or codes to search for.
:type languages_to_check: List[str]
:param check_audio: If True, validates if required languages are present in audio tracks.
:type check_audio: bool
:param check_subtitle: If True, validates if required languages are present in subtitle tracks.
:type check_subtitle: bool
:param require_both: If True, both audio AND subtitle requirements must be satisfied.
If False, satisfying either is enough (OR logic).
:type require_both: bool
:param original_language: If True, checks if the media's original language matches the audio
track, allowing a fallback to subtitle-only validation.
:type original_language: bool
:return: True if language requirements are met, False otherwise.
:rtype: bool
"""
try:
if not meta.get("language_checked", False):
await process_desc_language(meta, tracker=tracker)

meta_audio_languages: list[str] = meta.get("audio_languages", [])
meta_subtitle_languages: list[str] = meta.get("subtitle_languages", [])

languages_to_check = [lang.lower() for lang in languages_to_check]
audio_languages = [lang.lower() for lang in meta.get("audio_languages", [])]
subtitle_languages = [lang.lower() for lang in meta.get("subtitle_languages", [])]
audio_languages = [lang.lower() for lang in meta_audio_languages]
subtitle_languages = [lang.lower() for lang in meta_subtitle_languages]
language_display = None
original_ok = False
if original_language:
# Get just the first original language
original_language_raw = meta.get("original_language", [])
first_lang = ""
if original_language_raw:
# Handle both string and list cases
if isinstance(original_language_raw, str):
first_lang = original_language_raw.lower()
elif isinstance(original_language_raw, list) and original_language_raw:
first_lang = original_language_raw[0].lower() if isinstance(original_language_raw[0], str) else ""

try:
# Clean up the language code - take only the first part before any dash or underscore
clean_lang = first_lang.split('-')[0].split('_')[0].split(',')[0].split(' ')[0].strip().lower()
if clean_lang:
lang = langcodes.Language.get(clean_lang)
language_display = lang.display_name().lower()
except (tag_parser.LanguageTagError, LookupError, AttributeError, ValueError) as e:
if meta.get('debug'):
console.print(f"[yellow]Debug: Unable to convert language code '{first_lang}' to full name: {e}[/yellow]")

if language_display:
original_ok = language_display in audio_languages

audio_ok = (
not check_audio
Expand All @@ -1043,6 +1099,26 @@ async def check_language_requirements(
or any(lang in subtitle_languages for lang in languages_to_check)
)

if meta.get('debug'):
console.print(f"[blue]Debug: Audio Languages Found: {audio_languages}[/blue]")
console.print(f"[blue]Debug: Subtitle Languages Found: {subtitle_languages}[/blue]")
console.print(f"[blue]Debug: Original Audio Language: {language_display}[/blue]")
console.print(f"[blue]Debug: Audio OK: {audio_ok}, Subtitle OK: {subtitle_ok}, Original OK: {original_ok}[/blue]")

if not audio_ok and original_ok:
if subtitle_ok:
return subtitle_ok
else:
console.print(
f"[red]Language requirement not met for [bold]{tracker}[/bold].[/red]\n"
f"[yellow]Required subtitles in one of the following with an original audio track:[/yellow] "
f"{', '.join(languages_to_check)}\n"
f"[cyan]Found Audio:[/cyan] {', '.join(audio_languages) or 'None'}\n"
f"[cyan]Found Subtitles:[/cyan] {', '.join(subtitle_languages) or 'None'}\n"
f"[cyan]Original Audio Language:[/cyan] {language_display}"
)
return False

if require_both:
if not (audio_ok and subtitle_ok):
console.print(
Expand Down
Loading