Updates extensions in workspace. Alters plugin to scrape for NxN tabs for videos to display in the matrix.
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"folders": [
|
"folders": [
|
||||||
{
|
{
|
||||||
"path": "."
|
"path": ".",
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
"maslansnik.chromium-ext-debugger",
|
"maslansnik.chromium-ext-debugger",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"bierner.markdown-preview-github-styles"
|
"bierner.markdown-preview-github-styles",
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"extensions.autoUpdate": true,
|
"extensions.autoUpdate": true,
|
||||||
@@ -19,25 +19,5 @@
|
|||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"eslint.validate": ["javascript", "typescript"],
|
"eslint.validate": ["javascript", "typescript"],
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
"claudeCode.environmentVariables": [
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
"name":"ANTHROPIC_BASE_URL",
|
|
||||||
"value":"http://192.168.1.109:11434"
|
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name":"ANTHROPIC_AUTH_TOKEN",
|
|
||||||
"value":"ollama"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"ANTHROPIC_API_KEY",
|
|
||||||
"value": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"ANTHROPIC_MODEL",
|
|
||||||
"value": "qwen3.6"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-8
@@ -184,8 +184,9 @@ findBtn.addEventListener('click', async () => {
|
|||||||
[TAGGED_KEY]: items.map(v => v.tab),
|
[TAGGED_KEY]: items.map(v => v.tab),
|
||||||
});
|
});
|
||||||
|
|
||||||
setStatus(`Found ${items.length} video(s) across ${scanned} tab(s).`);
|
const skippedTabs = results.filter(r => r === null).length;
|
||||||
renderList(storedItems.map(v => ({ url: v, label: v.tab })));
|
const statusMsg = `Found ${items.length} video(s) across ${scanned} tab(s).`;
|
||||||
|
setStatus(skippedTabs > 0 ? `${statusMsg} ${skippedTabs} tab(s) skipped (idle).` : statusMsg);
|
||||||
btnRow.style.display = 'flex';
|
btnRow.style.display = 'flex';
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setStatus(`Scan failed: ${e.message}`);
|
setStatus(`Scan failed: ${e.message}`);
|
||||||
@@ -203,10 +204,17 @@ openBtn.addEventListener('click', async () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Take the first 4 (viewer grid is 2x2)
|
// Dedup by index to preserve tag alignment
|
||||||
const videoUrls = urls.slice(0, 4);
|
const videoUrls = urls;
|
||||||
const videoTags = tags ? tags.slice(0, 4) : [];
|
const videoTags = tags || [];
|
||||||
console.log('[goon] opening viewer with', videoUrls.length, 'video URLs:', videoUrls);
|
|
||||||
|
// Compute NxN grid
|
||||||
|
const N = Math.ceil(Math.sqrt(videoUrls.length));
|
||||||
|
const PANEL_MIN_W = 420;
|
||||||
|
const PANEL_MIN_H = 340;
|
||||||
|
const GAP = 2;
|
||||||
|
const winW = Math.max(PANEL_MIN_W * N + GAP * (N - 1), 400);
|
||||||
|
const winH = Math.max(PANEL_MIN_H * N + GAP * (N - 1) + 40, 300);
|
||||||
|
|
||||||
const id = 'goonViewer_' + Date.now();
|
const id = 'goonViewer_' + Date.now();
|
||||||
await chrome.storage.local.set({ [id]: videoUrls });
|
await chrome.storage.local.set({ [id]: videoUrls });
|
||||||
@@ -218,8 +226,9 @@ openBtn.addEventListener('click', async () => {
|
|||||||
await new Promise(r => setTimeout(r, 100));
|
await new Promise(r => setTimeout(r, 100));
|
||||||
|
|
||||||
const tagsParam = videoTags.length > 0 ? '&tags=' + encodeURIComponent(JSON.stringify(videoTags)) : '';
|
const tagsParam = videoTags.length > 0 ? '&tags=' + encodeURIComponent(JSON.stringify(videoTags)) : '';
|
||||||
const viewerUrl = chrome.runtime.getURL('viewer/viewer.html') + '?id=' + id + tagsParam;
|
const gridParam = '&grid=' + N;
|
||||||
chrome.windows.create({ url: viewerUrl, width: 1400, height: 900 });
|
const viewerUrl = chrome.runtime.getURL('viewer/viewer.html') + '?id=' + id + gridParam + tagsParam;
|
||||||
|
chrome.windows.create({ url: viewerUrl, width: winW, height: winH });
|
||||||
});
|
});
|
||||||
|
|
||||||
/* === "Clear" — reset the stored list === */
|
/* === "Clear" — reset the stored list === */
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ body {
|
|||||||
|
|
||||||
#panels {
|
#panels {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
grid-template-rows: 1fr 1fr;
|
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
+12
-5
@@ -1,10 +1,11 @@
|
|||||||
/**
|
/**
|
||||||
* viewer.js — Goon Viewer page logic.
|
* viewer.js — Goon Viewer page logic.
|
||||||
* Reads video URLs from chrome.storage and renders them in a 2x2 grid.
|
* Reads video URLs from chrome.storage and renders them in a dynamic NxN grid.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const params = new URLSearchParams(location.search);
|
const params = new URLSearchParams(location.search);
|
||||||
const id = params.get('id');
|
const id = params.get('id');
|
||||||
|
const gridN = parseInt(params.get('grid'), 10) || 2;
|
||||||
const tags = params.get('tags') ? JSON.parse(params.get('tags')) : [];
|
const tags = params.get('tags') ? JSON.parse(params.get('tags')) : [];
|
||||||
const panelsEl = document.getElementById('panels');
|
const panelsEl = document.getElementById('panels');
|
||||||
|
|
||||||
@@ -28,11 +29,13 @@ async function init() {
|
|||||||
document.body.style.position = 'relative';
|
document.body.style.position = 'relative';
|
||||||
document.body.insertBefore(overlay, document.body.firstChild);
|
document.body.insertBefore(overlay, document.body.firstChild);
|
||||||
|
|
||||||
overlay.textContent = `Found ${videoUrls.length} video URL(s)`;
|
overlay.textContent = `Found ${videoUrls.length} video URL(s) in ${gridN}x${gridN} grid`;
|
||||||
console.log('[goon-viewer]', overlay.textContent);
|
console.log('[goon-viewer]', overlay.textContent);
|
||||||
|
|
||||||
// Create exactly 4 panels
|
const totalPanels = gridN * gridN;
|
||||||
for (let i = 0; i < 4; i++) {
|
|
||||||
|
// Create NxN panels
|
||||||
|
for (let i = 0; i < totalPanels; i++) {
|
||||||
const panel = document.createElement('div');
|
const panel = document.createElement('div');
|
||||||
panel.classList.add('panel');
|
panel.classList.add('panel');
|
||||||
|
|
||||||
@@ -43,7 +46,7 @@ async function init() {
|
|||||||
video.muted = true;
|
video.muted = true;
|
||||||
video.loop = true;
|
video.loop = true;
|
||||||
video.playsInline = true;
|
video.playsInline = true;
|
||||||
console.log('[goon-viewer] panel', i + '/4:', videoUrls[i]);
|
console.log('[goon-viewer] panel', i + 1, '/', totalPanels, ':', videoUrls[i]);
|
||||||
panel.appendChild(video);
|
panel.appendChild(video);
|
||||||
|
|
||||||
// Add tab label if available
|
// Add tab label if available
|
||||||
@@ -59,6 +62,10 @@ async function init() {
|
|||||||
|
|
||||||
panelsEl.appendChild(panel);
|
panelsEl.appendChild(panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply dynamic grid
|
||||||
|
panelsEl.style.gridTemplateColumns = `repeat(${gridN}, 1fr)`;
|
||||||
|
panelsEl.style.gridTemplateRows = `repeat(${gridN}, 1fr)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up storage entry when the viewer is closed
|
// Clean up storage entry when the viewer is closed
|
||||||
|
|||||||
Reference in New Issue
Block a user