mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-04-12 04:19:25 -07:00
feat: add app-owned YouTube subtitle flow with absPlayer-style parsing (#31)
* fix: harden preload argv parsing for popup windows * fix: align youtube playback with shared overlay startup * fix: unwrap mpv youtube streams for anki media mining * docs: update docs for youtube subtitle and mining flow * refactor: unify cli and runtime wiring for startup and youtube flow * feat: update subtitle sidebar overlay behavior * chore: add shared log-file source for diagnostics * fix(ci): add changelog fragment for immersion changes * fix: address CodeRabbit review feedback * fix: persist canonical title from youtube metadata * style: format stats library tab * fix: address latest review feedback * style: format stats library files * test: stub launcher youtube deps in CI * test: isolate launcher youtube flow deps * test: stub launcher youtube deps in failing case * test: force x11 backend in launcher ci harness * test: address latest review feedback * fix(launcher): preserve user YouTube ytdl raw options * docs(backlog): update task tracking notes * fix(immersion): special-case youtube media paths in runtime and tracking * feat(stats): improve YouTube media metadata and picker key handling * fix(ci): format stats media library hook * fix: address latest CodeRabbit review items * docs: update youtube release notes and docs * feat: auto-load youtube subtitles before manual picker * fix: restore app-owned youtube subtitle flow * docs: update youtube playback docs and config copy * refactor: remove legacy youtube launcher mode plumbing * fix: refine youtube subtitle startup binding * docs: clarify youtube subtitle startup behavior * fix: address PR #31 latest review follow-ups * fix: address PR #31 follow-up review comments * test: harden youtube picker test harness * udpate backlog * fix: add timeout to youtube metadata probe * docs: refresh youtube and stats docs * update backlog * update backlog * chore: release v0.9.0
This commit is contained in:
@@ -127,6 +127,10 @@ body {
|
||||
z-index: 1100;
|
||||
}
|
||||
|
||||
#youtubePickerModal {
|
||||
z-index: 1110;
|
||||
}
|
||||
|
||||
.modal.hidden {
|
||||
display: none;
|
||||
}
|
||||
@@ -138,11 +142,11 @@ body {
|
||||
.modal-content {
|
||||
width: min(720px, 92%);
|
||||
max-height: 80%;
|
||||
background: rgba(20, 20, 20, 0.95);
|
||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||
background: rgba(36, 39, 58, 0.95);
|
||||
border: 1px solid rgba(110, 115, 141, 0.18);
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
color: #fff;
|
||||
color: #cad3f5;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
@@ -161,16 +165,17 @@ body {
|
||||
}
|
||||
|
||||
.modal-close {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
background: rgba(73, 77, 100, 0.5);
|
||||
color: #a5adcb;
|
||||
border: 1px solid rgba(110, 115, 141, 0.2);
|
||||
border-radius: 6px;
|
||||
padding: 6px 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.modal-close:hover {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
background: rgba(91, 96, 120, 0.6);
|
||||
color: #cad3f5;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
@@ -288,6 +293,91 @@ body {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.youtube-picker-content {
|
||||
width: min(820px, 92%);
|
||||
background:
|
||||
radial-gradient(circle at top right, rgba(198, 160, 246, 0.10), transparent 34%),
|
||||
linear-gradient(180deg, rgba(36, 39, 58, 0.98), rgba(30, 32, 48, 0.98));
|
||||
border-color: rgba(138, 173, 244, 0.25);
|
||||
}
|
||||
|
||||
.youtube-picker-body {
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
.youtube-picker-title {
|
||||
font-size: 13px;
|
||||
color: #b8c0e0;
|
||||
}
|
||||
|
||||
.youtube-picker-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.youtube-picker-field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
font-size: 12px;
|
||||
color: #a5adcb;
|
||||
}
|
||||
|
||||
.youtube-picker-field select {
|
||||
min-height: 36px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid rgba(110, 115, 141, 0.28);
|
||||
background: rgba(24, 25, 38, 0.92);
|
||||
color: #cad3f5;
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
.youtube-picker-status {
|
||||
min-height: 20px;
|
||||
font-size: 13px;
|
||||
color: #a5adcb;
|
||||
}
|
||||
|
||||
.youtube-picker-tracks {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
max-height: 220px;
|
||||
overflow-y: auto;
|
||||
border-radius: 10px;
|
||||
border: 1px solid rgba(110, 115, 141, 0.18);
|
||||
}
|
||||
|
||||
.youtube-picker-tracks li {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
padding: 10px 12px;
|
||||
border-bottom: 1px solid rgba(110, 115, 141, 0.08);
|
||||
color: #cad3f5;
|
||||
}
|
||||
|
||||
.youtube-picker-tracks li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.youtube-picker-track-meta {
|
||||
color: #6e738d;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.youtube-picker-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.youtube-picker-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.jimaku-form {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
@@ -982,15 +1072,15 @@ iframe[id^='yomitan-popup'] {
|
||||
.kiku-confirm-button {
|
||||
padding: 8px 20px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid rgba(100, 180, 255, 0.4);
|
||||
background: rgba(100, 180, 255, 0.15);
|
||||
color: rgba(100, 180, 255, 0.95);
|
||||
border: 1px solid rgba(138, 173, 244, 0.4);
|
||||
background: rgba(138, 173, 244, 0.15);
|
||||
color: #8aadf4;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.kiku-confirm-button:hover {
|
||||
background: rgba(100, 180, 255, 0.25);
|
||||
background: rgba(138, 173, 244, 0.25);
|
||||
}
|
||||
|
||||
.subsync-modal-content {
|
||||
@@ -1288,9 +1378,9 @@ iframe[id^='yomitan-popup'] {
|
||||
.btn-learn {
|
||||
padding: 5px 14px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid rgba(100, 180, 255, 0.4);
|
||||
background: rgba(100, 180, 255, 0.15);
|
||||
color: rgba(100, 180, 255, 0.95);
|
||||
border: 1px solid rgba(138, 173, 244, 0.4);
|
||||
background: rgba(138, 173, 244, 0.15);
|
||||
color: #8aadf4;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
@@ -1298,28 +1388,28 @@ iframe[id^='yomitan-popup'] {
|
||||
}
|
||||
|
||||
.btn-learn:hover {
|
||||
background: rgba(100, 180, 255, 0.25);
|
||||
background: rgba(138, 173, 244, 0.25);
|
||||
}
|
||||
|
||||
.btn-learn.active {
|
||||
border-color: rgba(100, 180, 255, 0.7);
|
||||
background: rgba(100, 180, 255, 0.25);
|
||||
border-color: rgba(138, 173, 244, 0.7);
|
||||
background: rgba(138, 173, 244, 0.25);
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
padding: 5px 12px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||
border: 1px solid rgba(110, 115, 141, 0.2);
|
||||
background: transparent;
|
||||
color: rgba(255, 255, 255, 0.55);
|
||||
color: #6e738d;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
transition: background 120ms ease, color 120ms ease;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
background: rgba(73, 77, 100, 0.4);
|
||||
color: #a5adcb;
|
||||
}
|
||||
|
||||
.controller-debug-content {
|
||||
|
||||
Reference in New Issue
Block a user