Capturing pack and cover
This commit is contained in:
1 parent
235f76a124
commit
47871d4bc5
6 files changed
+490
-86
No files matched your search
+20
-28
@@ -10,8 +10,6 @@ const WAVEFORM_PATH_RE = /\.wv\.json$/i;
|
|||||||
const SCRAMBLED_PATH_RE = /-scrambled\//i;
|
const SCRAMBLED_PATH_RE = /-scrambled\//i;
|
||||||
const HASH_RE = /^[a-f0-9]{64}$/i;
|
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";
|
||||||
const DEBUG_TRACE = true;
|
|
||||||
const DEBUG_TRACE_MARKER = "S3DBG_MAPTRACE_V1";
|
|
||||||
|
|
||||||
function isDomainAllowed(pageUrl) {
|
function isDomainAllowed(pageUrl) {
|
||||||
return typeof pageUrl === "string" && SPLICE_DOMAIN_RE.test(pageUrl);
|
return typeof pageUrl === "string" && SPLICE_DOMAIN_RE.test(pageUrl);
|
||||||
@@ -81,24 +79,6 @@ function normalizeName(value) {
|
|||||||
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function debugMapTrace(stage, entry) {
|
|
||||||
if (!DEBUG_TRACE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const safe = entry && typeof entry === "object" ? entry : {};
|
|
||||||
console.debug(DEBUG_TRACE_MARKER, stage, {
|
|
||||||
sampleId: safe.sampleId || "",
|
|
||||||
fileName: safe.fileName || "",
|
|
||||||
key: safe.key || "",
|
|
||||||
bpm: safe.bpm || "",
|
|
||||||
tagsCount: Array.isArray(safe.tags) ? safe.tags.length : 0,
|
|
||||||
coverImageUrl: safe.coverImageUrl || "",
|
|
||||||
previewUrl: safe.previewUrl || "",
|
|
||||||
fullUrl: safe.fullUrl || "",
|
|
||||||
source: safe.source || ""
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractSampleIdFromUrl(url) {
|
function extractSampleIdFromUrl(url) {
|
||||||
try {
|
try {
|
||||||
const parsed = new URL(url);
|
const parsed = new URL(url);
|
||||||
@@ -164,6 +144,7 @@ function mergeEntry(tabState, inputEntry, source, options) {
|
|||||||
previewUrl: "",
|
previewUrl: "",
|
||||||
fullUrl: "",
|
fullUrl: "",
|
||||||
fileName: "",
|
fileName: "",
|
||||||
|
packName: "",
|
||||||
key: "",
|
key: "",
|
||||||
bpm: "",
|
bpm: "",
|
||||||
tags: [],
|
tags: [],
|
||||||
@@ -191,6 +172,9 @@ function mergeEntry(tabState, inputEntry, source, options) {
|
|||||||
if (inputEntry.fileName) {
|
if (inputEntry.fileName) {
|
||||||
merged.fileName = String(inputEntry.fileName).trim();
|
merged.fileName = String(inputEntry.fileName).trim();
|
||||||
}
|
}
|
||||||
|
if (typeof inputEntry.packName === "string" && inputEntry.packName.trim()) {
|
||||||
|
merged.packName = inputEntry.packName.trim();
|
||||||
|
}
|
||||||
if (typeof inputEntry.key === "string" && inputEntry.key.trim()) {
|
if (typeof inputEntry.key === "string" && inputEntry.key.trim()) {
|
||||||
merged.key = inputEntry.key.trim();
|
merged.key = inputEntry.key.trim();
|
||||||
}
|
}
|
||||||
@@ -228,6 +212,7 @@ function upsertPreviewContext(tabId, context, source) {
|
|||||||
previewUrl,
|
previewUrl,
|
||||||
fullUrl: context.fullUrl ? normalizeUrl(context.fullUrl) : "",
|
fullUrl: context.fullUrl ? normalizeUrl(context.fullUrl) : "",
|
||||||
fileName: context.fileName || "",
|
fileName: context.fileName || "",
|
||||||
|
packName: context.packName || "",
|
||||||
key: context.key || "",
|
key: context.key || "",
|
||||||
bpm: context.bpm || "",
|
bpm: context.bpm || "",
|
||||||
tags: Array.isArray(context.tags) ? context.tags : [],
|
tags: Array.isArray(context.tags) ? context.tags : [],
|
||||||
@@ -241,6 +226,7 @@ function upsertPreviewContext(tabId, context, source) {
|
|||||||
function upsertUrl(tabId, url, source) {
|
function upsertUrl(tabId, url, source) {
|
||||||
const sourceTag = source && typeof source === "object" ? source.tag || "" : source || "";
|
const sourceTag = source && typeof source === "object" ? source.tag || "" : source || "";
|
||||||
const sourceFileName = source && typeof source === "object" ? source.fileName || "" : "";
|
const sourceFileName = source && typeof source === "object" ? source.fileName || "" : "";
|
||||||
|
const sourcePackName = source && typeof source === "object" ? source.packName || "" : "";
|
||||||
const sourceKey = source && typeof source === "object" ? source.key || "" : "";
|
const sourceKey = source && typeof source === "object" ? source.key || "" : "";
|
||||||
const sourceBpm = source && typeof source === "object" ? source.bpm || "" : "";
|
const sourceBpm = source && typeof source === "object" ? source.bpm || "" : "";
|
||||||
const sourceTags = source && typeof source === "object" && Array.isArray(source.tags) ? source.tags : [];
|
const sourceTags = source && typeof source === "object" && Array.isArray(source.tags) ? source.tags : [];
|
||||||
@@ -260,6 +246,7 @@ function upsertUrl(tabId, url, source) {
|
|||||||
previewUrl: isPreviewUrl(normalized) ? normalized : "",
|
previewUrl: isPreviewUrl(normalized) ? normalized : "",
|
||||||
fullUrl: isFullUrl(normalized) ? normalized : "",
|
fullUrl: isFullUrl(normalized) ? normalized : "",
|
||||||
fileName: sourceFileName,
|
fileName: sourceFileName,
|
||||||
|
packName: sourcePackName,
|
||||||
key: sourceKey,
|
key: sourceKey,
|
||||||
bpm: sourceBpm,
|
bpm: sourceBpm,
|
||||||
tags: sourceTags,
|
tags: sourceTags,
|
||||||
@@ -302,6 +289,7 @@ async function appendHistoryRows(rows) {
|
|||||||
...existing,
|
...existing,
|
||||||
...row,
|
...row,
|
||||||
fileName: row.fileName || existing.fileName || "",
|
fileName: row.fileName || existing.fileName || "",
|
||||||
|
packName: row.packName || existing.packName || "",
|
||||||
key: row.key || existing.key || "",
|
key: row.key || existing.key || "",
|
||||||
bpm: row.bpm || existing.bpm || "",
|
bpm: row.bpm || existing.bpm || "",
|
||||||
tags: Array.isArray(row.tags) && row.tags.length ? row.tags : (existing.tags || []),
|
tags: Array.isArray(row.tags) && row.tags.length ? row.tags : (existing.tags || []),
|
||||||
@@ -323,6 +311,7 @@ async function appendDownloadHistory(entry, result) {
|
|||||||
previewUrl: resolvedEntry.previewUrl || "",
|
previewUrl: resolvedEntry.previewUrl || "",
|
||||||
fullUrl: resolvedEntry.fullUrl || "",
|
fullUrl: resolvedEntry.fullUrl || "",
|
||||||
fileName: resolvedEntry.fileName || "",
|
fileName: resolvedEntry.fileName || "",
|
||||||
|
packName: resolvedEntry.packName || "",
|
||||||
key: resolvedEntry.key || "",
|
key: resolvedEntry.key || "",
|
||||||
bpm: resolvedEntry.bpm || "",
|
bpm: resolvedEntry.bpm || "",
|
||||||
tags: Array.isArray(resolvedEntry.tags) ? resolvedEntry.tags : [],
|
tags: Array.isArray(resolvedEntry.tags) ? resolvedEntry.tags : [],
|
||||||
@@ -345,6 +334,7 @@ function makeDecodedPlaceholderRow(entry, source) {
|
|||||||
previewUrl: entry.previewUrl || "",
|
previewUrl: entry.previewUrl || "",
|
||||||
fullUrl: entry.fullUrl || "",
|
fullUrl: entry.fullUrl || "",
|
||||||
fileName: entry.fileName || "",
|
fileName: entry.fileName || "",
|
||||||
|
packName: entry.packName || "",
|
||||||
key: entry.key || "",
|
key: entry.key || "",
|
||||||
bpm: entry.bpm || "",
|
bpm: entry.bpm || "",
|
||||||
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
||||||
@@ -533,6 +523,7 @@ function findEntryInTabStates(sampleId) {
|
|||||||
previewUrl: normalizeUrl(entry.previewUrl || ""),
|
previewUrl: normalizeUrl(entry.previewUrl || ""),
|
||||||
fullUrl: normalizeUrl(entry.fullUrl || ""),
|
fullUrl: normalizeUrl(entry.fullUrl || ""),
|
||||||
fileName: entry.fileName || "",
|
fileName: entry.fileName || "",
|
||||||
|
packName: entry.packName || "",
|
||||||
key: entry.key || "",
|
key: entry.key || "",
|
||||||
bpm: entry.bpm || "",
|
bpm: entry.bpm || "",
|
||||||
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
||||||
@@ -559,6 +550,7 @@ async function hydrateEntryFromHistory(sampleId) {
|
|||||||
previewUrl,
|
previewUrl,
|
||||||
fullUrl,
|
fullUrl,
|
||||||
fileName: row.fileName || "",
|
fileName: row.fileName || "",
|
||||||
|
packName: row.packName || "",
|
||||||
key: row.key || "",
|
key: row.key || "",
|
||||||
bpm: row.bpm || "",
|
bpm: row.bpm || "",
|
||||||
tags: Array.isArray(row.tags) ? row.tags : [],
|
tags: Array.isArray(row.tags) ? row.tags : [],
|
||||||
@@ -577,6 +569,7 @@ async function resolveAndDownloadEntry(entryInput) {
|
|||||||
previewUrl: normalizeUrl(entry.previewUrl || ""),
|
previewUrl: normalizeUrl(entry.previewUrl || ""),
|
||||||
fullUrl: normalizeUrl(entry.fullUrl || ""),
|
fullUrl: normalizeUrl(entry.fullUrl || ""),
|
||||||
fileName: entry.fileName || "",
|
fileName: entry.fileName || "",
|
||||||
|
packName: entry.packName || "",
|
||||||
key: entry.key || "",
|
key: entry.key || "",
|
||||||
bpm: entry.bpm || "",
|
bpm: entry.bpm || "",
|
||||||
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
||||||
@@ -629,6 +622,7 @@ function serializeEntry(entry) {
|
|||||||
previewUrl: entry.previewUrl || "",
|
previewUrl: entry.previewUrl || "",
|
||||||
fullUrl: entry.fullUrl || "",
|
fullUrl: entry.fullUrl || "",
|
||||||
fileName: entry.fileName || "",
|
fileName: entry.fileName || "",
|
||||||
|
packName: entry.packName || "",
|
||||||
key: entry.key || "",
|
key: entry.key || "",
|
||||||
bpm: entry.bpm || "",
|
bpm: entry.bpm || "",
|
||||||
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
||||||
@@ -661,10 +655,7 @@ browser.runtime.onMessage.addListener((message, sender) => {
|
|||||||
|
|
||||||
const contexts = Array.isArray(message.contexts) ? message.contexts : [];
|
const contexts = Array.isArray(message.contexts) ? message.contexts : [];
|
||||||
for (const context of contexts) {
|
for (const context of contexts) {
|
||||||
const merged = upsertPreviewContext(tabId, context, "graphql_preview");
|
upsertPreviewContext(tabId, context, "graphql_preview");
|
||||||
if (merged) {
|
|
||||||
debugMapTrace("CAPTURE_PREVIEW_CONTEXT_MERGED", merged);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Promise.resolve({ ok: true, added: contexts.length });
|
return Promise.resolve({ ok: true, added: contexts.length });
|
||||||
}
|
}
|
||||||
@@ -678,14 +669,12 @@ browser.runtime.onMessage.addListener((message, sender) => {
|
|||||||
const merged = upsertUrl(tabId, raw, {
|
const merged = upsertUrl(tabId, raw, {
|
||||||
tag: message.source || "network_preview",
|
tag: message.source || "network_preview",
|
||||||
fileName: canAttachPlaybackMeta ? (message.fileName || "") : "",
|
fileName: canAttachPlaybackMeta ? (message.fileName || "") : "",
|
||||||
|
packName: "",
|
||||||
key: "",
|
key: "",
|
||||||
bpm: "",
|
bpm: "",
|
||||||
tags: [],
|
tags: [],
|
||||||
coverImageUrl: ""
|
coverImageUrl: ""
|
||||||
});
|
});
|
||||||
if (merged) {
|
|
||||||
debugMapTrace("CAPTURE_URLS_MERGED", merged);
|
|
||||||
}
|
|
||||||
if (merged && merged.previewUrl && canAttachPlaybackMeta) {
|
if (merged && merged.previewUrl && canAttachPlaybackMeta) {
|
||||||
const row = makeDecodedPlaceholderRow(merged, message.source || "network_preview");
|
const row = makeDecodedPlaceholderRow(merged, message.source || "network_preview");
|
||||||
if (row) {
|
if (row) {
|
||||||
@@ -749,6 +738,7 @@ browser.runtime.onMessage.addListener((message, sender) => {
|
|||||||
return Promise.resolve({ ok: false });
|
return Promise.resolve({ ok: false });
|
||||||
}
|
}
|
||||||
const fileName = typeof message.fileName === "string" ? message.fileName.trim() : "";
|
const fileName = typeof message.fileName === "string" ? message.fileName.trim() : "";
|
||||||
|
const packName = typeof message.packName === "string" ? message.packName.trim() : "";
|
||||||
const key = typeof message.key === "string" ? message.key.trim() : "";
|
const key = typeof message.key === "string" ? message.key.trim() : "";
|
||||||
const bpm = typeof message.bpm === "string" ? message.bpm.trim() : "";
|
const bpm = typeof message.bpm === "string" ? message.bpm.trim() : "";
|
||||||
const tags = Array.isArray(message.tags) ? message.tags.map((x) => String(x).trim()).filter(Boolean) : [];
|
const tags = Array.isArray(message.tags) ? message.tags.map((x) => String(x).trim()).filter(Boolean) : [];
|
||||||
@@ -779,6 +769,9 @@ browser.runtime.onMessage.addListener((message, sender) => {
|
|||||||
if (fileName) {
|
if (fileName) {
|
||||||
targetEntry.fileName = fileName;
|
targetEntry.fileName = fileName;
|
||||||
}
|
}
|
||||||
|
if (packName) {
|
||||||
|
targetEntry.packName = packName;
|
||||||
|
}
|
||||||
if (key) {
|
if (key) {
|
||||||
targetEntry.key = key;
|
targetEntry.key = key;
|
||||||
}
|
}
|
||||||
@@ -794,7 +787,6 @@ browser.runtime.onMessage.addListener((message, sender) => {
|
|||||||
targetEntry.capturedAt = Date.now();
|
targetEntry.capturedAt = Date.now();
|
||||||
state.entriesBySample.set(targetEntry.sampleId, targetEntry);
|
state.entriesBySample.set(targetEntry.sampleId, targetEntry);
|
||||||
state.latestSampleId = targetEntry.sampleId;
|
state.latestSampleId = targetEntry.sampleId;
|
||||||
debugMapTrace("UPDATE_ACTIVE_PLAYBACK_META_TARGET", targetEntry);
|
|
||||||
const row = makeDecodedPlaceholderRow(targetEntry, targetEntry.source || "playback_meta");
|
const row = makeDecodedPlaceholderRow(targetEntry, targetEntry.source || "playback_meta");
|
||||||
if (!row) {
|
if (!row) {
|
||||||
return Promise.resolve({ ok: true });
|
return Promise.resolve({ ok: true });
|
||||||
|
|||||||
+24
-56
@@ -3,10 +3,7 @@
|
|||||||
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 SPLICE_DOMAIN_RE = /^https?:\/\/([a-z0-9-]+\.)*splice\.com(\/|$)/i;
|
||||||
const GRAPHQL_URL_FRAGMENT = "surfaces-graphql.splice.com/graphql";
|
|
||||||
const PROBE_EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
const PROBE_EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
||||||
const DEBUG_CAPTURE = true;
|
|
||||||
const DEBUG_PLAYBACK_META_MARKER = "S3DBG_PLAYBAR_META_V2";
|
|
||||||
let knownUrls = new Set();
|
let knownUrls = new Set();
|
||||||
let knownPerformanceUrls = new Set();
|
let knownPerformanceUrls = new Set();
|
||||||
let observer = null;
|
let observer = null;
|
||||||
@@ -178,15 +175,20 @@ function extractCoverImageFromGraphqlItem(item) {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function logDebug(message, extra) {
|
function extractPackNameFromGraphqlItem(item) {
|
||||||
if (!DEBUG_CAPTURE) {
|
if (!item || typeof item !== "object" || !item.parents || !Array.isArray(item.parents.items)) {
|
||||||
return;
|
return "";
|
||||||
}
|
}
|
||||||
if (typeof extra === "undefined") {
|
for (const parent of item.parents.items) {
|
||||||
console.debug("[S3 capture]", message);
|
if (!parent || typeof parent !== "object") {
|
||||||
return;
|
continue;
|
||||||
|
}
|
||||||
|
const name = typeof parent.name === "string" ? parent.name.trim() : "";
|
||||||
|
if (name) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.debug("[S3 capture]", message, extra);
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function collectProbeCandidateUrls(payload) {
|
function collectProbeCandidateUrls(payload) {
|
||||||
@@ -272,6 +274,7 @@ function extractPreviewContextsFromGraphql(json) {
|
|||||||
? Array.from(new Set(item.tags.map((tag) => (tag && tag.label ? String(tag.label).trim() : "")).filter(Boolean)))
|
? Array.from(new Set(item.tags.map((tag) => (tag && tag.label ? String(tag.label).trim() : "")).filter(Boolean)))
|
||||||
: [];
|
: [];
|
||||||
const itemCoverImageUrl = extractCoverImageFromGraphqlItem(item);
|
const itemCoverImageUrl = extractCoverImageFromGraphqlItem(item);
|
||||||
|
const itemPackName = extractPackNameFromGraphqlItem(item);
|
||||||
const files = Array.isArray(item.files) ? item.files : [];
|
const files = Array.isArray(item.files) ? item.files : [];
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
@@ -290,7 +293,8 @@ function extractPreviewContextsFromGraphql(json) {
|
|||||||
key: itemKey,
|
key: itemKey,
|
||||||
bpm: itemBpm,
|
bpm: itemBpm,
|
||||||
tags: itemTags,
|
tags: itemTags,
|
||||||
coverImageUrl: itemCoverImageUrl
|
coverImageUrl: itemCoverImageUrl,
|
||||||
|
packName: itemPackName
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,30 +312,6 @@ function sendPreviewContexts(contexts) {
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
// Ignore transient extension messaging failures.
|
// Ignore transient extension messaging failures.
|
||||||
});
|
});
|
||||||
logDebug("Captured preview contexts", contexts);
|
|
||||||
}
|
|
||||||
|
|
||||||
function inspectGraphqlResponse(candidateUrl, response) {
|
|
||||||
if (typeof candidateUrl !== "string" || !candidateUrl.includes(GRAPHQL_URL_FRAGMENT)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!response || typeof response.clone !== "function") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
response.clone().json().then((json) => {
|
|
||||||
const contexts = extractPreviewContextsFromGraphql(json);
|
|
||||||
if (contexts.length) {
|
|
||||||
sendPreviewContexts(contexts);
|
|
||||||
}
|
|
||||||
const urls = new Set();
|
|
||||||
recursivelyCollectAudioUrls(json, urls);
|
|
||||||
if (urls.size) {
|
|
||||||
captureUrls(Array.from(urls));
|
|
||||||
}
|
|
||||||
}).catch(() => {
|
|
||||||
// Some GraphQL responses may not be parseable JSON.
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function captureUrls(inputUrls) {
|
function captureUrls(inputUrls) {
|
||||||
@@ -361,7 +341,6 @@ function captureUrls(inputUrls) {
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
// Ignore transient extension context failures.
|
// Ignore transient extension context failures.
|
||||||
});
|
});
|
||||||
logDebug("Captured S3 URLs", newUrls);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function scanNodeForUrls(root) {
|
function scanNodeForUrls(root) {
|
||||||
@@ -408,12 +387,7 @@ function patchFetch() {
|
|||||||
if (init && typeof init === "object" && typeof init.url === "string") {
|
if (init && typeof init === "object" && typeof init.url === "string") {
|
||||||
captureUrls([init.url]);
|
captureUrls([init.url]);
|
||||||
}
|
}
|
||||||
return originalFetch(input, init).then((response) => {
|
return originalFetch(input, init);
|
||||||
if (candidate) {
|
|
||||||
inspectGraphqlResponse(candidate, response);
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
fetchPatched = true;
|
fetchPatched = true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -429,6 +403,7 @@ function patchXhr() {
|
|||||||
try {
|
try {
|
||||||
const originalOpen = window.XMLHttpRequest.prototype.open;
|
const originalOpen = window.XMLHttpRequest.prototype.open;
|
||||||
window.XMLHttpRequest.prototype.open = function patchedOpen(method, url) {
|
window.XMLHttpRequest.prototype.open = function patchedOpen(method, url) {
|
||||||
|
this.__s3CaptureRequestUrl = typeof url === "string" ? url : "";
|
||||||
if (typeof url === "string") {
|
if (typeof url === "string") {
|
||||||
captureUrls([url]);
|
captureUrls([url]);
|
||||||
}
|
}
|
||||||
@@ -708,15 +683,6 @@ function syncPlaybackMeta() {
|
|||||||
tags: currentPlaybackTags,
|
tags: currentPlaybackTags,
|
||||||
coverImageUrl: currentPlaybackCoverImageUrl
|
coverImageUrl: currentPlaybackCoverImageUrl
|
||||||
};
|
};
|
||||||
if (DEBUG_CAPTURE) {
|
|
||||||
console.debug(DEBUG_PLAYBACK_META_MARKER, {
|
|
||||||
fileName: payload.fileName,
|
|
||||||
key: payload.key,
|
|
||||||
bpm: payload.bpm,
|
|
||||||
tagsCount: Array.isArray(payload.tags) ? payload.tags.length : 0,
|
|
||||||
coverImageUrl: payload.coverImageUrl
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const signature = JSON.stringify(payload);
|
const signature = JSON.stringify(payload);
|
||||||
lastPlaybackMetaSignature = signature;
|
lastPlaybackMetaSignature = signature;
|
||||||
lastPlaybackMetaApplied = false;
|
lastPlaybackMetaApplied = false;
|
||||||
@@ -745,11 +711,17 @@ function installPageProbeListener() {
|
|||||||
|
|
||||||
const kind = typeof data.kind === "string" ? data.kind : "unknown";
|
const kind = typeof data.kind === "string" ? data.kind : "unknown";
|
||||||
const payload = data.payload && typeof data.payload === "object" ? data.payload : {};
|
const payload = data.payload && typeof data.payload === "object" ? data.payload : {};
|
||||||
|
if (kind === "graphql-contexts") {
|
||||||
|
const contexts = Array.isArray(payload.contexts) ? payload.contexts : [];
|
||||||
|
if (contexts.length) {
|
||||||
|
sendPreviewContexts(contexts);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
const candidateUrls = collectProbeCandidateUrls(payload);
|
const candidateUrls = collectProbeCandidateUrls(payload);
|
||||||
if (candidateUrls.length) {
|
if (candidateUrls.length) {
|
||||||
captureUrls(candidateUrls);
|
captureUrls(candidateUrls);
|
||||||
}
|
}
|
||||||
logDebug("Probe event: " + kind, payload);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
probeListenerInstalled = true;
|
probeListenerInstalled = true;
|
||||||
@@ -771,10 +743,6 @@ function injectPageProbeScript() {
|
|||||||
script.async = false;
|
script.async = false;
|
||||||
script.onload = () => {
|
script.onload = () => {
|
||||||
script.remove();
|
script.remove();
|
||||||
logDebug("Injected page probe.");
|
|
||||||
};
|
|
||||||
script.onerror = () => {
|
|
||||||
logDebug("Failed to inject page probe.");
|
|
||||||
};
|
};
|
||||||
root.appendChild(script);
|
root.appendChild(script);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -12,10 +12,11 @@ function formatDate(ms) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatMeta(entry) {
|
function formatMeta(entry) {
|
||||||
|
const packName = entry && entry.packName ? entry.packName : "n/a";
|
||||||
const key = entry && entry.key ? entry.key : "n/a";
|
const key = entry && entry.key ? entry.key : "n/a";
|
||||||
const bpm = entry && entry.bpm ? entry.bpm : "n/a";
|
const bpm = entry && entry.bpm ? entry.bpm : "n/a";
|
||||||
const tags = entry && Array.isArray(entry.tags) && entry.tags.length ? entry.tags.join(", ") : "n/a";
|
const tags = entry && Array.isArray(entry.tags) && entry.tags.length ? entry.tags.join(", ") : "n/a";
|
||||||
return `Key: ${key} | BPM: ${bpm} | Tags: ${tags}`;
|
return `Pack: ${packName} | Key: ${key} | BPM: ${bpm} | Tags: ${tags}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildItem(entry) {
|
function buildItem(entry) {
|
||||||
|
|||||||
+180
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
(function initPageProbe() {
|
(function initPageProbe() {
|
||||||
const EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
const EVENT_SOURCE = "S3_CAPTURE_PROBE";
|
||||||
|
const GRAPHQL_URL_FRAGMENT = "surfaces-graphql.splice.com/graphql";
|
||||||
let lastAudioResponseUrl = "";
|
let lastAudioResponseUrl = "";
|
||||||
|
|
||||||
function emit(kind, payload) {
|
function emit(kind, payload) {
|
||||||
@@ -23,6 +24,156 @@
|
|||||||
return typeof value === "string" ? value : "";
|
return typeof value === "string" ? value : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeUrl(rawUrl) {
|
||||||
|
try {
|
||||||
|
return new URL(rawUrl, window.location.href).toString();
|
||||||
|
} catch (error) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeFileName(raw) {
|
||||||
|
if (typeof raw !== "string") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const trimmed = raw.trim();
|
||||||
|
if (!trimmed) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const parts = trimmed.split("/");
|
||||||
|
return parts[parts.length - 1] || trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractSampleIdFromUrl(url) {
|
||||||
|
try {
|
||||||
|
const parsed = new URL(url);
|
||||||
|
const marker = "/audio_samples/";
|
||||||
|
const idx = parsed.pathname.indexOf(marker);
|
||||||
|
if (idx < 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const rest = parsed.pathname.slice(idx + marker.length);
|
||||||
|
const parts = rest.split("/").filter(Boolean);
|
||||||
|
const first = (parts[0] || "").replace(/-scrambled$/i, "");
|
||||||
|
const second = (parts[1] || "").split(".")[0];
|
||||||
|
const hashRe = /^[a-f0-9]{64}$/i;
|
||||||
|
if (hashRe.test(first)) {
|
||||||
|
return first.toLowerCase();
|
||||||
|
}
|
||||||
|
if (hashRe.test(second)) {
|
||||||
|
return second.toLowerCase();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
} catch (error) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractCoverImageFromGraphqlItem(item) {
|
||||||
|
if (!item || typeof item !== "object") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const ownFiles = Array.isArray(item.files) ? item.files : [];
|
||||||
|
for (const file of ownFiles) {
|
||||||
|
if (!file || typeof file !== "object") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (String(file.asset_file_type_slug || "").toLowerCase() !== "cover_image") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const url = normalizeUrl(file.url || "");
|
||||||
|
if (url) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const parents = item.parents && Array.isArray(item.parents.items) ? item.parents.items : [];
|
||||||
|
for (const parent of parents) {
|
||||||
|
const files = parent && Array.isArray(parent.files) ? parent.files : [];
|
||||||
|
for (const file of files) {
|
||||||
|
if (!file || typeof file !== "object") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (String(file.asset_file_type_slug || "").toLowerCase() !== "cover_image") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const url = normalizeUrl(file.url || "");
|
||||||
|
if (url) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractPackNameFromGraphqlItem(item) {
|
||||||
|
if (!item || typeof item !== "object" || !item.parents || !Array.isArray(item.parents.items)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
for (const parent of item.parents.items) {
|
||||||
|
if (!parent || typeof parent !== "object") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const name = typeof parent.name === "string" ? parent.name.trim() : "";
|
||||||
|
if (name) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractPreviewContextsFromGraphql(json) {
|
||||||
|
const contexts = [];
|
||||||
|
const items = json &&
|
||||||
|
json.data &&
|
||||||
|
json.data.assetsSearch &&
|
||||||
|
Array.isArray(json.data.assetsSearch.items)
|
||||||
|
? json.data.assetsSearch.items
|
||||||
|
: [];
|
||||||
|
for (const item of items) {
|
||||||
|
if (!item || typeof item !== "object") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const sampleId = typeof item.uuid === "string" ? item.uuid.toLowerCase() : "";
|
||||||
|
const itemName = normalizeFileName(String(item.name || ""));
|
||||||
|
const itemKey = typeof item.key === "string" ? item.key.trim().toUpperCase() : "";
|
||||||
|
const itemBpm = item.bpm == null ? "" : String(item.bpm).trim();
|
||||||
|
const itemTags = Array.isArray(item.tags)
|
||||||
|
? Array.from(new Set(item.tags.map((tag) => (tag && tag.label ? String(tag.label).trim() : "")).filter(Boolean)))
|
||||||
|
: [];
|
||||||
|
const itemCoverImageUrl = extractCoverImageFromGraphqlItem(item);
|
||||||
|
const itemPackName = extractPackNameFromGraphqlItem(item);
|
||||||
|
const files = Array.isArray(item.files) ? item.files : [];
|
||||||
|
for (const file of files) {
|
||||||
|
if (!file || typeof file !== "object") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const typeSlug = String(file.asset_file_type_slug || "").toLowerCase();
|
||||||
|
const fileUrl = normalizeUrl(file.url || "");
|
||||||
|
if (typeSlug !== "preview_mp3" || !fileUrl) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
contexts.push({
|
||||||
|
sampleId: sampleId || extractSampleIdFromUrl(fileUrl),
|
||||||
|
previewUrl: fileUrl,
|
||||||
|
fileName: itemName,
|
||||||
|
key: itemKey,
|
||||||
|
bpm: itemBpm,
|
||||||
|
tags: itemTags,
|
||||||
|
coverImageUrl: itemCoverImageUrl,
|
||||||
|
packName: itemPackName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contexts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitGraphqlContextsFromJson(json) {
|
||||||
|
const contexts = extractPreviewContextsFromGraphql(json);
|
||||||
|
if (contexts.length) {
|
||||||
|
emit("graphql-contexts", { contexts });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function markLastAudioUrl(url, contentType) {
|
function markLastAudioUrl(url, contentType) {
|
||||||
const maybeUrl = safeString(url);
|
const maybeUrl = safeString(url);
|
||||||
const maybeType = safeString(contentType).toLowerCase();
|
const maybeType = safeString(contentType).toLowerCase();
|
||||||
@@ -64,6 +215,13 @@
|
|||||||
status: response ? response.status : 0,
|
status: response ? response.status : 0,
|
||||||
contentType: contentType || ""
|
contentType: contentType || ""
|
||||||
});
|
});
|
||||||
|
if (requestUrl && requestUrl.includes(GRAPHQL_URL_FRAGMENT) && response && typeof response.clone === "function") {
|
||||||
|
response.clone().json().then((json) => {
|
||||||
|
emitGraphqlContextsFromJson(json);
|
||||||
|
}).catch(() => {
|
||||||
|
// Ignore non-JSON GraphQL edge cases.
|
||||||
|
});
|
||||||
|
}
|
||||||
return response;
|
return response;
|
||||||
},
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
@@ -117,6 +275,28 @@
|
|||||||
status: xhr.status || 0,
|
status: xhr.status || 0,
|
||||||
contentType
|
contentType
|
||||||
});
|
});
|
||||||
|
const requestUrl = safeString(xhr.__s3CaptureRequestUrl);
|
||||||
|
if (!requestUrl || !requestUrl.includes(GRAPHQL_URL_FRAGMENT)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
let json = null;
|
||||||
|
if (xhr.responseType === "json" && xhr.response && typeof xhr.response === "object") {
|
||||||
|
json = xhr.response;
|
||||||
|
} else {
|
||||||
|
if (xhr.responseType && xhr.responseType !== "text" && xhr.responseType !== "") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const text = safeString(xhr.responseText);
|
||||||
|
if (!text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
json = JSON.parse(text);
|
||||||
|
}
|
||||||
|
emitGraphqlContextsFromJson(json);
|
||||||
|
} catch (error) {
|
||||||
|
// Ignore non-JSON GraphQL edge cases.
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{ once: true }
|
{ once: true }
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,10 +13,11 @@ function entryLabel(entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatMeta(entry) {
|
function formatMeta(entry) {
|
||||||
|
const packName = entry && entry.packName ? entry.packName : "n/a";
|
||||||
const key = entry && entry.key ? entry.key : "n/a";
|
const key = entry && entry.key ? entry.key : "n/a";
|
||||||
const bpm = entry && entry.bpm ? entry.bpm : "n/a";
|
const bpm = entry && entry.bpm ? entry.bpm : "n/a";
|
||||||
const tags = entry && Array.isArray(entry.tags) && entry.tags.length ? entry.tags.join(", ") : "n/a";
|
const tags = entry && Array.isArray(entry.tags) && entry.tags.length ? entry.tags.join(", ") : "n/a";
|
||||||
return `Key: ${key} | BPM: ${bpm} | Tags: ${tags}`;
|
return `Pack: ${packName} | Key: ${key} | BPM: ${bpm} | Tags: ${tags}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildRow(entry) {
|
function buildRow(entry) {
|
||||||
|
|||||||
+262
@@ -0,0 +1,262 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user