site 1.8.1: the boot screen names the release (Pionaarr Mods 1.8.1)
make_builder_data.py writes the site version into the credit mod's RELEASE and into the pages' and the builder's boot text on every run; new boot screen shots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
08adcfcd27
commit
5537afb53d
13 files changed
+89
-30
No files matched your search
Binary file not shown.
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
+18
-2
@@ -1,8 +1,15 @@
|
||||
// Generated by tools/make_builder_data.py from tools/changelog.json and the mods' versions.
|
||||
window.CDJ_VERSIONS = {
|
||||
"site": "1.8.0",
|
||||
"site": "1.8.1",
|
||||
"date": "2026-10-20",
|
||||
"log": [
|
||||
{
|
||||
"version": "1.8.1",
|
||||
"date": "2026-10-20",
|
||||
"changes": [
|
||||
"The boot screen names the release: Pionaarr Mods 1.8.1 (it said 1.0); from now on always the latest."
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "1.8.0",
|
||||
"date": "2026-10-20",
|
||||
@@ -173,7 +180,7 @@ window.CDJ_VERSIONS = {
|
||||
"cuenames": "0.1.1",
|
||||
"endwarn": "0.1.0",
|
||||
"played": "0.3.1",
|
||||
"credit": "1.0.0"
|
||||
"credit": "1.1.0"
|
||||
},
|
||||
"modlog": {
|
||||
"beatjump": [
|
||||
@@ -343,6 +350,15 @@ window.CDJ_VERSIONS = {
|
||||
"Hot cue colours read correctly when a cue has a comment."
|
||||
]
|
||||
}
|
||||
],
|
||||
"credit": [
|
||||
{
|
||||
"version": "1.1.0",
|
||||
"date": "2026-10-20",
|
||||
"changes": [
|
||||
"The boot text carries the Pionaarr Mods release number, always the latest."
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
+6
-6
@@ -6,12 +6,12 @@
|
||||
<title>Pionaarr Mods Builder</title>
|
||||
<meta name="description" content="Build your own modded C900NXS.UPD in the browser: upload the official 1.31 update, tick the mods, download the file. Nothing leaves your computer.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<script src="builder/data.js?v=1.8.0"></script>
|
||||
<script src="builder/builder.js?v=1.8.0"></script>
|
||||
<script src="builder/ui.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
<script src="builder/data.js?v=1.8.1"></script>
|
||||
<script src="builder/builder.js?v=1.8.1"></script>
|
||||
<script src="builder/ui.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"mods/patch_cdj900nxs.py":"#!/usr/bin/env python3\n# SPDX-License-Identifier: GPL-2.0-or-later\n\"\"\"Apply arnoldasr's CDJ-900NXS 1.31 mods to the unpacked MAIN image.\n\n usage: patch_cdj900nxs.py <main_unpacked.bin> <patched.bin> <mod>[,<mod>...]\n patch_cdj900nxs.py --list\n\nThe mods come from https://github.com/arnoldasr/cdj900nxs, read as data from a\ncheckout of it (CDJ900NXS_MODS_SRC, default mods/cdj900nxs/upstream, which is\nnot committed: that repository carries no licence). Nothing of its Python is\nimported; what its build_firmware.py does is redone here:\n\n extended_bpm the BPM with hundredths: the stock tenths moved into a new\n small digit above, the lower one showing hundredths.\n phasemeter the two-line phase meter (orange master, blue this deck, a\n marker each) in place of the four boxes, chosen in UTILITY >\n PHASE METER (SLIP FLASHING relabelled; mods/phase-meter-\n utility.cdjmod.json).\n advanced_waveforms (was rgb_waveform; based on arnoldasr's, updated and\n maintained by us) the big waveform in rekordbox's RGB colours\n (1.0.1: also when its colour detail is a little short,\n cdj900nxs/wavefix.py), and the overview's colour table as a red-to-white\n gradient (mods/waveform-colour.cdjmod.json); with our\n UTILITY > WAVEFORM: BLUE / RGB / 3BAND (cdj900nxs/wavemodes.py,\n left out with public=True).\n\n The three are arnoldasr's code mod (patches/mods.json): hooks\n in the application redirected to SH-4 code appended after it\n (0x08FC1000), plus an asset blob at 0x08FC2D00 generated from\n the stock image (the resource table extended by four phase-meter\n images, then the RGB waveform palette and LUT). Upstream tested\n it as one build, and as one without the RGB waveform\n (patches/bpm-phase-meter.json); one of those two is built and\n checked against its hash first, then the hooks of a feature not\n chosen get their original bytes back. Their shared startup hook\n (0x08C071FC) installs the BPM digits and the phase markers: the\n call of the one not chosen is taken out there.\n beatjump ours, not arnoldasr's (cdj900nxs/beatjump.py): TRACK SEARCH\n jumps 1/2/4/8 beats along the grid, chosen in UTILITY > BEAT JUMP,\n made at once in the DSP's decoded audio (cdj900nxs/dspjump.py, a\n patch of the audio DSP's code),\n which replaces SCREEN SAVER. hotcuekeys' engine makes the jumps,\n so it needs hotcuekeys and cuecolours. Needs no upstream checkout.\n cuecolours ours (cdj900nxs/cuecolours.py): memory cues drawn in their\n rekordbox colour on the overview and the detail waveform, the\n rekordbox hot cues shown as lettered boxes.\n Needs no upstream checkout.\n hotcuekeys ours (cdj900nxs/hotcuekeys.py): UTILITY > HOT CUE KEYS (a new,\n 18th item); with it ON, QUANTIZE briefly pressed switches a hot\n cue key mode shown in a HOT KEYS box, held it is QUANTIZE. In\n the mode the top three BEAT DIVIDE keys play hot cues A-C (held: a\n gate), set one (empty key held while paused) or delete one\n (DELETE held). The hot cues come from cuecolours.\n ledsaver ours (cdj900nxs/ledsaver.py): UTILITY > LED ANIMATION (one more\n item, after the others); with it ON, while the screen saver dims\n the display the button LEDs and the jog's rings play a loop.\n keynotation ours (cdj900nxs/keynotation.py): UTILITY > KEY NOTATION (one\n more item): every track's key in Camelot, Open Key or classic\n notation, whatever rekordbox exported.\n usbautoload ours (cdj900nxs/usbautoload.py): UTILITY > USB AUTO LOAD (one\n more item): a stick's MY SETTINGS are loaded when the player finds\n them, without waiting for MENU.\n quicksearch ours (cdj900nxs/quicksearch.py): BROWSE held opens SEARCH,\n BROWSE twice the list the playing track came from.\n (phasemeter, in unreleased builds, also gets ours from cdj900nxs/phasereverse.py:\n UTILITY > PHASE METER OFF / ON / REVERSE, and the beat countdown\n moved clear of the line meter; `phasereverse` is an old name for it.)\n credit ours (cdj900nxs/credit.py): the boot screen says \"Pionaarr Mods\n 1.0\" where it said \"Ver 1.31\".\n\nEvery patch is applied only where the image holds the expected original\nbytes, and arnoldasr's code is first built as one of the builds he tested\nand checked against its hash.\n\nOur lzss_decode.py runs 54 bytes past the end of the packed stream, so\nmain_unpacked.bin is the 1.31 application plus a tail the firmware never\nreads; the application is cut back to its own length first.\n\"\"\"\nimport hashlib\nimport json\nimport os\nimpLine truncated
|
||||
{"mods/patch_cdj900nxs.py":"#!/usr/bin/env python3\n# SPDX-License-Identifier: GPL-2.0-or-later\n\"\"\"Apply arnoldasr's CDJ-900NXS 1.31 mods to the unpacked MAIN image.\n\n usage: patch_cdj900nxs.py <main_unpacked.bin> <patched.bin> <mod>[,<mod>...]\n patch_cdj900nxs.py --list\n\nThe mods come from https://github.com/arnoldasr/cdj900nxs, read as data from a\ncheckout of it (CDJ900NXS_MODS_SRC, default mods/cdj900nxs/upstream, which is\nnot committed: that repository carries no licence). Nothing of its Python is\nimported; what its build_firmware.py does is redone here:\n\n extended_bpm the BPM with hundredths: the stock tenths moved into a new\n small digit above, the lower one showing hundredths.\n phasemeter the two-line phase meter (orange master, blue this deck, a\n marker each) in place of the four boxes, chosen in UTILITY >\n PHASE METER (SLIP FLASHING relabelled; mods/phase-meter-\n utility.cdjmod.json).\n advanced_waveforms (was rgb_waveform; based on arnoldasr's, updated and\n maintained by us) the big waveform in rekordbox's RGB colours\n (1.0.1: also when its colour detail is a little short,\n cdj900nxs/wavefix.py), and the overview's colour table as a red-to-white\n gradient (mods/waveform-colour.cdjmod.json); with our\n UTILITY > WAVEFORM: BLUE / RGB / 3BAND (cdj900nxs/wavemodes.py,\n left out with public=True).\n\n The three are arnoldasr's code mod (patches/mods.json): hooks\n in the application redirected to SH-4 code appended after it\n (0x08FC1000), plus an asset blob at 0x08FC2D00 generated from\n the stock image (the resource table extended by four phase-meter\n images, then the RGB waveform palette and LUT). Upstream tested\n it as one build, and as one without the RGB waveform\n (patches/bpm-phase-meter.json); one of those two is built and\n checked against its hash first, then the hooks of a feature not\n chosen get their original bytes back. Their shared startup hook\n (0x08C071FC) installs the BPM digits and the phase markers: the\n call of the one not chosen is taken out there.\n beatjump ours, not arnoldasr's (cdj900nxs/beatjump.py): TRACK SEARCH\n jumps 1/2/4/8 beats along the grid, chosen in UTILITY > BEAT JUMP,\n made at once in the DSP's decoded audio (cdj900nxs/dspjump.py, a\n patch of the audio DSP's code),\n which replaces SCREEN SAVER. hotcuekeys' engine makes the jumps,\n so it needs hotcuekeys and cuecolours. Needs no upstream checkout.\n cuecolours ours (cdj900nxs/cuecolours.py): memory cues drawn in their\n rekordbox colour on the overview and the detail waveform, the\n rekordbox hot cues shown as lettered boxes.\n Needs no upstream checkout.\n hotcuekeys ours (cdj900nxs/hotcuekeys.py): UTILITY > HOT CUE KEYS (a new,\n 18th item); with it ON, QUANTIZE briefly pressed switches a hot\n cue key mode shown in a HOT KEYS box, held it is QUANTIZE. In\n the mode the top three BEAT DIVIDE keys play hot cues A-C (held: a\n gate), set one (empty key held while paused) or delete one\n (DELETE held). The hot cues come from cuecolours.\n ledsaver ours (cdj900nxs/ledsaver.py): UTILITY > LED ANIMATION (one more\n item, after the others); with it ON, while the screen saver dims\n the display the button LEDs and the jog's rings play a loop.\n keynotation ours (cdj900nxs/keynotation.py): UTILITY > KEY NOTATION (one\n more item): every track's key in Camelot, Open Key or classic\n notation, whatever rekordbox exported.\n usbautoload ours (cdj900nxs/usbautoload.py): UTILITY > USB AUTO LOAD (one\n more item): a stick's MY SETTINGS are loaded when the player finds\n them, without waiting for MENU.\n quicksearch ours (cdj900nxs/quicksearch.py): BROWSE held opens SEARCH,\n BROWSE twice the list the playing track came from.\n (phasemeter, in unreleased builds, also gets ours from cdj900nxs/phasereverse.py:\n UTILITY > PHASE METER OFF / ON / REVERSE, and the beat countdown\n moved clear of the line meter; `phasereverse` is an old name for it.)\n credit ours (cdj900nxs/credit.py): the boot screen says \"Pionaarr Mods\n 1.0\" where it said \"Ver 1.31\".\n\nEvery patch is applied only where the image holds the expected original\nbytes, and arnoldasr's code is first built as one of the builds he tested\nand checked against its hash.\n\nOur lzss_decode.py runs 54 bytes past the end of the packed stream, so\nmain_unpacked.bin is the 1.31 application plus a tail the firmware never\nreads; the application is cut back to its own length first.\n\"\"\"\nimport hashlib\nimport json\nimport os\nimpLine truncated
|
||||
+1
-1
@@ -30,7 +30,7 @@
|
||||
{ id: 'usbautoload', name: 'USB auto load', by: 'ours', state: 'experimental',
|
||||
what: 'MY SETTINGS on a stick loaded the moment the player finds them. UTILITY › USB AUTO LOAD.' },
|
||||
{ id: 'credit', name: 'Boot text', by: 'ours', state: 'stable',
|
||||
what: 'The boot screen says “Pionaarr Mods 1.0” instead of “Ver 1.31”.' }
|
||||
what: 'The boot screen says “Pionaarr Mods 1.8.1” instead of “Ver 1.31”.' }
|
||||
];
|
||||
var chosen = {};
|
||||
MODS.forEach(function (m) { chosen[m.id] = true; }); // every mod ticked at the start
|
||||
|
||||
+3
-3
@@ -6,9 +6,9 @@
|
||||
<title>Datenschutzerklärung · Pionaarr Mods</title>
|
||||
<meta name="description" content="Datenschutzerklärung von Pionaarr Mods.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
<title>Pionaarr Mods Docs</title>
|
||||
<meta name="description" content="How to build and install the CDJ-900NXS mods and how each one works, including the hot cue keys: play, gate, set and delete.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -217,8 +217,8 @@
|
||||
<figure class="shot"><img src="assets/utility-key.png" alt="UTILITY with KEY NOTATION"><figcaption>UTILITY › KEY NOTATION.</figcaption></figure>
|
||||
|
||||
<h2 id="credit">credit <span class="badge author">Pionaarr mod</span></h2>
|
||||
<p>The boot screen says <em>Pionaarr Mods 1.0</em> where it said <em>Ver 1.31</em>. Ticked at the start; untick it to keep the stock text. UTILITY and the LINK screen still show the real version, 1.31.</p>
|
||||
<figure class="shot"><img src="assets/boot-mods.png" alt="Boot screen with Pionaarr Mods 1.0"><figcaption>The boot screen.</figcaption></figure>
|
||||
<p>The boot screen says <em>Pionaarr Mods 1.8.1</em> where it said <em>Ver 1.31</em>. Ticked at the start; untick it to keep the stock text. UTILITY and the LINK screen still show the real version, 1.31.</p>
|
||||
<figure class="shot"><img src="assets/boot-mods.png" alt="Boot screen with Pionaarr Mods 1.8.1"><figcaption>The boot screen.</figcaption></figure>
|
||||
|
||||
<h2 id="cuenames">cuenames <span class="badge author">Pionaarr mod</span> <span class="state experimental">experimental</span></h2>
|
||||
<p>The comment a memory cue or hot cue has in rekordbox (the cue list's comment field, exported with the stick) appears in the title bar, right of the title, in the cue's colour: always the next cue ahead that has one, a hot cue with its letter ("A DROP"). A cue just passed shows for a second more, so a cue you CALL shows its name while you stand on it. Hidden while BROWSE is open; a long title is cut short before the name. Needs <code>cuecolours</code>.</p>
|
||||
@@ -275,7 +275,7 @@
|
||||
<h3>Do I need rekordbox?</h3>
|
||||
<p>Cue colours and hot cues come from a USB stick exported with rekordbox. Without them the mods show what the stock player shows.</p>
|
||||
<h3>Why is the version still 1.31?</h3>
|
||||
<p>The update file says 1.32 so the player installs it; the application inside still reports 1.31 (in UTILITY and on the LINK screen). Only the boot screen says <em>Pionaarr Mods 1.0</em> instead of <em>Ver 1.31</em>.</p>
|
||||
<p>The update file says 1.32 so the player installs it; the application inside still reports 1.31 (in UTILITY and on the LINK screen). Only the boot screen says <em>Pionaarr Mods 1.8.1</em> instead of <em>Ver 1.31</em>.</p>
|
||||
</article>
|
||||
</main>
|
||||
|
||||
|
||||
+3
-3
@@ -6,9 +6,9 @@
|
||||
<title>Impressum · Pionaarr Mods</title>
|
||||
<meta name="description" content="Impressum und Offenlegung von Pionaarr Mods.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
+5
-5
@@ -6,9 +6,9 @@
|
||||
<title>Pionaarr Mods</title>
|
||||
<meta name="description" content="Firmware mods for the Pioneer CDJ-900NXS (firmware 1.31): RGB waveform, extended BPM, phase meter, cue colours, hot cues on the beat divide keys and more — compared with stock, built in your browser.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -231,8 +231,8 @@
|
||||
<div class="meta"><span class="state stable">stable</span></div>
|
||||
</div>
|
||||
<div class="by">Pionaarr mod · <code>credit</code></div>
|
||||
<figure class="tshot"><img src="assets/card-boot.png" alt="Boot screen: Pionaarr Mods 1.0" loading="lazy"></figure>
|
||||
<p>The boot screen says <em>Pionaarr Mods 1.0</em>.</p>
|
||||
<figure class="tshot"><img src="assets/card-boot.png" alt="Boot screen: Pionaarr Mods 1.8.1" loading="lazy"></figure>
|
||||
<p>The boot screen says <em>Pionaarr Mods 1.8.1</em>.</p>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"_about": "The site's changelog, newest first. Versions follow Semantic Versioning (MAJOR.MINOR.PATCH), dates ISO 8601 (DIN EN 28601). make_builder_data.py adds every mod's current version from its module and writes assets/versions.js.",
|
||||
"site": [
|
||||
{
|
||||
"version": "1.8.1",
|
||||
"date": "2026-10-20",
|
||||
"changes": [
|
||||
"The boot screen names the release: Pionaarr Mods 1.8.1 (it said 1.0); from now on always the latest."
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "1.8.0",
|
||||
"date": "2026-10-20",
|
||||
@@ -325,6 +332,15 @@
|
||||
"Hot cue colours read correctly when a cue has a comment."
|
||||
]
|
||||
}
|
||||
],
|
||||
"credit": [
|
||||
{
|
||||
"version": "1.1.0",
|
||||
"date": "2026-10-20",
|
||||
"changes": [
|
||||
"The boot text carries the Pionaarr Mods release number, always the latest."
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -158,12 +158,30 @@ def python_bundle(repo):
|
||||
return out
|
||||
|
||||
|
||||
def set_release(repo):
|
||||
"""The boot screen (the credit mod) names the Pionaarr Mods release: always
|
||||
the site's version (tools/changelog.json), written into credit.py's
|
||||
RELEASE before anything is built."""
|
||||
import re
|
||||
with open(os.path.join(HERE, 'changelog.json'), encoding='utf-8') as f:
|
||||
site = json.load(f)['site'][0]['version']
|
||||
path = os.path.join(repo, 'mods', 'cdj900nxs', 'credit.py')
|
||||
with open(path, encoding='utf-8') as f:
|
||||
src = f.read()
|
||||
new = re.sub(r"^RELEASE = '[^']*'", "RELEASE = '%s'" % site, src, count=1, flags=re.M)
|
||||
if new != src:
|
||||
with open(path, 'w', encoding='utf-8', newline='\n') as f:
|
||||
f.write(new)
|
||||
print('set credit.RELEASE to %s (the boot screen)' % site)
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('--repo', default=os.path.join(os.path.dirname(WEB), 'CDJ900NXSVirtual'))
|
||||
args = ap.parse_args()
|
||||
sys.path.insert(0, os.path.join(args.repo, 'mods'))
|
||||
sys.path.insert(0, os.path.join(args.repo, 'mods', 'cdj900nxs'))
|
||||
set_release(args.repo)
|
||||
import patch_cdj900nxs as p
|
||||
import hotcuekeys as hk
|
||||
import cuecolours
|
||||
@@ -286,10 +304,19 @@ def write_versions(p):
|
||||
html = f.read()
|
||||
new = re.sub(r'(href|src)="((?:style\.css|script\.js|assets/versions\.js|builder/[a-z]+\.js))(\?v=[^"]*)?"',
|
||||
lambda m: '%s="%s?v=%s"' % (m.group(1), m.group(2), data['site']), html)
|
||||
new = re.sub(r'Pionaarr Mods \d+\.\d+(\.\d+)?', 'Pionaarr Mods ' + data['site'], new) # the boot text
|
||||
if new != html:
|
||||
with open(path, 'w', encoding='utf-8', newline='\n') as f:
|
||||
f.write(new)
|
||||
print('stamped %s with ?v=%s' % (name, data['site']))
|
||||
ui = os.path.join(WEB, 'builder', 'ui.js')
|
||||
with open(ui, encoding='utf-8') as f:
|
||||
js = f.read()
|
||||
new = re.sub(r'Pionaarr Mods \d+\.\d+(\.\d+)?', 'Pionaarr Mods ' + data['site'], js)
|
||||
if new != js:
|
||||
with open(ui, 'w', encoding='utf-8', newline='\n') as f:
|
||||
f.write(new)
|
||||
print('stamped builder/ui.js with Pionaarr Mods %s' % data['site'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
+3
-3
@@ -6,9 +6,9 @@
|
||||
<title>Pionaarr Mods Upcoming</title>
|
||||
<meta name="description" content="What comes next for the CDJ-900NXS mods: quick search, USB auto load, a reversed phase meter, stems and a 3-band waveform.">
|
||||
<link rel="icon" href="assets/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="style.css?v=1.8.0">
|
||||
<script src="assets/versions.js?v=1.8.0"></script>
|
||||
<script src="script.js?v=1.8.0"></script>
|
||||
<link rel="stylesheet" href="style.css?v=1.8.1">
|
||||
<script src="assets/versions.js?v=1.8.1"></script>
|
||||
<script src="script.js?v=1.8.1"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
Reference in new issue
Block a user