fix: render segment overrides and skip progress

This commit is contained in:
2026-05-22 16:34:26 +02:00
parent c5c15cdabc
commit 51355a4dbc
7 changed files with 73 additions and 58 deletions

View File

@@ -22,6 +22,8 @@ const sendBeacon = (payload: string) => {
*/
export const saveProgress = async (): Promise<void> => {
if (state.transitionEpisode !== null || !state.malID || state.video.currentTime < 1) return;
// progress is user-scoped; avoid spamming 401s for anonymous sessions
if (!document.cookie.includes('mal_session=')) return;
const episode = Number.parseInt(state.currentEpisode, 10);
if (!episode) return;
@@ -60,6 +62,8 @@ const scheduleProgressSave = (): void => {
*/
export const markEpisodeTransition = (episodeNumber: number): void => {
if (!state.malID || !episodeNumber) return;
// progress is user-scoped; avoid sending beacons for anonymous sessions
if (!document.cookie.includes('mal_session=')) return;
if (state.progressSaveTimer !== undefined) {
window.clearTimeout(state.progressSaveTimer);
state.progressSaveTimer = undefined;
@@ -102,6 +106,7 @@ export const setupProgress = (): void => {
// save on page close
window.addEventListener('beforeunload', () => {
if (state.transitionEpisode !== null || state.completionSent || !state.malID) return;
if (!document.cookie.includes('mal_session=')) return;
const episode = Number.parseInt(state.currentEpisode, 10);
if (!episode) return;
sendBeacon(buildPayload(episode, displayTimeFromAbsolute(state.video.currentTime)));

View File

@@ -151,10 +151,16 @@ export const setupSegmentEditor = (): void => {
if (normalizedType === 'ending') return t !== 'ed' && t !== 'ending' && t !== 'outro';
return t !== 'op' && t !== 'opening' && t !== 'intro';
});
state.parsedSegments.push({ type: normalizedType, start: startTime, end: endTime });
state.parsedSegments.push({
type: normalizedType,
start: startTime,
end: endTime,
source: 'override',
});
resolveActiveSegments();
renderSegments();
window.showToast?.({ message: 'Segment saved.' });
close();
} catch {
setError('Failed to save segment.');

View File

@@ -27,6 +27,7 @@ export const resolveActiveSegments = (): void => {
state.activeSegments = state.parsedSegments.filter(s => {
const t = normalizeType(s.type);
if (!t) return false;
const isOverride = (s.source || '').toLowerCase() === 'override';
const len = s.end - s.start;
// duration filter
@@ -34,6 +35,9 @@ export const resolveActiveSegments = (): void => {
// bounds check
if (s.start < 0 || s.end <= s.start || s.end > bounds + 1) return false;
// User overrides should render even if they don't fit AniSkip's usual OP/ED heuristics.
if (isOverride) return true;
// intro: starts early, before 50% of video
if (t === 'op') {
return s.start <= MAX_INTRO_START && s.start <= bounds * 0.5;

View File

@@ -16,6 +16,7 @@ export interface SkipSegment {
type: string; // 'op' or 'ed'
start: number;
end: number;
source?: string;
}
// parsed subtitle cue from VTT
@@ -37,6 +38,7 @@ export interface ActiveSegment {
type: string;
start: number;
end: number;
source?: string;
}
// timeline range (handles seekable ranges in live streams)