Build scripts
This commit is contained in:
1 parent
4f10991abc
commit
cee9f6a02f
18 files changed
+183
-338
No files matched your search
+21
@@ -0,0 +1,21 @@
|
|||||||
|
# Build artifacts
|
||||||
|
dist/
|
||||||
|
*.xpi
|
||||||
|
*.zip
|
||||||
|
|
||||||
|
# Node / package manager
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
|
||||||
|
# Local captures and temp files
|
||||||
|
*.har
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# OS / editor noise
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
*~
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) 2026 Splirate
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
@@ -1,65 +1,32 @@
|
|||||||
# Firefox Splice Download Helper
|
# Splirate
|
||||||
|
|
||||||
This Firefox extension captures Splice sample preview context from GraphQL responses, then attempts to download full-file URLs when available. If full retrieval is unavailable, it falls back to decoding preview audio bytes (splicedd-style) and downloads decoded MP3.
|
Allows you to download Splice samples from the browser by decrypting the preview audio.
|
||||||
|
|
||||||
## Features
|
I didn't read or write the code.
|
||||||
|
|
||||||
- Captures sample context from Splice GraphQL responses (`preview_mp3`, sample UUID/hash).
|
WTFPL licensed.
|
||||||
- Tracks observed audio sample URLs from network/probe fallback.
|
|
||||||
- Download action is orchestrated as:
|
|
||||||
1. Attempt full-file URL retrieval first.
|
|
||||||
2. If unavailable, decode scrambled preview bytes and download decoded MP3.
|
|
||||||
- Injects two controls in the target row:
|
|
||||||
- **Download**: full-first, decoded-preview fallback
|
|
||||||
- **History**: opens extension history page with past captured URLs
|
|
||||||
- Popup/history show each captured sample with source and mode hints.
|
|
||||||
|
|
||||||
## Targeted Page Element
|
|
||||||
|
|
||||||
Inline controls are injected into:
|
|
||||||
|
|
||||||
- `.playbar-playback-info-bar.playback-row-section.svelte-11gjrk3`
|
|
||||||
|
|
||||||
The inserted controls use sibling-style wrappers based on:
|
|
||||||
|
|
||||||
- `bordered-item meta-item svelte-11gjrk3`
|
|
||||||
|
|
||||||
## URL Rules
|
|
||||||
|
|
||||||
- Page scope: `*://*.splice.com/*`
|
|
||||||
- Audio sample paths include `/audio_samples/`
|
|
||||||
- Waveform files (`.wv.json`) are excluded from download candidates
|
|
||||||
|
|
||||||
## Load in Firefox (Temporary Add-on)
|
## Load in Firefox (Temporary Add-on)
|
||||||
|
|
||||||
1. Open `about:debugging#/runtime/this-firefox`
|
1. Open `about:debugging#/runtime/this-firefox`
|
||||||
2. Click **Load Temporary Add-on...**
|
2. Click **Load Temporary Add-on...**
|
||||||
3. Select this extension's `manifest.json`
|
3. Select this extension's `manifest.json`
|
||||||
4. Visit a matching `*.splice.com` page
|
4. Visit `https://splice.com/sounds/search/samples`
|
||||||
|
|
||||||
## Usage
|
## Build Firefox Package
|
||||||
|
|
||||||
1. Open a page under `*.splice.com` that loads S3 audio links.
|
1. From the project root, run either:
|
||||||
2. Wait for inline `Download` and `History` controls to appear in the playback info bar.
|
- `npm run build`
|
||||||
3. Click:
|
- `npm run build:xpi`
|
||||||
- **Download** to run full-first retrieval, then decode fallback if needed
|
- `bash scripts/build-firefox.sh`
|
||||||
- **History** to open full captured history
|
2. The packaged extension is created in:
|
||||||
4. Optionally click the extension icon to open popup for current-tab entries.
|
- `dist/splirate-firefox-v<version>.xpi`
|
||||||
|
|
||||||
## Manual Verification Checklist
|
## Install Locally in Firefox
|
||||||
|
|
||||||
- [ ] On matching domain, controls appear in target playback row.
|
1. Build the XPI: `npm run build:xpi`
|
||||||
- [ ] Controls remain after SPA/Svelte rerenders.
|
2. Open Firefox and go to `about:debugging#/runtime/this-firefox`
|
||||||
- [ ] GraphQL preview context is captured for visible samples.
|
3. Click **Load Temporary Add-on...**
|
||||||
- [ ] `Download` attempts full retrieval first.
|
4. Select `dist/splirate-firefox-v<version>.xpi`
|
||||||
- [ ] When full retrieval is unavailable, fallback decoded MP3 is downloaded and playable.
|
|
||||||
- [ ] `History` opens and allows downloading older entries.
|
|
||||||
- [ ] Popup updates with captured entries for active tab.
|
|
||||||
- [ ] Non-`*.splice.com` pages do not capture/store URLs.
|
|
||||||
|
|
||||||
## Known Limitations
|
Note: on standard Firefox, unsigned extensions are temporary via `about:debugging` and are removed on restart.
|
||||||
|
|
||||||
- Full-file URL retrieval depends on backend behavior and session state; it may fail for some assets.
|
|
||||||
- Fallback decode uses scrambled preview streams, so fallback output follows preview-source quality/availability.
|
|
||||||
- Signed preview URLs can expire; expired URLs require recapture.
|
|
||||||
- `saveAs: true` prompts download location each time by design.
|
|
||||||
+24
-4
@@ -4,7 +4,8 @@ const TAB_CAPTURED = new Map();
|
|||||||
const FULL_URL_BY_SAMPLE = new Map();
|
const FULL_URL_BY_SAMPLE = new Map();
|
||||||
const HISTORY_KEY = "capturedS3History";
|
const HISTORY_KEY = "capturedS3History";
|
||||||
const MAX_HISTORY_ITEMS = 500;
|
const MAX_HISTORY_ITEMS = 500;
|
||||||
const SPLICE_DOMAIN_RE = /^https?:\/\/([a-z0-9-]+\.)*splice\.com(\/|$)/i;
|
const TARGET_HOST = "splice.com";
|
||||||
|
const TARGET_PATH = "/sounds/search/samples";
|
||||||
const AUDIO_SAMPLE_PATH_RE = /\/audio_samples\//i;
|
const AUDIO_SAMPLE_PATH_RE = /\/audio_samples\//i;
|
||||||
const WAVEFORM_PATH_RE = /\.wv\.json$/i;
|
const WAVEFORM_PATH_RE = /\.wv\.json$/i;
|
||||||
const SCRAMBLED_PATH_RE = /-scrambled\//i;
|
const SCRAMBLED_PATH_RE = /-scrambled\//i;
|
||||||
@@ -12,7 +13,15 @@ const HASH_RE = /^[a-f0-9]{64}$/i;
|
|||||||
const GRAPHQL_URL = "https://surfaces-graphql.splice.com/graphql";
|
const GRAPHQL_URL = "https://surfaces-graphql.splice.com/graphql";
|
||||||
|
|
||||||
function isDomainAllowed(pageUrl) {
|
function isDomainAllowed(pageUrl) {
|
||||||
return typeof pageUrl === "string" && SPLICE_DOMAIN_RE.test(pageUrl);
|
if (typeof pageUrl !== "string") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const parsed = new URL(pageUrl);
|
||||||
|
return parsed.protocol === "https:" && parsed.hostname === TARGET_HOST && parsed.pathname === TARGET_PATH;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isS3Url(url) {
|
function isS3Url(url) {
|
||||||
@@ -825,8 +834,19 @@ function handleWebRequestCapture(details) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tabId = typeof details.tabId === "number" ? details.tabId : -1;
|
const tabId = typeof details.tabId === "number" ? details.tabId : -1;
|
||||||
const merged = upsertUrl(tabId, url, "webrequest");
|
if (tabId < 0) {
|
||||||
void merged;
|
return;
|
||||||
|
}
|
||||||
|
browser.tabs.get(tabId).then((tab) => {
|
||||||
|
const tabUrl = tab && typeof tab.url === "string" ? tab.url : "";
|
||||||
|
if (!isDomainAllowed(tabUrl)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const merged = upsertUrl(tabId, url, "webrequest");
|
||||||
|
void merged;
|
||||||
|
}).catch(() => {
|
||||||
|
// Ignore tab lookup failures.
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
browser.webRequest.onBeforeRequest.addListener(
|
browser.webRequest.onBeforeRequest.addListener(
|
||||||
|
|||||||
+12
-3
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
const TARGET_SELECTOR = ".playbar-playback-info-bar.playback-row-section.svelte-11gjrk3";
|
const TARGET_SELECTOR = ".playbar-playback-info-bar.playback-row-section.svelte-11gjrk3";
|
||||||
const INJECTED_CONTAINER_ID = "s3-audio-capture-controls";
|
const INJECTED_CONTAINER_ID = "s3-audio-capture-controls";
|
||||||
const SPLICE_DOMAIN_RE = /^https?:\/\/([a-z0-9-]+\.)*splice\.com(\/|$)/i;
|
const TARGET_HOST = "splice.com";
|
||||||
|
const TARGET_PATH = "/sounds/search/samples";
|
||||||
const PROBE_EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
const PROBE_EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
||||||
let knownUrls = new Set();
|
let knownUrls = new Set();
|
||||||
let knownPerformanceUrls = new Set();
|
let knownPerformanceUrls = new Set();
|
||||||
@@ -21,7 +22,15 @@ let lastPlaybackMetaSignature = "";
|
|||||||
let lastPlaybackMetaApplied = false;
|
let lastPlaybackMetaApplied = false;
|
||||||
|
|
||||||
function isDomainAllowed(url) {
|
function isDomainAllowed(url) {
|
||||||
return typeof url === "string" && SPLICE_DOMAIN_RE.test(url);
|
if (typeof url !== "string") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const parsed = new URL(url);
|
||||||
|
return parsed.protocol === "https:" && parsed.hostname === TARGET_HOST && parsed.pathname === TARGET_PATH;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isS3Url(url) {
|
function isS3Url(url) {
|
||||||
@@ -548,7 +557,7 @@ function ensureInlineStyles() {
|
|||||||
.s3-capture-button {
|
.s3-capture-button {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.25);
|
border: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: rgba(255, 255, 255, 0.08);
|
background: none !important;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
|
|||||||
+9
-1
@@ -12,7 +12,15 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
margin: 0 0 8px;
|
margin: 0;
|
||||||
|
font-size: 0;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-logo {
|
||||||
|
height: 34px;
|
||||||
|
width: auto;
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
|
|||||||
+3
-2
@@ -4,14 +4,15 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>S3 Audio Capture History</title>
|
<title>Splirate History</title>
|
||||||
|
<link rel="icon" type="image/png" href="logo-single.png">
|
||||||
<link rel="stylesheet" href="history.css">
|
<link rel="stylesheet" href="history.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<main class="history-page">
|
<main class="history-page">
|
||||||
<header>
|
<header>
|
||||||
<h1>S3 Audio Capture History</h1>
|
<h1><img class="brand-logo" src="logo.png" alt="Splirate"></h1>
|
||||||
</header>
|
</header>
|
||||||
<p id="status">Loading history...</p>
|
<p id="status">Loading history...</p>
|
||||||
<ul id="historyList"></ul>
|
<ul id="historyList"></ul>
|
||||||
|
|||||||
+2
-2
@@ -56,7 +56,7 @@ function buildItem(entry) {
|
|||||||
|
|
||||||
const cover = document.createElement("img");
|
const cover = document.createElement("img");
|
||||||
cover.className = "history-cover-image";
|
cover.className = "history-cover-image";
|
||||||
cover.src = entry.coverImageUrl || "icons/icon-48.png";
|
cover.src = entry.coverImageUrl || "logo-single.png";
|
||||||
cover.alt = "Cover art";
|
cover.alt = "Cover art";
|
||||||
cover.loading = "lazy";
|
cover.loading = "lazy";
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ async function loadHistory() {
|
|||||||
|
|
||||||
const rows = Array.isArray(response.history) ? response.history : [];
|
const rows = Array.isArray(response.history) ? response.history : [];
|
||||||
if (!rows.length) {
|
if (!rows.length) {
|
||||||
statusEl.textContent = "No captured S3 URLs yet.";
|
statusEl.textContent = "No captured samples yet.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
+15
-6
@@ -1,14 +1,19 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "Splice Downloader",
|
"name": "Splirate",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Capture Splice S3 audio links on matching pages and download them.",
|
"description": "Splirate captures Splice sample links and downloads playable audio.",
|
||||||
|
"icons": {
|
||||||
|
"48": "logo-single.png",
|
||||||
|
"96": "logo-single.png",
|
||||||
|
"128": "logo-single.png"
|
||||||
|
},
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"tabs",
|
"tabs",
|
||||||
"storage",
|
"storage",
|
||||||
"downloads",
|
"downloads",
|
||||||
"webRequest",
|
"webRequest",
|
||||||
"*://*.splice.com/*",
|
"https://splice.com/sounds/search/samples*",
|
||||||
"*://*.amazonaws.com/*",
|
"*://*.amazonaws.com/*",
|
||||||
"*://*.amazonaws.com.cn/*",
|
"*://*.amazonaws.com.cn/*",
|
||||||
"webNavigation"
|
"webNavigation"
|
||||||
@@ -21,7 +26,7 @@
|
|||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
"matches": [
|
"matches": [
|
||||||
"*://*.splice.com/*"
|
"https://splice.com/sounds/search/samples*"
|
||||||
],
|
],
|
||||||
"js": [
|
"js": [
|
||||||
"content-script.js"
|
"content-script.js"
|
||||||
@@ -30,7 +35,11 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"browser_action": {
|
"browser_action": {
|
||||||
"default_title": "S3 Audio Capture",
|
"default_title": "Splirate",
|
||||||
|
"default_icon": {
|
||||||
|
"48": "logo-single.png",
|
||||||
|
"96": "logo-single.png"
|
||||||
|
},
|
||||||
"default_popup": "popup.html"
|
"default_popup": "popup.html"
|
||||||
},
|
},
|
||||||
"web_accessible_resources": [
|
"web_accessible_resources": [
|
||||||
@@ -41,7 +50,7 @@
|
|||||||
],
|
],
|
||||||
"applications": {
|
"applications": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
"id": "s3-audio-capture@splice.local",
|
"id": "splirate@splice.local",
|
||||||
"strict_min_version": "109.0"
|
"strict_min_version": "109.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "splirate",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"description": "Splirate Firefox extension",
|
||||||
|
"scripts": {
|
||||||
|
"build": "bash scripts/build-firefox.sh",
|
||||||
|
"build:firefox": "bash scripts/build-firefox.sh",
|
||||||
|
"build:xpi": "bash scripts/build-firefox.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,9 +22,14 @@ body {
|
|||||||
|
|
||||||
.popup-header h1 {
|
.popup-header h1 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 15px;
|
font-size: 0;
|
||||||
font-weight: 600;
|
line-height: 1;
|
||||||
letter-spacing: 0.01em;
|
}
|
||||||
|
|
||||||
|
.brand-logo {
|
||||||
|
height: 30px;
|
||||||
|
width: auto;
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
#openHistoryBtn {
|
#openHistoryBtn {
|
||||||
|
|||||||
+3
-2
@@ -3,13 +3,14 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>S3 Audio Capture</title>
|
<title>Splirate</title>
|
||||||
|
<link rel="icon" type="image/png" href="logo-single.png">
|
||||||
<link rel="stylesheet" href="popup.css">
|
<link rel="stylesheet" href="popup.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main class="popup">
|
<main class="popup">
|
||||||
<header class="popup-header">
|
<header class="popup-header">
|
||||||
<h1>S3 Audio Capture</h1>
|
<h1><img class="brand-logo" src="logo.png" alt="Splirate"></h1>
|
||||||
<button id="openHistoryBtn" type="button">Open Full History</button>
|
<button id="openHistoryBtn" type="button">Open Full History</button>
|
||||||
</header>
|
</header>
|
||||||
<section>
|
<section>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ function buildRow(entry) {
|
|||||||
|
|
||||||
const cover = document.createElement("img");
|
const cover = document.createElement("img");
|
||||||
cover.className = "cover-image";
|
cover.className = "cover-image";
|
||||||
cover.src = entry.coverImageUrl || "icons/icon-48.png";
|
cover.src = entry.coverImageUrl || "logo-single.png";
|
||||||
cover.alt = "Cover art";
|
cover.alt = "Cover art";
|
||||||
cover.loading = "lazy";
|
cover.loading = "lazy";
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ async function loadCapturedUrls() {
|
|||||||
listEl.innerHTML = "";
|
listEl.innerHTML = "";
|
||||||
const entries = Array.isArray(response.entries) ? response.entries : [];
|
const entries = Array.isArray(response.entries) ? response.entries : [];
|
||||||
if (!entries.length) {
|
if (!entries.length) {
|
||||||
setStatus("No captured S3 URLs for this tab yet.");
|
setStatus("No captured samples for this tab yet.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-262
@@ -1,262 +0,0 @@
|
|||||||
{
|
|
||||||
"log": {
|
|
||||||
"version": "1.2",
|
|
||||||
"creator": {
|
|
||||||
"name": "Firefox",
|
|
||||||
"version": "153.0.1"
|
|
||||||
},
|
|
||||||
"browser": {
|
|
||||||
"name": "Firefox",
|
|
||||||
"version": "153.0.1"
|
|
||||||
},
|
|
||||||
"pages": [
|
|
||||||
{
|
|
||||||
"id": "page_2",
|
|
||||||
"pageTimings": {
|
|
||||||
"onContentLoad": 1056,
|
|
||||||
"onLoad": 1662
|
|
||||||
},
|
|
||||||
"startedDateTime": "2026-08-05T22:32:29.766-05:00",
|
|
||||||
"title": "https://splice.com/sounds/search/samples?filepath=vocals&ac_uuid=1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"entries": [
|
|
||||||
{
|
|
||||||
"startedDateTime": "2026-08-05T22:32:29.766-05:00",
|
|
||||||
"request": {
|
|
||||||
"bodySize": 4868,
|
|
||||||
"method": "POST",
|
|
||||||
"url": "https://surfaces-graphql.splice.com/graphql",
|
|
||||||
"httpVersion": "HTTP/3",
|
|
||||||
"headers": [
|
|
||||||
{
|
|
||||||
"name": "Host",
|
|
||||||
"value": "surfaces-graphql.splice.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "User-Agent",
|
|
||||||
"value": "Mozilla/5.0 (X11; Linux x86_64; rv:153.0) Gecko/20100101 Firefox/153.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Accept",
|
|
||||||
"value": "*/*; xsrf=XaSybwgpoG7a_z6FKp6wTxaW-5M:1785987149466"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Accept-Language",
|
|
||||||
"value": "en-US,en;q=0.9"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Accept-Encoding",
|
|
||||||
"value": "gzip, deflate, br, zstd"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Referer",
|
|
||||||
"value": "https://splice.com/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "content-type",
|
|
||||||
"value": "application/json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x-anonymous-id",
|
|
||||||
"value": "02861122-ac67-4710-9d67-178eeb682292"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "authorization",
|
|
||||||
"value": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjR0NDJqSk1mV1YwaDk0eU9nTy1lQiJ9.eyJodHRwczovL3NwbGljZS5jb20vdXNlcl91dWlkIjoiYjEyNGI0ZDctYTAwYi00YTJhLThiNjEtODRiMzcxMDgwOGE0IiwiaXNzIjoiaHR0cHM6Ly9hdXRoLnNwbGljZS5jb20vIiwic3ViIjoiYXV0aDB8c3BsaWNlLWFwaXxiMTI0YjRkNy1hMDBiLTRhMmEtOGI2MS04NGIzNzEwODA4YTQiLCJhdWQiOlsiaHR0cHM6Ly9zcGxpY2UuY29tIiwiaHR0cHM6Ly9zcGxpY2UtcHJvZHVjdGlvbi51cy5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzg1OTgzODUxLCJleHAiOjE3ODU5ODc0NTEsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhenAiOiJKNUpWQ0drSm10b001ZWlJOExHa1B1bWE5M2V4UVY4SCJ9.gpaHLbF6Jq_2NcQG-Ej-AKXP03OuhTibAxI8NWWMVq6ziIKQL3Y4uuiebm7JoE8fPNq-2rkvOXIy0xVsjkTqq9QwU9W2AuGX5DKYUI3fupgekRXGUt9xcGrAUf7DnjBfQtpHmkaJF6X-Zl0tZFSg_ERwPvWaUfGH_mowUN7Isuk-kWSwq8a-mSMNG4HHtk9RI4VhALA37y3ya11zf1fwUOaxWvfaeYSpxYpO6Fsa1cRXEYIrdNFe4XkYtMVxTzaJIKxQRnqUGNEcU3X0pbY8eOeNRBsfTgJxyLJuMZmEl2qGqzxUHdnGGMIVALmrsmZg6j6HR1xHX6_7posLi4w-2Q"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Content-Length",
|
|
||||||
"value": "4868"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Origin",
|
|
||||||
"value": "https://splice.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sec-GPC",
|
|
||||||
"value": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Connection",
|
|
||||||
"value": "keep-alive"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Cookie",
|
|
||||||
"value": "ajs_anonymous_id=02861122-ac67-4710-9d67-178eeb682292; cf_clearance=iRZiYYlp7A8nHXmfZfAvDLGMALSVzxN.HS8CGYBfPOk-1785986519-1.2.1.1-sL9zV9NysYUqns_nol5Bj3WcAyHqeZagQdGdJ3UQY6uNdSuwyXJgKFdkj0E2MBIDkAgI6uyw6Xwz.ZVmdcVhGZ8EMTkCI1C84ATRy64gZv06ep9JpZBaoG4FTir3jGgNYp.if7CM7A6HrsKXp3jxigV30qSQWn1.IHBti4JitNyCixdx5TBcben5ax_2xHXslBE2rZAKlxLyU2TkVZbTS2k7ZAyoqd63pRnRsDGKfOXlQUl6Cko9bZI54dH4qGBtt7o.Z6Hiqvz0kniC1wvNui66vli.cDImz_Ac1bOHwAeGPzEMfKMU4DsamCx_e7hJOSsZHaHxInrwDJ1_Q2DaIrUeCtNmDatOlc1OiZj3ioQ; CookieScriptConsent=%7B%22googleconsentmap%22%3A%7B%22ad_storage%22%3A%22targeting%22%2C%22analytics_storage%22%3A%22performance%22%2C%22ad_personalization%22%3A%22targeting%22%2C%22ad_user_data%22%3A%22targeting%22%2C%22functionality_storage%22%3A%22functionality%22%2C%22personalization_storage%22%3A%22functionality%22%2C%22security_storage%22%3A%22functionality%22%7D%2C%22bannershown%22%3A1%2C%22action%22%3A%22reject%22%2C%22consenttime%22%3A1759848972%2C%22categories%22%3A%22%5B%5D%22%7D; ajs_user_id=9005369; anonymousUserID=02861122-ac67-4710-9d67-178eeb682292; _cfuvid=fuWA5nFWqCEHZk503.Ed5H_jlnBUr7ggVjtjwDu_L0Y-1785877291.1770334-1.0.1.1-GlEsnrCCQ8HpaecQ18ozlx69v_AdARs108jnSR0k38Y; __cf_bm=7jPDUl2GzzSz2eD58uIIE5EeJu8.vr7VSkKlk5pkRU4-1785986519.1329608-1.0.1.1-WVMU9LY4D0bRLTH6UCkY4KYItowTeQ2THnqdwDfmTT.e57gWzwh64JR8h25Ky0oyXJf1s35GFt2o4pTd4iGhhvTlTxYl4oh1iAI.2DIDN_KgedPTlwuZMDTigynr0AW70mD89q._12.9uELdkDfKcQ; _splice_token_prod=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjR0NDJqSk1mV1YwaDk0eU9nTy1lQiJ9.eyJodHRwczovL3NwbGljZS5jb20vdXNlcl91dWlkIjoiYjEyNGI0ZDctYTAwYi00YTJhLThiNjEtODRiMzcxMDgwOGE0IiwiaXNzIjoiaHR0cHM6Ly9hdXRoLnNwbGljZS5jb20vIiwic3ViIjoiYXV0aDB8c3BsaWNlLWFwaXxiMTI0YjRkNy1hMDBiLTRhMmEtOGI2MS04NGIzNzEwODA4YTQiLCJhdWQiOlsiaHR0cHM6Ly9zcGxpY2UuY29tIiwiaHR0cHM6Ly9zcGxpY2UtcHJvZHVjdGlvbi51cy5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzg1OTgzODUxLCJleHAiOjE3ODU5ODc0NTEsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhenAiOiJKNUpWQ0drSm10b001ZWlJOExHa1B1bWE5M2V4UVY4SCJ9.gpaHLbF6Jq_2NcQG-Ej-AKXP03OuhTibAxI8NWWMVq6ziIKQL3Y4uuiebm7JoE8fPNq-2rkvOXIy0xVsjkTqq9QwU9W2AuGX5DKYUI3fupgekRXGUt9xcGrAUf7DnjBfQtpHmkaJF6X-Zl0tZFSg_ERwPvWaUfGH_mowUN7Isuk-kWSwq8a-mSMNG4HHtk9RI4VhALA37y3ya11zf1fwUOaxWvfaeYSpxYpO6Fsa1cRXEYIrdNFe4XkYtMVxTzaJIKxQRnqUGNEcU3X0pbY8eOeNRBsfTgJxyLJuMZmEl2qGqzxUHdnGGMIVALmrsmZg6j6HR1xHX6_7posLi4w-2Q; XSRF-TOKEN=XaSybwgpoG7a_z6FKp6wTxaW-5M%3A1785987149466"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sec-Fetch-Dest",
|
|
||||||
"value": "empty"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sec-Fetch-Mode",
|
|
||||||
"value": "cors"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Sec-Fetch-Site",
|
|
||||||
"value": "same-site"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Priority",
|
|
||||||
"value": "u=4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Pragma",
|
|
||||||
"value": "no-cache"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Cache-Control",
|
|
||||||
"value": "no-cache"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "TE",
|
|
||||||
"value": "trailers"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"cookies": [
|
|
||||||
{
|
|
||||||
"name": "ajs_anonymous_id",
|
|
||||||
"value": "02861122-ac67-4710-9d67-178eeb682292"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cf_clearance",
|
|
||||||
"value": "iRZiYYlp7A8nHXmfZfAvDLGMALSVzxN.HS8CGYBfPOk-1785986519-1.2.1.1-sL9zV9NysYUqns_nol5Bj3WcAyHqeZagQdGdJ3UQY6uNdSuwyXJgKFdkj0E2MBIDkAgI6uyw6Xwz.ZVmdcVhGZ8EMTkCI1C84ATRy64gZv06ep9JpZBaoG4FTir3jGgNYp.if7CM7A6HrsKXp3jxigV30qSQWn1.IHBti4JitNyCixdx5TBcben5ax_2xHXslBE2rZAKlxLyU2TkVZbTS2k7ZAyoqd63pRnRsDGKfOXlQUl6Cko9bZI54dH4qGBtt7o.Z6Hiqvz0kniC1wvNui66vli.cDImz_Ac1bOHwAeGPzEMfKMU4DsamCx_e7hJOSsZHaHxInrwDJ1_Q2DaIrUeCtNmDatOlc1OiZj3ioQ"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "CookieScriptConsent",
|
|
||||||
"value": "{\"googleconsentmap\":{\"ad_storage\":\"targeting\",\"analytics_storage\":\"performance\",\"ad_personalization\":\"targeting\",\"ad_user_data\":\"targeting\",\"functionality_storage\":\"functionality\",\"personalization_storage\":\"functionality\",\"security_storage\":\"functionality\"},\"bannershown\":1,\"action\":\"reject\",\"consenttime\":1759848972,\"categories\":\"[]\"}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ajs_user_id",
|
|
||||||
"value": "9005369"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "anonymousUserID",
|
|
||||||
"value": "02861122-ac67-4710-9d67-178eeb682292"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "_cfuvid",
|
|
||||||
"value": "fuWA5nFWqCEHZk503.Ed5H_jlnBUr7ggVjtjwDu_L0Y-1785877291.1770334-1.0.1.1-GlEsnrCCQ8HpaecQ18ozlx69v_AdARs108jnSR0k38Y"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "__cf_bm",
|
|
||||||
"value": "7jPDUl2GzzSz2eD58uIIE5EeJu8.vr7VSkKlk5pkRU4-1785986519.1329608-1.0.1.1-WVMU9LY4D0bRLTH6UCkY4KYItowTeQ2THnqdwDfmTT.e57gWzwh64JR8h25Ky0oyXJf1s35GFt2o4pTd4iGhhvTlTxYl4oh1iAI.2DIDN_KgedPTlwuZMDTigynr0AW70mD89q._12.9uELdkDfKcQ"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "_splice_token_prod",
|
|
||||||
"value": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjR0NDJqSk1mV1YwaDk0eU9nTy1lQiJ9.eyJodHRwczovL3NwbGljZS5jb20vdXNlcl91dWlkIjoiYjEyNGI0ZDctYTAwYi00YTJhLThiNjEtODRiMzcxMDgwOGE0IiwiaXNzIjoiaHR0cHM6Ly9hdXRoLnNwbGljZS5jb20vIiwic3ViIjoiYXV0aDB8c3BsaWNlLWFwaXxiMTI0YjRkNy1hMDBiLTRhMmEtOGI2MS04NGIzNzEwODA4YTQiLCJhdWQiOlsiaHR0cHM6Ly9zcGxpY2UuY29tIiwiaHR0cHM6Ly9zcGxpY2UtcHJvZHVjdGlvbi51cy5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzg1OTgzODUxLCJleHAiOjE3ODU5ODc0NTEsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhenAiOiJKNUpWQ0drSm10b001ZWlJOExHa1B1bWE5M2V4UVY4SCJ9.gpaHLbF6Jq_2NcQG-Ej-AKXP03OuhTibAxI8NWWMVq6ziIKQL3Y4uuiebm7JoE8fPNq-2rkvOXIy0xVsjkTqq9QwU9W2AuGX5DKYUI3fupgekRXGUt9xcGrAUf7DnjBfQtpHmkaJF6X-Zl0tZFSg_ERwPvWaUfGH_mowUN7Isuk-kWSwq8a-mSMNG4HHtk9RI4VhALA37y3ya11zf1fwUOaxWvfaeYSpxYpO6Fsa1cRXEYIrdNFe4XkYtMVxTzaJIKxQRnqUGNEcU3X0pbY8eOeNRBsfTgJxyLJuMZmEl2qGqzxUHdnGGMIVALmrsmZg6j6HR1xHX6_7posLi4w-2Q"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "XSRF-TOKEN",
|
|
||||||
"value": "XaSybwgpoG7a_z6FKp6wTxaW-5M:1785987149466"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"queryString": [],
|
|
||||||
"headersSize": 3961,
|
|
||||||
"postData": {
|
|
||||||
"mimeType": "application/json",
|
|
||||||
"params": [],
|
|
||||||
"text": "{\"operationName\":\"SamplesSearch\",\"variables\":{\"order\":\"DESC\",\"sort\":\"popularity\",\"limit\":50,\"page\":1,\"tags\":[],\"key\":null,\"chord_type\":null,\"bpm\":null,\"min_bpm\":null,\"max_bpm\":null,\"asset_category_slug\":null,\"random_seed\":null,\"attributes\":[],\"filepath\":\"vocals\",\"query\":\"vocals\",\"ac_uuid\":\"1\"},\"extensions\":{\"clientLibrary\":{\"name\":\"@apollo/client\",\"version\":\"4.1.9\"}},\"query\":\"query SamplesSearch($attributes: [AssetAttributeSlug!], $parent_asset_uuid: GUID, $query: String, $order: SortOrder = DESC, $sort: AssetSortType = popularity, $random_seed: String, $tags: [ID], $key: String, $chord_type: String, $bpm: String, $min_bpm: Int, $max_bpm: Int, $limit: Int = 50, $asset_category_slug: AssetCategorySlug, $page: Int = 1, $ac_uuid: String, $parent_asset_type: AssetTypeSlug, $licensed: Boolean, $liked: Boolean, $filepath: String) {\\n assetsSearch(\\n filter: {attributes: $attributes, legacy: true, published: true, asset_type_slug: sample, query: $query, filepath: $filepath, tag_ids: $tags, key: $key, chord_type: $chord_type, bpm: $bpm, min_bpm: $min_bpm, max_bpm: $max_bpm, asset_category_slug: $asset_category_slug, ac_uuid: $ac_uuid, licensed: $licensed, liked: $liked}\\n children: {parent_asset_uuid: $parent_asset_uuid}\\n pagination: {page: $page, limit: $limit}\\n sort: {sort: $sort, order: $order, random_seed: $random_seed}\\n legacy: {parent_asset_type: $parent_asset_type}\\n ) {\\n ...assetDetails\\n __typename\\n }\\n}\\n\\nfragment assetDetails on AssetPage {\\n ...assetPageItems\\n ...assetTagSummaries\\n pagination_metadata {\\n currentPage\\n totalPages\\n __typename\\n }\\n response_metadata {\\n records\\n __typename\\n }\\n __typename\\n}\\n\\nfragment assetPageItems on AssetPage {\\n items {\\n ... on IAsset {\\n asset_type_slug\\n liked\\n licensed\\n asset_prices {\\n amount\\n currency\\n __typename\\n }\\n uuid\\n name\\n tags {\\n uuid\\n label\\n __typename\\n }\\n files {\\n uuid\\n name\\n hash\\n path\\n asset_file_type_slug\\n url\\n __typename\\n }\\n __typename\\n }\\n ... on IAssetChild {\\n parents(filter: {asset_type_slug: pack}) {\\n items {\\n ... on PackAsset {\\n permalink_slug\\n permalink_base_url\\n uuid\\n name\\n files {\\n uuid\\n path\\n asset_file_type_slug\\n url\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ... on SampleAsset {\\n bpm\\n chord_type\\n key\\n duration\\n uuid\\n name\\n asset_category_slug\\n catalog_uuid\\n attributes\\n __typename\\n }\\n ... on GeneratedSampleAsset {\\n bpm\\n chord_type\\n key\\n duration\\n uuid\\n name\\n asset_category_slug\\n catalog_uuid\\n attributes\\n created_at\\n sampleParent: parents(filter: {asset_type_slug: sample}) {\\n items {\\n ... on SampleAsset {\\n catalog_uuid\\n parents(filter: {asset_type_slug: pack}) {\\n items {\\n ... on PackAsset {\\n uuid\\n name\\n permalink_slug\\n permalink_base_url\\n files {\\n uuid\\n path\\n asset_file_type_slug\\n url\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ... on PresetAsset {\\n uuid\\n name\\n catalog_uuid\\n attributes\\n asset_devices {\\n uuid\\n device {\\n name\\n uuid\\n minimum_device_version\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ... on PackAsset {\\n uuid\\n name\\n catalog_uuid\\n provider {\\n name\\n permalink_slug\\n __typename\\n }\\n provider_uuid\\n uuid\\n permalink_slug\\n permalink_base_url\\n main_genre\\n __typename\\n }\\n ... on MidiAsset {\\n catalog_uuid\\n description\\n key\\n bpm\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment assetTagSummaries on AssetPage {\\n tag_summary {\\n count\\n tag {\\n uuid\\n label\\Line truncated
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"status": 200,
|
|
||||||
"statusText": "",
|
|
||||||
"httpVersion": "HTTP/3",
|
|
||||||
"headers": [
|
|
||||||
{
|
|
||||||
"name": "date",
|
|
||||||
"value": "Thu, 06 Aug 2026 03:32:30 GMT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "content-type",
|
|
||||||
"value": "application/json; charset=utf-8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x-powered-by",
|
|
||||||
"value": "Express"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "x-request-id",
|
|
||||||
"value": "c8188e37-5186-4b99-987b-20bb08fa2cc2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "access-control-allow-origin",
|
|
||||||
"value": "https://splice.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vary",
|
|
||||||
"value": "Origin, Accept-Encoding"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "access-control-allow-credentials",
|
|
||||||
"value": "true"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cache-control",
|
|
||||||
"value": "no-store"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "etag",
|
|
||||||
"value": "W/\"3b072-s8bER6bUHsh9U+wF5xW182r0skQ\""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "content-encoding",
|
|
||||||
"value": "br"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "priority",
|
|
||||||
"value": "u=4,i=?0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cf-cache-status",
|
|
||||||
"value": "DYNAMIC"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "server",
|
|
||||||
"value": "cloudflare"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "cf-ray",
|
|
||||||
"value": "a26af9870e23a1df-MSP"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "alt-svc",
|
|
||||||
"value": "h3=\":443\"; ma=86400"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "server-timing",
|
|
||||||
"value": "cfExtPri"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"cookies": [],
|
|
||||||
"content": {
|
|
||||||
"mimeType": "application/json; charset=utf-8",
|
|
||||||
"size": 24817,
|
|
||||||
"text": "{\"data\":{\"assetsSearch\":{\"items\":[{\"asset_type_slug\":\"sample\",\"liked\":false,\"licensed\":false,\"asset_prices\":[{\"amount\":1,\"currency\":\"Credits\",\"__typename\":\"Price\"}],\"uuid\":\"60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6\",\"name\":\"VOX_-_Serum_2_Minimal_Deep_Tech_House/loops/hooks/VOX_MDTH_130_vocal_hook_wet_alright_natural_Gmin.wav\",\"tags\":[{\"uuid\":\"8d201ce4-4a78-4684-8afd-467fa2ea109c\",\"label\":\"vocals\",\"__typename\":\"Tag\"},{\"uuid\":\"17a74e87-ed5b-4d27-ab49-0753aa28302d\",\"label\":\"house\",\"__typename\":\"Tag\"},{\"uuid\":\"0da93a8a-7feb-4f5d-915c-536e5047ee8e\",\"label\":\"tech house\",\"__typename\":\"Tag\"},{\"uuid\":\"4a3ee9c8-2289-4a70-b61c-48d722c8ebbc\",\"label\":\"wet\",\"__typename\":\"Tag\"},{\"uuid\":\"f136a231-7037-4c27-95f8-dd528b50e824\",\"label\":\"pop\",\"__typename\":\"Tag\"},{\"uuid\":\"e28f332e-8ecc-44f6-b0be-7026eed2d492\",\"label\":\"hooks\",\"__typename\":\"Tag\"},{\"uuid\":\"21342ac6-6f8c-4f2f-90f5-3991aa50d7e0\",\"label\":\"minimal techno\",\"__typename\":\"Tag\"},{\"uuid\":\"7e20fe90-1cb4-47dc-8bcd-632025f953c3\",\"label\":\"melodic techno\",\"__typename\":\"Tag\"}],\"files\":[{\"uuid\":\"dc37ad93-6df3-45ed-b034-971fd24182cb\",\"name\":\"\",\"hash\":\"\",\"path\":\"audio_samples/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6-scrambled/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6.mp3\",\"asset_file_type_slug\":\"preview_mp3\",\"url\":\"https://spliceproduction.s3.us-west-1.amazonaws.com/audio_samples/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6-scrambled/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6.mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Checksum-Mode=ENABLED&X-Amz-Credential=ASIARXANDEUA2DP7PTV4%2F20260806%2Fus-west-1%2Fs3%2Faws4_request&X-Amz-Date=20260806T033230Z&X-Amz-Expires=21600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEGkaCXVzLXdlc3QtMSJHMEUCIDPkK0JsD6WD40HYfJ4aP23t3KOYf2QsZ1AqePDUvFb7AiEA1NFjckOLw5cc9GxzZwtRqo%2BpI8xnoQWn4gBUU%2FGO3Wgq6wMIMhAAGgwxMTgxMzkwNjk2OTciDL2iVGlcBI4%2BPVGf6irIA9I6JiQ08Aabdm4ASsud4546i1fYKQr7LEjZ2G%2F%2BU6xCol7sYr1bZQaAuUfdjE857yRceYG8vVgB6fvSA66Sry3WV%2FoyvvsUMlJUrhd%2FyrGTG6tP1mNHcYiAbnrIMQIATTd781f7B7jAXY%2BOsGbXA5BeIUvXYR37%2FOFti1Z32S8UWEVA8xdHSS3pbCBVcn5NpWH%2Bhi0YXBMPeoDh1aKvsfErBH3a%2FtHF%2B0PO9ELgQhbWYK6hliShCrPokrnqka1jyuP1YiGqL2a%2FoOYX8DYTSiBOSlTZL1IUPzb1x8ubtHcTph%2FZiuvyYdGXo5xR%2FPVzHnvyGp21fckXUwFvjQcGfIVpWHTPEYG7R6nShfsj4tCsvpDMYWs6hgqXgI4qBIzeDl1cXMvL5YjfWheVnJuHeDpG3NUcdnzyRWDiy4QA2cxORwzCSjmiZHD67%2B5Q0dZ0ltHc462Yz6Dc8uRTAa8ETMSlmP6X%2Fs5Fa%2BZTNTgF4wBS7UhsdsR9M1Aw0FmP2ID7Z7VkOimSNs7vfJ49Vk16S0EItWrWyo62EUE3I3xkMnlFnIwIV0VBLKkQWUmeQ4%2F2LTIvSBKZcMQ6Oba6yzukkGMn10VKhFLRyjC7rc%2FTBjqlAeGOQRpOa%2BtlzHgyeCjIh1xxdQt%2FLOAkBU7ig%2FZUbRb64T4K2UXgZhnZaEIF4yvUEcYqIyl%2FwPDXvubFLaZc2OI06ZSgRFaDFXnS5yc6uIsQOwMXKZWqxj%2FpnQnRaMSAGMSWGug%2ByO%2F3lNH%2FUjb6OUAcwLg4%2Fwbixva0whxunoWwLS5ZNw5laFIv7M7dmxNl5%2BZKcLUinbSxsqLO%2FdMD4NqRufBqpw%3D%3D&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=717f2fc41be1924c2596f2927c3a9112e1c7cd918bf733885dd9278acb62f9d3\",\"__typename\":\"AssetFile\"},{\"uuid\":\"038202f7-82e1-483f-bc60-85c3278236db\",\"name\":\"\",\"hash\":\"\",\"path\":\"audio_samples/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6.wv.json\",\"asset_file_type_slug\":\"waveform\",\"url\":\"https://s3-us-west-1.amazonaws.com/spliceblob.splice.com/audio_samples/60b2665a47d11b50a47ed7e31ee669a43a803d08f148b467b94af55fc85eaff6.wv.json\",\"__typename\":\"AssetFile\"}],\"__typename\":\"SampleAsset\",\"parents\":{\"items\":[{\"permalink_slug\":\"serum-2-minimal-deep-tech-house\",\"permalink_base_url\":\"vox\",\"uuid\":\"fc0c81b7-7773-4e73-a4a7-f9b3cba33357\",\"name\":\"Serum 2 Minimal Deep Tech House\",\"files\":[{\"uuid\":\"3fb3e709-d40b-44c1-93e6-e41fbca52133\",\"path\":\"v1783966849/dtmannyprp6ntlzljzsy.jpg\",\"asset_file_type_slug\":\"cover_image\",\"url\":\"https://splice-res.cloudinary.com/image/upload/f_auto,q_auto,w_auto/c_limit,w_450/v1783966849/dtmannyprp6ntlzljzsy.jpg\",\"__typename\":\"AssetFile\"},{\"uuid\":\"5c0fac7e-853d-46a6-9a9a-222e8c0b7749\",\"path\":\"\",\"asset_file_type_slug\":\"demo_mp3\",\"url\":\"https://s3-us-west-1.amazonaws.com/spliceblob.splice.com/sample_pack_demos/348cf8a0-ac71-4a3e-bd51-949beadafcb3/demo.mp3\",\"__typename\":\"AssetFile\"},{\"uuid\":\"70660a89-10f9-4231-b48f-47e9e623d30b\",\"path\":\"\",\"asset_file_type_slug\":\"preview_mp3\",\"url\":\"https://s3-us-west-1.amazonaws.com/spliceblob.splice.com/sample_pack_demos/348cf8a0-ac71-4a3e-bd51-949beadafcb3/demo.mp3\",\"__typename\":\"AssetFile\"}],\"__typename\":\"PackAsset\"}],\"__typename\":\"AssetPage\"},\"bpm\":130,\"chord_type\":\"minor\",\"key\":\"g\",\"duration\":16615,\"asset_category_slug\":\"loop\",\"catalog_uuid\":\"7afca6ab-6117-4c75-b969-d60cd99f8f02\",\"attributes\":[]},{\"asset_type_slug\":\"sample\",\"liked\":false,\"licensed\":false,\"asset_prices\":[{\"amounLine truncated
|
|
||||||
},
|
|
||||||
"redirectURL": "",
|
|
||||||
"headersSize": 537,
|
|
||||||
"bodySize": 25354
|
|
||||||
},
|
|
||||||
"cache": {},
|
|
||||||
"timings": {
|
|
||||||
"blocked": 0,
|
|
||||||
"dns": 0,
|
|
||||||
"connect": 0,
|
|
||||||
"ssl": 0,
|
|
||||||
"send": 0,
|
|
||||||
"wait": 405,
|
|
||||||
"receive": 2
|
|
||||||
},
|
|
||||||
"time": 407,
|
|
||||||
"_securityState": "secure",
|
|
||||||
"_priority": "Normal",
|
|
||||||
"serverIPAddress": "104.16.4.22",
|
|
||||||
"connection": "443",
|
|
||||||
"pageref": "page_2"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Executable
+42
@@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
DIST_DIR="${ROOT_DIR}/dist"
|
||||||
|
MANIFEST_PATH="${ROOT_DIR}/manifest.json"
|
||||||
|
|
||||||
|
if [[ ! -f "${MANIFEST_PATH}" ]]; then
|
||||||
|
echo "manifest.json not found at ${MANIFEST_PATH}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v zip >/dev/null 2>&1; then
|
||||||
|
echo "zip command is required but not installed." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION="$(sed -n 's/^[[:space:]]*"version":[[:space:]]*"\([^"]*\)".*/\1/p' "${MANIFEST_PATH}" | head -n 1)"
|
||||||
|
if [[ -z "${VERSION}" ]]; then
|
||||||
|
echo "Unable to read version from manifest.json" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARTIFACT_NAME="splirate-firefox-v${VERSION}.xpi"
|
||||||
|
ARTIFACT_PATH="${DIST_DIR}/${ARTIFACT_NAME}"
|
||||||
|
|
||||||
|
mkdir -p "${DIST_DIR}"
|
||||||
|
rm -f "${ARTIFACT_PATH}"
|
||||||
|
|
||||||
|
cd "${ROOT_DIR}"
|
||||||
|
|
||||||
|
zip -r "${ARTIFACT_PATH}" . \
|
||||||
|
-x ".git/*" \
|
||||||
|
-x ".DS_Store" \
|
||||||
|
-x "dist/*" \
|
||||||
|
-x "scripts/*" \
|
||||||
|
-x "*.har" \
|
||||||
|
-x "*.tmp" \
|
||||||
|
-x "*.log"
|
||||||
|
|
||||||
|
echo "Built Firefox extension package:"
|
||||||
|
echo "${ARTIFACT_PATH}"
|
||||||
Reference in new issue
Block a user