mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-08-03 19:21:32 -07:00
503 lines
22 KiB
HTML
503 lines
22 KiB
HTML
<!--
|
||
SubMiner - All-in-one sentence mining overlay
|
||
Copyright (C) 2024 sudacode
|
||
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||
-->
|
||
<!doctype html>
|
||
<html lang="ja">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<meta
|
||
http-equiv="Content-Security-Policy"
|
||
content="default-src 'self' 'unsafe-inline' chrome-extension:; script-src 'self' 'unsafe-inline' chrome-extension:; style-src 'self' 'unsafe-inline' chrome-extension:; img-src 'self' data: blob: chrome-extension:; worker-src 'self' blob:;"
|
||
/>
|
||
<title>SubMiner</title>
|
||
<link rel="stylesheet" href="style.css" />
|
||
</head>
|
||
<body>
|
||
<!-- Programmatic focus fallback target for Electron/window focus management. -->
|
||
<div id="overlay" tabindex="-1">
|
||
<div
|
||
id="controllerStatusToast"
|
||
class="controller-status-toast hidden"
|
||
role="status"
|
||
aria-live="polite"
|
||
></div>
|
||
<div
|
||
id="overlayErrorToast"
|
||
class="overlay-error-toast hidden"
|
||
role="status"
|
||
aria-live="polite"
|
||
></div>
|
||
<div
|
||
id="overlayNotificationStack"
|
||
class="overlay-notification-stack position-top-right hidden"
|
||
aria-live="polite"
|
||
aria-atomic="false"
|
||
></div>
|
||
<aside
|
||
id="overlayNotificationHistory"
|
||
class="notification-history side-right"
|
||
role="dialog"
|
||
aria-label="Notification history"
|
||
aria-hidden="true"
|
||
>
|
||
<header class="notification-history-header">
|
||
<span class="notification-history-title">Notifications</span>
|
||
<div class="notification-history-header-actions">
|
||
<button class="notification-history-clear" type="button">Clear</button>
|
||
<button
|
||
class="notification-history-close"
|
||
type="button"
|
||
aria-label="Close notification history"
|
||
>
|
||
×
|
||
</button>
|
||
</div>
|
||
</header>
|
||
<div class="notification-history-body">
|
||
<ul class="notification-history-list"></ul>
|
||
<div class="notification-history-empty">No notifications yet</div>
|
||
</div>
|
||
</aside>
|
||
<div id="secondarySubContainer" class="secondary-sub-hidden">
|
||
<div id="secondarySubRoot"></div>
|
||
</div>
|
||
<div id="subtitleContainer">
|
||
<div id="subtitleRoot"></div>
|
||
</div>
|
||
<div id="jimakuModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Jimaku Subtitles</div>
|
||
<button id="jimakuClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="jimaku-form">
|
||
<label class="jimaku-field">
|
||
<span>Title</span>
|
||
<input id="jimakuTitle" type="text" placeholder="Anime title" />
|
||
</label>
|
||
<label class="jimaku-field">
|
||
<span>Season</span>
|
||
<input id="jimakuSeason" type="number" min="1" placeholder="1" />
|
||
</label>
|
||
<label class="jimaku-field">
|
||
<span>Episode</span>
|
||
<input id="jimakuEpisode" type="number" min="1" placeholder="1" />
|
||
</label>
|
||
<button id="jimakuSearch" class="jimaku-button" type="button">Search</button>
|
||
</div>
|
||
<div id="jimakuStatus" class="jimaku-status"></div>
|
||
<div id="jimakuEntriesSection" class="jimaku-section hidden">
|
||
<div class="jimaku-section-title">Entries</div>
|
||
<ul id="jimakuEntries" class="jimaku-list"></ul>
|
||
</div>
|
||
<div id="jimakuFilesSection" class="jimaku-section hidden">
|
||
<div class="jimaku-section-title">Files</div>
|
||
<ul id="jimakuFiles" class="jimaku-list"></ul>
|
||
<button id="jimakuBroaden" class="jimaku-link hidden" type="button">
|
||
Broaden search (all files)
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="tsukihimeModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">TsukiHime Subtitles</div>
|
||
<button id="tsukihimeClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="tsukihime-tabs" role="tablist">
|
||
<button
|
||
id="tsukihimeTabSecondary"
|
||
class="tsukihime-tab active"
|
||
type="button"
|
||
role="tab"
|
||
aria-selected="true"
|
||
>
|
||
English
|
||
</button>
|
||
<button
|
||
id="tsukihimeTabPrimary"
|
||
class="tsukihime-tab"
|
||
type="button"
|
||
role="tab"
|
||
aria-selected="false"
|
||
>
|
||
Japanese
|
||
</button>
|
||
</div>
|
||
<div class="jimaku-form">
|
||
<label class="jimaku-field">
|
||
<span>Title</span>
|
||
<input id="tsukihimeTitle" type="text" placeholder="Anime title" />
|
||
</label>
|
||
<label class="jimaku-field">
|
||
<span>Episode</span>
|
||
<input id="tsukihimeEpisode" type="number" min="1" placeholder="1" />
|
||
</label>
|
||
<button id="tsukihimeSearch" class="jimaku-button" type="button">Search</button>
|
||
</div>
|
||
<div id="tsukihimeStatus" class="jimaku-status"></div>
|
||
<div id="tsukihimeEntriesSection" class="jimaku-section hidden">
|
||
<div class="jimaku-section-title">Releases</div>
|
||
<ul id="tsukihimeEntries" class="jimaku-list"></ul>
|
||
</div>
|
||
<div id="tsukihimeFilesSection" class="jimaku-section hidden">
|
||
<div class="jimaku-section-title">Subtitle tracks</div>
|
||
<ul id="tsukihimeFiles" class="jimaku-list"></ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="youtubePickerModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content youtube-picker-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">YouTube Subtitle Tracks</div>
|
||
<button id="youtubePickerCloseButton" class="modal-close" type="button">
|
||
Continue without subtitles
|
||
</button>
|
||
</div>
|
||
<div class="modal-body youtube-picker-body">
|
||
<div id="youtubePickerTitle" class="youtube-picker-title"></div>
|
||
<div class="youtube-picker-grid">
|
||
<label class="youtube-picker-field">
|
||
<span>Primary subtitle</span>
|
||
<select id="youtubePickerPrimarySelect"></select>
|
||
</label>
|
||
<label class="youtube-picker-field">
|
||
<span>Secondary subtitle</span>
|
||
<select id="youtubePickerSecondarySelect"></select>
|
||
</label>
|
||
</div>
|
||
<div id="youtubePickerStatus" class="youtube-picker-status"></div>
|
||
<ul id="youtubePickerTracks" class="youtube-picker-tracks"></ul>
|
||
<div class="youtube-picker-footer">
|
||
<button id="youtubePickerContinueButton" class="kiku-confirm-button" type="button">
|
||
Use selected subtitles
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="kikuFieldGroupingModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Duplicate Card Detected</div>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div id="kikuSelectionStep">
|
||
<div class="kiku-info-text">
|
||
A card with the same expression already exists. Select which card to keep. The other
|
||
card's content will be merged using Kiku field grouping. You can choose whether to
|
||
delete the duplicate.
|
||
</div>
|
||
<div class="kiku-cards-container">
|
||
<div id="kikuCard1" class="kiku-card active" tabindex="0">
|
||
<div class="kiku-card-label">1 — Original Card</div>
|
||
<div class="kiku-card-expression" id="kikuCard1Expression"></div>
|
||
<div class="kiku-card-sentence" id="kikuCard1Sentence"></div>
|
||
<div class="kiku-card-meta" id="kikuCard1Meta"></div>
|
||
</div>
|
||
<div id="kikuCard2" class="kiku-card" tabindex="0">
|
||
<div class="kiku-card-label">2 — New Card</div>
|
||
<div class="kiku-card-expression" id="kikuCard2Expression"></div>
|
||
<div class="kiku-card-sentence" id="kikuCard2Sentence"></div>
|
||
<div class="kiku-card-meta" id="kikuCard2Meta"></div>
|
||
</div>
|
||
</div>
|
||
<div class="kiku-footer">
|
||
<label class="kiku-delete-toggle">
|
||
<input id="kikuDeleteDuplicate" type="checkbox" checked />
|
||
Delete duplicate card after merge
|
||
</label>
|
||
<button id="kikuConfirmButton" class="kiku-confirm-button" type="button">
|
||
Continue
|
||
</button>
|
||
<button id="kikuCancelButton" class="kiku-cancel-button" type="button">
|
||
Cancel
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="kikuPreviewStep" class="hidden">
|
||
<div class="kiku-preview-header">
|
||
<div class="kiku-preview-title">Final Merge Preview</div>
|
||
<div class="kiku-preview-toggle">
|
||
<button id="kikuPreviewCompact" type="button">Compact</button>
|
||
<button id="kikuPreviewFull" type="button">Full</button>
|
||
</div>
|
||
</div>
|
||
<div id="kikuPreviewError" class="kiku-preview-error hidden"></div>
|
||
<pre id="kikuPreviewJson" class="kiku-preview-json"></pre>
|
||
<div class="kiku-footer">
|
||
<button id="kikuBackButton" class="kiku-cancel-button" type="button">Back</button>
|
||
<button id="kikuFinalConfirmButton" class="kiku-confirm-button" type="button">
|
||
Confirm Merge
|
||
</button>
|
||
<button id="kikuFinalCancelButton" class="kiku-cancel-button" type="button">
|
||
Cancel
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="kikuHint" class="kiku-hint">
|
||
Press 1 or 2 to select · Enter to confirm · Esc to cancel
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="runtimeOptionsModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content runtime-modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Runtime Options</div>
|
||
<button id="runtimeOptionsClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div id="runtimeOptionsHint" class="runtime-options-hint">
|
||
Arrow keys: select/change · Enter or double-click: apply · Esc: close
|
||
</div>
|
||
<ul id="runtimeOptionsList" class="runtime-options-list"></ul>
|
||
<div id="runtimeOptionsStatus" class="runtime-options-status"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="characterDictionaryModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content character-dictionary-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Character Dictionary Management</div>
|
||
<button id="characterDictionaryClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div
|
||
class="character-dictionary-tabs"
|
||
role="tablist"
|
||
aria-label="Character dictionary views"
|
||
>
|
||
<button
|
||
id="characterDictionaryOverrideTab"
|
||
class="character-dictionary-tab active"
|
||
type="button"
|
||
role="tab"
|
||
aria-selected="true"
|
||
>
|
||
Override
|
||
</button>
|
||
<button
|
||
id="characterDictionaryManageTab"
|
||
class="character-dictionary-tab"
|
||
type="button"
|
||
role="tab"
|
||
aria-selected="false"
|
||
>
|
||
Manage
|
||
</button>
|
||
</div>
|
||
<div id="characterDictionarySummary" class="runtime-options-hint"></div>
|
||
<div id="characterDictionarySearchPanel">
|
||
<div class="character-dictionary-search">
|
||
<input
|
||
id="characterDictionarySearchInput"
|
||
class="character-dictionary-search-input"
|
||
type="text"
|
||
aria-label="Search character dictionary"
|
||
autocomplete="off"
|
||
/>
|
||
<button
|
||
id="characterDictionarySearchButton"
|
||
class="character-dictionary-use"
|
||
type="button"
|
||
>
|
||
Search
|
||
</button>
|
||
</div>
|
||
<div id="characterDictionaryCurrent" class="character-dictionary-current"></div>
|
||
<ul id="characterDictionaryCandidates" class="character-dictionary-candidates"></ul>
|
||
</div>
|
||
<div id="characterDictionaryManagerPanel" class="hidden">
|
||
<ul
|
||
id="characterDictionaryManagedEntries"
|
||
class="character-dictionary-candidates character-dictionary-managed-entries"
|
||
></ul>
|
||
</div>
|
||
<div id="characterDictionaryStatus" class="runtime-options-status"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="subsyncModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content subsync-modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Subtitle Sync</div>
|
||
<button id="subsyncClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="subsync-form">
|
||
<div class="subsync-field">
|
||
<span>Engine</span>
|
||
<label class="subsync-radio">
|
||
<input id="subsyncEngineAlass" type="radio" name="subsyncEngine" checked />
|
||
alass
|
||
</label>
|
||
<label class="subsync-radio">
|
||
<input id="subsyncEngineFfsubsync" type="radio" name="subsyncEngine" />
|
||
ffsubsync
|
||
</label>
|
||
</div>
|
||
<label id="subsyncReferenceLabel" class="subsync-field">
|
||
<span>Reference (correct timing, for alass)</span>
|
||
<select id="subsyncReferenceSelect"></select>
|
||
</label>
|
||
<label id="subsyncTargetLabel" class="subsync-field">
|
||
<span>Out-of-sync Subtitle (gets retimed)</span>
|
||
<select id="subsyncTargetSelect"></select>
|
||
</label>
|
||
</div>
|
||
<div id="subsyncStatus" class="runtime-options-status"></div>
|
||
<div class="subsync-footer">
|
||
<button id="subsyncRun" class="kiku-confirm-button" type="button">Run Sync</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="controllerSelectModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content runtime-modal-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Controller Configuration</div>
|
||
<button id="controllerSelectClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<label class="controller-select-field">
|
||
<span>Preferred Controller</span>
|
||
<select id="controllerSelectPicker"></select>
|
||
</label>
|
||
<div id="controllerSelectSummary" class="controller-select-summary"></div>
|
||
<div id="controllerConfigList" class="controller-config-list"></div>
|
||
<div id="controllerSelectStatus" class="runtime-options-status"></div>
|
||
<div class="subsync-footer">
|
||
<button id="controllerSelectSave" class="kiku-confirm-button" type="button">
|
||
Save Controller
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="controllerDebugModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content runtime-modal-content controller-debug-content">
|
||
<div
|
||
id="controllerDebugToast"
|
||
class="controller-debug-toast hidden"
|
||
aria-live="polite"
|
||
></div>
|
||
<div class="modal-header">
|
||
<div class="modal-title">Controller Debug</div>
|
||
<button id="controllerDebugClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div id="controllerDebugStatus" class="runtime-options-status"></div>
|
||
<div id="controllerDebugSummary" class="controller-debug-summary"></div>
|
||
<div class="controller-debug-grid">
|
||
<div>
|
||
<div class="jimaku-section-title">Axes</div>
|
||
<pre id="controllerDebugAxes" class="controller-debug-pre"></pre>
|
||
</div>
|
||
<div>
|
||
<div class="jimaku-section-title">Buttons</div>
|
||
<pre id="controllerDebugButtons" class="controller-debug-pre"></pre>
|
||
</div>
|
||
<div class="controller-debug-span">
|
||
<div class="controller-debug-section-header">
|
||
<div class="jimaku-section-title">Config</div>
|
||
<button id="controllerDebugCopy" class="kiku-cancel-button" type="button">
|
||
Copy
|
||
</button>
|
||
</div>
|
||
<pre id="controllerDebugButtonIndices" class="controller-debug-pre"></pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="subtitleSidebarModal" class="modal hidden subtitle-sidebar-modal" aria-hidden="true">
|
||
<div id="subtitleSidebarContent" class="modal-content subtitle-sidebar-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Subtitle Sidebar</div>
|
||
<button id="subtitleSidebarClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body subtitle-sidebar-body">
|
||
<div id="subtitleSidebarStatus" class="runtime-options-status"></div>
|
||
<ul id="subtitleSidebarList" class="subtitle-sidebar-list"></ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="sessionHelpModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content session-help-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Session Help</div>
|
||
<button id="sessionHelpClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div id="sessionHelpShortcut" class="session-help-shortcut"></div>
|
||
<div id="sessionHelpWarning" class="session-help-warning"></div>
|
||
<div id="sessionHelpStatus" class="session-help-status"></div>
|
||
<input
|
||
id="sessionHelpFilter"
|
||
class="session-help-filter"
|
||
type="text"
|
||
placeholder="Type / to search shortcuts"
|
||
autocomplete="off"
|
||
spellcheck="false"
|
||
/>
|
||
<div id="sessionHelpContent" class="session-help-content-list"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="playlistBrowserModal" class="modal hidden" aria-hidden="true">
|
||
<div class="modal-content playlist-browser-content">
|
||
<div class="modal-header">
|
||
<div class="modal-title">Playlist Browser</div>
|
||
<button id="playlistBrowserClose" class="modal-close" type="button">Close</button>
|
||
</div>
|
||
<div class="modal-body playlist-browser-body">
|
||
<div id="playlistBrowserTitle" class="playlist-browser-title"></div>
|
||
<div id="playlistBrowserStatus" class="playlist-browser-status"></div>
|
||
<div class="playlist-browser-grid">
|
||
<div class="playlist-browser-pane">
|
||
<div class="playlist-browser-pane-title">Directory</div>
|
||
<ul id="playlistBrowserDirectoryList" class="playlist-browser-list"></ul>
|
||
</div>
|
||
<div class="playlist-browser-pane">
|
||
<div class="playlist-browser-pane-title">Playlist</div>
|
||
<ul id="playlistBrowserPlaylistList" class="playlist-browser-list"></ul>
|
||
</div>
|
||
</div>
|
||
<div class="playlist-browser-footer">
|
||
<span>Tab switch pane</span>
|
||
<span>Enter activate</span>
|
||
<span>Delete remove</span>
|
||
<span>Ctrl/Cmd+Arrows reorder</span>
|
||
<span>Esc close</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script type="module" src="renderer.js"></script>
|
||
</body>
|
||
</html>
|