Skip to content

Add support for NordicQuality#1162

Open
tiberio87 wants to merge 3 commits intoAudionut:masterfrom
tiberio87:nordicq
Open

Add support for NordicQuality#1162
tiberio87 wants to merge 3 commits intoAudionut:masterfrom
tiberio87:nordicq

Conversation

@tiberio87
Copy link

@tiberio87 tiberio87 commented Jan 25, 2026

Summary by CodeRabbit

  • New Features

    • Added NordicQuality (NQ) tracker support with metadata mapping (categories, types, resolutions) and API integration.
  • Documentation

    • Restructured README supported-sites table: updated entries, ordering, and visible site mappings.
  • Chores

    • Added example configuration entries for the new NQ tracker.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 25, 2026

📝 Walkthrough

Walkthrough

Adds support for the NordicQuality (NQ) tracker: new tracker implementation module, registration in tracker setup, and example-config and README updates to include the NQ tracker entry.

Changes

Cohort / File(s) Summary
Documentation
README.md
Reworked supported-sites table: removed and added entries, reordered rows to include NordicQuality (NQ) and other site name mapping adjustments
Configuration
data/example-config.py
Added NQ to TRACKERS and a per-tracker config block with link_dir_name, api_key, anon, and modq fields
Tracker Implementation
src/trackers/NQ.py
New NQ class (subclassing UNIT3D) with tracker endpoints, banned_groups, and async metadata mapping methods for category/type/resolution, additional checks/data, and name normalization
Tracker Registration
src/trackersetup.py
Imported NQ and registered it in tracker_class_map and the api_trackers set

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • Audionut

Poem

🐰 A rabbit found a Nordic gate,
Mapped the fields and set the state,
Keys and names all tucked in snug,
Hopped to README, gave a hug,
NQ hops in — a tiny celebratory crate!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add support for NordicQuality' directly and accurately summarizes the main change in the pull request, which adds a new tracker module and configuration for NordicQuality (NQ).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

🔍 Code Analysis Results

🔍 Pyright Type Checking

=== Python 3.10, 3.11, 3.12, 3.13, 3.14, 3.9 (identical results) ===
/home/runner/work/Upload-Assistant/Upload-Assistant/src/trackers/NQ.py
  /home/runner/work/Upload-Assistant/Upload-Assistant/src/trackers/NQ.py:3:8 - error: Import "re" is not accessed (reportUnusedImport)
1 error, 0 warnings, 0 informations

🧹 Ruff Lint

=== Python 3.10, 3.11, 3.12, 3.13, 3.14, 3.9 (identical results) ===
W291 [*] Trailing whitespace
   --> data/example-config.py:676:11
    |
674 |             # Send uploads to Aither modq for staff approval
675 |             "modq": False,
676 |         },        
    |           ^^^^^^^^
677 |         "OE": {
678 |             # Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name
    |
help: Remove trailing whitespace

F401 [*] `re` imported but unused
 --> src/trackers/NQ.py:3:8
  |
1 | # Upload Assistant © 2025 Audionut & wastaken7 — Licensed under UAPL v1.0
2 | import os
3 | import re
  |        ^^
4 | from typing import Any, Optional
  |
help: Remove unused import: `re`

I001 [*] Import block is un-sorted or un-formatted
  --> src/trackersetup.py:2:1
   |
 1 |   # Upload Assistant © 2025 Audionut & wastaken7 — Licensed under UAPL v1.0
 2 | / import asyncio
 3 | | import json
 4 | | import os
 5 | | import re
 6 | | import sys
 7 | | from datetime import datetime, timedelta, timezone
 8 | | from pathlib import Path
 9 | | from typing import Any, Optional, Union, cast
10 | |
11 | | import aiofiles
12 | | import cli_ui
13 | | import httpx
14 | |
15 | | from src.cleanup import cleanup_manager
16 | | from src.console import console
17 | | from src.trackers.A4K import A4K
18 | | from src.trackers.ACM import ACM
19 | | from src.trackers.AITHER import AITHER
20 | | from src.trackers.ANT import ANT
21 | | from src.trackers.AR import AR
22 | | from src.trackers.ASC import ASC
23 | | from src.trackers.AZ import AZ
24 | | from src.trackers.BHD import BHD
25 | | from src.trackers.BHDTV import BHDTV
26 | | from src.trackers.BJS import BJS
27 | | from src.trackers.BLU import BLU
28 | | from src.trackers.BT import BT
29 | | from src.trackers.CBR import CBR
30 | | from src.trackers.COMMON import COMMON
31 | | from src.trackers.CZ import CZ
32 | | from src.trackers.DC import DC
33 | | from src.trackers.DP import DP
34 | | from src.trackers.EMUW import EMUW
35 | | from src.trackers.FF import FF
36 | | from src.trackers.FL import FL
37 | | from src.trackers.FNP import FNP
38 | | from src.trackers.FRIKI import FRIKI
39 | | from src.trackers.GPW import GPW
40 | | from src.trackers.HDB import HDB
41 | | from src.trackers.HDS import HDS
42 | | from src.trackers.HDT import HDT
43 | | from src.trackers.HHD import HHD
44 | | from src.trackers.HUNO import HUNO
45 | | from src.trackers.IHD import IHD
46 | | from src.trackers.IS import IS
47 | | from src.trackers.ITT import ITT
48 | | from src.trackers.LCD import LCD
49 | | from src.trackers.LDU import LDU
50 | | from src.trackers.LST import LST
51 | | from src.trackers.LT import LT
52 | | from src.trackers.LUME import LUME
53 | | from src.trackers.MTV import MTV
54 | | from src.trackers.NQ import NQ
55 | | from src.trackers.NBL import NBL
56 | | from src.trackers.OE import OE
57 | | from src.trackers.OTW import OTW
58 | | from src.trackers.PHD import PHD
59 | | from src.trackers.PT import PT
60 | | from src.trackers.PTER import PTER
61 | | from src.trackers.PTP import PTP
62 | | from src.trackers.PTS import PTS
63 | | from src.trackers.PTT import PTT
64 | | from src.trackers.R4E import R4E
65 | | from src.trackers.RAS import RAS
66 | | from src.trackers.RF import RF
67 | | from src.trackers.RTF import RTF
68 | | from src.trackers.SAM import SAM
69 | | from src.trackers.SHRI import SHRI
70 | | from src.trackers.SN import SN
71 | | from src.trackers.SP import SP
72 | | from src.trackers.SPD import SPD
73 | | from src.trackers.STC import STC
74 | | from src.trackers.THR import THR
75 | | from src.trackers.TIK import TIK
76 | | from src.trackers.TL import TL
77 | | from src.trackers.TLZ import TLZ
78 | | from src.trackers.TOS import TOS
79 | | from src.trackers.TTG import TTG
80 | | from src.trackers.TTR import TTR
81 | | from src.trackers.TVC import TVC
82 | | from src.trackers.ULCX import ULCX
83 | | from src.trackers.UTP import UTP
84 | | from src.trackers.YOINK import YOINK
85 | | from src.trackers.YUS import YUS
   | |________________________________^
86 |
87 |   JsonDict = dict[str, Any]
   |
help: Organize imports

Found 3 errors.
[*] 3 fixable with the `--fix` option.

This comment was automatically generated by the CI pipeline.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@data/example-config.py`:
- Around line 669-676: The inline comment inside the "NQ" configuration block
incorrectly references "Aither"; update the comment to mention "NQ" instead.
Locate the "NQ" dict and the "modq" key (the block with "link_dir_name",
"api_key", "anon", "modq") and change the comment that reads "Send uploads to
Aither modq for staff approval" to something like "Send uploads to NQ modq for
staff approval" so it accurately reflects this tracker configuration.
🧹 Nitpick comments (4)
src/trackers/NQ.py (3)

3-3: Unused import: re module is imported but never used.

The re module is imported but not referenced anywhere in this file.

🧹 Remove unused import
 import os
-import re
 from typing import Any, Optional

26-27: Unnecessary pass statement.

The pass statement after the attribute assignments serves no purpose.

🧹 Remove unnecessary pass
         self.banned_groups = [""]
-        pass

109-125: Missing return statement for edge case.

If name ends up being an empty string after all processing (e.g., empty scene_name, uuid, name fields), the function will return {'name': ''}. While this is technically valid, consider adding a guard or fallback.

💡 Consider adding a fallback for empty name
         if ext.lower() in KNOWN_EXTENSIONS:
             name = base.replace(" ", ".")
+        if not name:
+            name = str(meta.get('uuid', 'Unknown')).replace(" ", ".")
         console.print(f"[cyan]Name: {name}")

         return {'name': name}
src/trackersetup.py (1)

54-55: Import order: NQ should come after NBL alphabetically.

Minor nitpick: NQ is imported before NBL, but alphabetically "NBL" < "NQ". Consider swapping for consistency with the alphabetical ordering pattern.

🧹 Suggested reordering
 from src.trackers.MTV import MTV
-from src.trackers.NQ import NQ
 from src.trackers.NBL import NBL
+from src.trackers.NQ import NQ
 from src.trackers.OE import OE

@github-actions
Copy link

🔍 Code Analysis Results

🧹 Ruff Lint

=== Python 3.10, 3.11, 3.12, 3.13, 3.14, 3.9 (identical results) ===
W291 [*] Trailing whitespace
   --> data/example-config.py:676:11
    |
674 |             # Send uploads to NordiQuality modq for staff approval
675 |             "modq": False,
676 |         },        
    |           ^^^^^^^^
677 |         "OE": {
678 |             # Instead of using the tracker acronym for folder name when sym/hard linking, you can use a custom name
    |
help: Remove trailing whitespace

I001 [*] Import block is un-sorted or un-formatted
  --> src/trackersetup.py:2:1
   |
 1 |   # Upload Assistant © 2025 Audionut & wastaken7 — Licensed under UAPL v1.0
 2 | / import asyncio
 3 | | import json
 4 | | import os
 5 | | import re
 6 | | import sys
 7 | | from datetime import datetime, timedelta, timezone
 8 | | from pathlib import Path
 9 | | from typing import Any, Optional, Union, cast
10 | |
11 | | import aiofiles
12 | | import cli_ui
13 | | import httpx
14 | |
15 | | from src.cleanup import cleanup_manager
16 | | from src.console import console
17 | | from src.trackers.A4K import A4K
18 | | from src.trackers.ACM import ACM
19 | | from src.trackers.AITHER import AITHER
20 | | from src.trackers.ANT import ANT
21 | | from src.trackers.AR import AR
22 | | from src.trackers.ASC import ASC
23 | | from src.trackers.AZ import AZ
24 | | from src.trackers.BHD import BHD
25 | | from src.trackers.BHDTV import BHDTV
26 | | from src.trackers.BJS import BJS
27 | | from src.trackers.BLU import BLU
28 | | from src.trackers.BT import BT
29 | | from src.trackers.CBR import CBR
30 | | from src.trackers.COMMON import COMMON
31 | | from src.trackers.CZ import CZ
32 | | from src.trackers.DC import DC
33 | | from src.trackers.DP import DP
34 | | from src.trackers.EMUW import EMUW
35 | | from src.trackers.FF import FF
36 | | from src.trackers.FL import FL
37 | | from src.trackers.FNP import FNP
38 | | from src.trackers.FRIKI import FRIKI
39 | | from src.trackers.GPW import GPW
40 | | from src.trackers.HDB import HDB
41 | | from src.trackers.HDS import HDS
42 | | from src.trackers.HDT import HDT
43 | | from src.trackers.HHD import HHD
44 | | from src.trackers.HUNO import HUNO
45 | | from src.trackers.IHD import IHD
46 | | from src.trackers.IS import IS
47 | | from src.trackers.ITT import ITT
48 | | from src.trackers.LCD import LCD
49 | | from src.trackers.LDU import LDU
50 | | from src.trackers.LST import LST
51 | | from src.trackers.LT import LT
52 | | from src.trackers.LUME import LUME
53 | | from src.trackers.MTV import MTV
54 | | from src.trackers.NQ import NQ
55 | | from src.trackers.NBL import NBL
56 | | from src.trackers.OE import OE
57 | | from src.trackers.OTW import OTW
58 | | from src.trackers.PHD import PHD
59 | | from src.trackers.PT import PT
60 | | from src.trackers.PTER import PTER
61 | | from src.trackers.PTP import PTP
62 | | from src.trackers.PTS import PTS
63 | | from src.trackers.PTT import PTT
64 | | from src.trackers.R4E import R4E
65 | | from src.trackers.RAS import RAS
66 | | from src.trackers.RF import RF
67 | | from src.trackers.RTF import RTF
68 | | from src.trackers.SAM import SAM
69 | | from src.trackers.SHRI import SHRI
70 | | from src.trackers.SN import SN
71 | | from src.trackers.SP import SP
72 | | from src.trackers.SPD import SPD
73 | | from src.trackers.STC import STC
74 | | from src.trackers.THR import THR
75 | | from src.trackers.TIK import TIK
76 | | from src.trackers.TL import TL
77 | | from src.trackers.TLZ import TLZ
78 | | from src.trackers.TOS import TOS
79 | | from src.trackers.TTG import TTG
80 | | from src.trackers.TTR import TTR
81 | | from src.trackers.TVC import TVC
82 | | from src.trackers.ULCX import ULCX
83 | | from src.trackers.UTP import UTP
84 | | from src.trackers.YOINK import YOINK
85 | | from src.trackers.YUS import YUS
   | |________________________________^
86 |
87 |   JsonDict = dict[str, Any]
   |
help: Organize imports

Found 2 errors.
[*] 2 fixable with the `--fix` option.

This comment was automatically generated by the CI pipeline.

@github-actions
Copy link

🔍 Code Analysis Results

🧹 Ruff Lint

=== Python 3.10, 3.11, 3.12, 3.13, 3.14, 3.9 (identical results) ===
I001 [*] Import block is un-sorted or un-formatted
  --> src/trackersetup.py:2:1
   |
 1 |   # Upload Assistant © 2025 Audionut & wastaken7 — Licensed under UAPL v1.0
 2 | / import asyncio
 3 | | import json
 4 | | import os
 5 | | import re
 6 | | import sys
 7 | | from datetime import datetime, timedelta, timezone
 8 | | from pathlib import Path
 9 | | from typing import Any, Optional, Union, cast
10 | |
11 | | import aiofiles
12 | | import cli_ui
13 | | import httpx
14 | |
15 | | from src.cleanup import cleanup_manager
16 | | from src.console import console
17 | | from src.trackers.A4K import A4K
18 | | from src.trackers.ACM import ACM
19 | | from src.trackers.AITHER import AITHER
20 | | from src.trackers.ANT import ANT
21 | | from src.trackers.AR import AR
22 | | from src.trackers.ASC import ASC
23 | | from src.trackers.AZ import AZ
24 | | from src.trackers.BHD import BHD
25 | | from src.trackers.BHDTV import BHDTV
26 | | from src.trackers.BJS import BJS
27 | | from src.trackers.BLU import BLU
28 | | from src.trackers.BT import BT
29 | | from src.trackers.CBR import CBR
30 | | from src.trackers.COMMON import COMMON
31 | | from src.trackers.CZ import CZ
32 | | from src.trackers.DC import DC
33 | | from src.trackers.DP import DP
34 | | from src.trackers.EMUW import EMUW
35 | | from src.trackers.FF import FF
36 | | from src.trackers.FL import FL
37 | | from src.trackers.FNP import FNP
38 | | from src.trackers.FRIKI import FRIKI
39 | | from src.trackers.GPW import GPW
40 | | from src.trackers.HDB import HDB
41 | | from src.trackers.HDS import HDS
42 | | from src.trackers.HDT import HDT
43 | | from src.trackers.HHD import HHD
44 | | from src.trackers.HUNO import HUNO
45 | | from src.trackers.IHD import IHD
46 | | from src.trackers.IS import IS
47 | | from src.trackers.ITT import ITT
48 | | from src.trackers.LCD import LCD
49 | | from src.trackers.LDU import LDU
50 | | from src.trackers.LST import LST
51 | | from src.trackers.LT import LT
52 | | from src.trackers.LUME import LUME
53 | | from src.trackers.MTV import MTV
54 | | from src.trackers.NQ import NQ
55 | | from src.trackers.NBL import NBL
56 | | from src.trackers.OE import OE
57 | | from src.trackers.OTW import OTW
58 | | from src.trackers.PHD import PHD
59 | | from src.trackers.PT import PT
60 | | from src.trackers.PTER import PTER
61 | | from src.trackers.PTP import PTP
62 | | from src.trackers.PTS import PTS
63 | | from src.trackers.PTT import PTT
64 | | from src.trackers.R4E import R4E
65 | | from src.trackers.RAS import RAS
66 | | from src.trackers.RF import RF
67 | | from src.trackers.RTF import RTF
68 | | from src.trackers.SAM import SAM
69 | | from src.trackers.SHRI import SHRI
70 | | from src.trackers.SN import SN
71 | | from src.trackers.SP import SP
72 | | from src.trackers.SPD import SPD
73 | | from src.trackers.STC import STC
74 | | from src.trackers.THR import THR
75 | | from src.trackers.TIK import TIK
76 | | from src.trackers.TL import TL
77 | | from src.trackers.TLZ import TLZ
78 | | from src.trackers.TOS import TOS
79 | | from src.trackers.TTG import TTG
80 | | from src.trackers.TTR import TTR
81 | | from src.trackers.TVC import TVC
82 | | from src.trackers.ULCX import ULCX
83 | | from src.trackers.UTP import UTP
84 | | from src.trackers.YOINK import YOINK
85 | | from src.trackers.YUS import YUS
   | |________________________________^
86 |
87 |   JsonDict = dict[str, Any]
   |
help: Organize imports

Found 1 error.
[*] 1 fixable with the `--fix` option.

This comment was automatically generated by the CI pipeline.

@tiberio87 tiberio87 mentioned this pull request Jan 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant