mirror of
https://github.com/dirtydishes/dreamio.git
synced 2026-06-06 13:37:24 +00:00
capture opensubtitles candidates from stremio messages
This commit is contained in:
parent
f34d60af1b
commit
07741bae96
4 changed files with 282 additions and 0 deletions
|
|
@ -26,3 +26,7 @@
|
||||||
{"id":"int-3acaadff","kind":"field_change","created_at":"2026-05-25T15:09:02.023077Z","actor":"dirtydishes","issue_id":"dreamio-h5n","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Limited VLC auto-subtitle reapply to real selection recovery while keeping bounded delayed startup confirmations."}}
|
{"id":"int-3acaadff","kind":"field_change","created_at":"2026-05-25T15:09:02.023077Z","actor":"dirtydishes","issue_id":"dreamio-h5n","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Limited VLC auto-subtitle reapply to real selection recovery while keeping bounded delayed startup confirmations."}}
|
||||||
{"id":"int-c526b5ae","kind":"field_change","created_at":"2026-05-25T15:32:37.748454Z","actor":"dirtydishes","issue_id":"dreamio-dow","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented stream-keyed subtitle buffering, OpenSubtitles parser/resolver hardening, VLC refresh behavior, and focused validation."}}
|
{"id":"int-c526b5ae","kind":"field_change","created_at":"2026-05-25T15:32:37.748454Z","actor":"dirtydishes","issue_id":"dreamio-dow","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented stream-keyed subtitle buffering, OpenSubtitles parser/resolver hardening, VLC refresh behavior, and focused validation."}}
|
||||||
{"id":"int-320e7321","kind":"field_change","created_at":"2026-05-25T15:53:52.866657Z","actor":"dirtydishes","issue_id":"dreamio-hzj","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Hardened OpenSubtitles candidate discovery, nested payload resolution, VLC external subtitle visibility selection, diagnostics, tests, and turn documentation."}}
|
{"id":"int-320e7321","kind":"field_change","created_at":"2026-05-25T15:53:52.866657Z","actor":"dirtydishes","issue_id":"dreamio-hzj","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Hardened OpenSubtitles candidate discovery, nested payload resolution, VLC external subtitle visibility selection, diagnostics, tests, and turn documentation."}}
|
||||||
|
{"id":"int-95ad98d5","kind":"field_change","created_at":"2026-05-25T16:00:18.70354Z","actor":"dirtydishes","issue_id":"dreamio-656","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
|
||||||
|
{"id":"int-323d3a68","kind":"field_change","created_at":"2026-05-25T16:02:09.791701Z","actor":"dirtydishes","issue_id":"dreamio-656","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"fixed"}}
|
||||||
|
{"id":"int-6e411a6a","kind":"field_change","created_at":"2026-05-25T16:03:23.023525Z","actor":"dirtydishes","issue_id":"dreamio-656","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
|
||||||
|
{"id":"int-fe1c7364","kind":"field_change","created_at":"2026-05-25T16:04:54.482803Z","actor":"dirtydishes","issue_id":"dreamio-656","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"fixed"}}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
{"_type":"issue","id":"dreamio-8cz","title":"fix stremio external subtitle loading regression","description":"After adding late subtitle forwarding for native playback, Stremio external subtitle loading is failing. Investigate the injected bridge and native subtitle forwarding path, then adjust behavior so Stremio can still load external subtitles while native playback receives late candidates.","status":"closed","priority":0,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T11:05:42Z","created_by":"dirtydishes","updated_at":"2026-05-25T11:07:35Z","started_at":"2026-05-25T11:05:55Z","closed_at":"2026-05-25T11:07:35Z","close_reason":"Hardened subtitle bridge network observers so non-text Stremio subtitle loads are not touched, and made parser traversal deterministic for metadata preservation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
{"_type":"issue","id":"dreamio-8cz","title":"fix stremio external subtitle loading regression","description":"After adding late subtitle forwarding for native playback, Stremio external subtitle loading is failing. Investigate the injected bridge and native subtitle forwarding path, then adjust behavior so Stremio can still load external subtitles while native playback receives late candidates.","status":"closed","priority":0,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T11:05:42Z","created_by":"dirtydishes","updated_at":"2026-05-25T11:07:35Z","started_at":"2026-05-25T11:05:55Z","closed_at":"2026-05-25T11:07:35Z","close_reason":"Hardened subtitle bridge network observers so non-text Stremio subtitle loads are not touched, and made parser traversal deterministic for metadata preservation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
||||||
|
{"_type":"issue","id":"dreamio-656","title":"Capture OpenSubtitles candidates from Stremio app-state messages","description":"OpenSubtitlesV3 appears loaded in Stremio before native playback launches, but Dreamio forwards zero external subtitle candidates. The likely failure is not native-player timing; it is that the injected WebKit bridge does not extract Stremio's loaded subtitle metadata/state into URL candidates before opening VLC.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T16:00:09Z","created_by":"dirtydishes","updated_at":"2026-05-25T16:04:54Z","started_at":"2026-05-25T16:00:18Z","closed_at":"2026-05-25T16:04:54Z","close_reason":"fixed","dependency_count":0,"dependent_count":0,"comment_count":0}
|
||||||
{"_type":"issue","id":"dreamio-hzj","title":"OpenSubtitles tracks missing from native captions menu","description":"OpenSubtitles subtitle candidates can be discovered or resolved inconsistently, and external VLC subtitle slaves may not become visible quickly enough to show as selectable native caption tracks. Harden discovery, resolution, attachment, diagnostics, tests, and turn documentation for the native captions path.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T15:51:07Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:53:53Z","started_at":"2026-05-25T15:51:13Z","closed_at":"2026-05-25T15:53:53Z","close_reason":"Hardened OpenSubtitles candidate discovery, nested payload resolution, VLC external subtitle visibility selection, diagnostics, tests, and turn documentation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
{"_type":"issue","id":"dreamio-hzj","title":"OpenSubtitles tracks missing from native captions menu","description":"OpenSubtitles subtitle candidates can be discovered or resolved inconsistently, and external VLC subtitle slaves may not become visible quickly enough to show as selectable native caption tracks. Harden discovery, resolution, attachment, diagnostics, tests, and turn documentation for the native captions path.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T15:51:07Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:53:53Z","started_at":"2026-05-25T15:51:13Z","closed_at":"2026-05-25T15:53:53Z","close_reason":"Hardened OpenSubtitles candidate discovery, nested payload resolution, VLC external subtitle visibility selection, diagnostics, tests, and turn documentation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
||||||
{"_type":"issue","id":"dreamio-dow","title":"fix stremio external subtitle handoff to vlc","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T15:17:16Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:32:38Z","started_at":"2026-05-25T15:17:25Z","closed_at":"2026-05-25T15:32:38Z","close_reason":"Implemented stream-keyed subtitle buffering, OpenSubtitles parser/resolver hardening, VLC refresh behavior, and focused validation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
{"_type":"issue","id":"dreamio-dow","title":"fix stremio external subtitle handoff to vlc","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-25T15:17:16Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:32:38Z","started_at":"2026-05-25T15:17:25Z","closed_at":"2026-05-25T15:32:38Z","close_reason":"Implemented stream-keyed subtitle buffering, OpenSubtitles parser/resolver hardening, VLC refresh behavior, and focused validation.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
||||||
{"_type":"issue","id":"dreamio-bao","title":"add native player audio track selection","description":"Add audio track discovery and selection to the native VLC-backed player so multi-language files can be filtered from the player controls.","status":"closed","priority":1,"issue_type":"feature","owner":"dishes@dpdrm.com","created_at":"2026-05-25T14:57:14Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:01:36Z","closed_at":"2026-05-25T15:01:36Z","close_reason":"Implemented native audio track discovery and selection with a far-left audio menu in the VLC-backed player.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
{"_type":"issue","id":"dreamio-bao","title":"add native player audio track selection","description":"Add audio track discovery and selection to the native VLC-backed player so multi-language files can be filtered from the player controls.","status":"closed","priority":1,"issue_type":"feature","owner":"dishes@dpdrm.com","created_at":"2026-05-25T14:57:14Z","created_by":"dirtydishes","updated_at":"2026-05-25T15:01:36Z","closed_at":"2026-05-25T15:01:36Z","close_reason":"Implemented native audio track discovery and selection with a far-left audio menu in the VLC-backed player.","dependency_count":0,"dependent_count":0,"comment_count":0}
|
||||||
|
|
|
||||||
|
|
@ -304,6 +304,12 @@ final class DreamioWebViewController: UIViewController {
|
||||||
postSubtitleInspection(source, url, beforeCount, subtitleCandidates.length, text ? text.length : 0);
|
postSubtitleInspection(source, url, beforeCount, subtitleCandidates.length, text ? text.length : 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const inspectMessagePayload = (source, payload) => {
|
||||||
|
const beforeCount = subtitleCandidates.length;
|
||||||
|
inspectSubtitlePayload(payload);
|
||||||
|
postSubtitleInspection(source, "", beforeCount, subtitleCandidates.length, 0);
|
||||||
|
};
|
||||||
|
|
||||||
const originalFetch = window.fetch;
|
const originalFetch = window.fetch;
|
||||||
if (originalFetch) {
|
if (originalFetch) {
|
||||||
window.fetch = async (...args) => {
|
window.fetch = async (...args) => {
|
||||||
|
|
@ -349,6 +355,82 @@ final class DreamioWebViewController: UIViewController {
|
||||||
return originalXHRSend.apply(this, args);
|
return originalXHRSend.apply(this, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const originalWindowPostMessage = window.postMessage;
|
||||||
|
if (originalWindowPostMessage) {
|
||||||
|
window.postMessage = function(message, targetOrigin, transfer) {
|
||||||
|
try { inspectMessagePayload("window.postMessage", message); } catch (_) {}
|
||||||
|
return originalWindowPostMessage.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
window.addEventListener("message", (event) => {
|
||||||
|
try { inspectMessagePayload("window.message", event.data); } catch (_) {}
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
const OriginalWorker = window.Worker;
|
||||||
|
if (OriginalWorker) {
|
||||||
|
window.Worker = function(...args) {
|
||||||
|
const worker = new OriginalWorker(...args);
|
||||||
|
try {
|
||||||
|
const originalWorkerPostMessage = worker.postMessage;
|
||||||
|
worker.postMessage = function(message, transfer) {
|
||||||
|
try { inspectMessagePayload("worker.postMessage", message); } catch (_) {}
|
||||||
|
return originalWorkerPostMessage.apply(this, arguments);
|
||||||
|
};
|
||||||
|
worker.addEventListener("message", (event) => {
|
||||||
|
try { inspectMessagePayload("worker.message", event.data); } catch (_) {}
|
||||||
|
}, true);
|
||||||
|
} catch (_) {}
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
window.Worker.prototype = OriginalWorker.prototype;
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.MessagePort && window.MessagePort.prototype) {
|
||||||
|
const originalPortPostMessage = window.MessagePort.prototype.postMessage;
|
||||||
|
if (originalPortPostMessage) {
|
||||||
|
window.MessagePort.prototype.postMessage = function(message, transfer) {
|
||||||
|
try { inspectMessagePayload("message-port.postMessage", message); } catch (_) {}
|
||||||
|
return originalPortPostMessage.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const originalPortAddEventListener = window.MessagePort.prototype.addEventListener;
|
||||||
|
if (originalPortAddEventListener) {
|
||||||
|
window.MessagePort.prototype.addEventListener = function(type, listener, options) {
|
||||||
|
if (type === "message" && typeof listener === "function") {
|
||||||
|
const wrapped = function(event) {
|
||||||
|
try { inspectMessagePayload("message-port.message", event && event.data); } catch (_) {}
|
||||||
|
return listener.apply(this, arguments);
|
||||||
|
};
|
||||||
|
return originalPortAddEventListener.call(this, type, wrapped, options);
|
||||||
|
}
|
||||||
|
return originalPortAddEventListener.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const OriginalBroadcastChannel = window.BroadcastChannel;
|
||||||
|
if (OriginalBroadcastChannel) {
|
||||||
|
window.BroadcastChannel = function(...args) {
|
||||||
|
const channel = new OriginalBroadcastChannel(...args);
|
||||||
|
try {
|
||||||
|
const originalBroadcastPostMessage = channel.postMessage;
|
||||||
|
channel.postMessage = function(message) {
|
||||||
|
try { inspectMessagePayload("broadcast-channel.postMessage", message); } catch (_) {}
|
||||||
|
return originalBroadcastPostMessage.apply(this, arguments);
|
||||||
|
};
|
||||||
|
channel.addEventListener("message", (event) => {
|
||||||
|
try { inspectMessagePayload("broadcast-channel.message", event.data); } catch (_) {}
|
||||||
|
}, true);
|
||||||
|
} catch (_) {}
|
||||||
|
return channel;
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
window.BroadcastChannel.prototype = OriginalBroadcastChannel.prototype;
|
||||||
|
} catch (_) {}
|
||||||
|
}
|
||||||
|
|
||||||
const stopNativeHandledMedia = (element) => {
|
const stopNativeHandledMedia = (element) => {
|
||||||
const media = element instanceof HTMLVideoElement
|
const media = element instanceof HTMLVideoElement
|
||||||
? element
|
? element
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue