mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-04-21 16:51:57 +00:00
fixed a continue watching bug where removed content won't reappearing even after watching it again
This commit is contained in:
parent
bf22e559c5
commit
8b5a707daa
1 changed files with 70 additions and 55 deletions
|
|
@ -29,7 +29,7 @@ class StorageService {
|
|||
private watchProgressCacheTimestamp = 0;
|
||||
private readonly WATCH_PROGRESS_CACHE_TTL = 5000; // 5 seconds
|
||||
|
||||
private constructor() {}
|
||||
private constructor() { }
|
||||
|
||||
public static getInstance(): StorageService {
|
||||
if (!StorageService.instance) {
|
||||
|
|
@ -88,7 +88,7 @@ class StorageService {
|
|||
const map = JSON.parse(json) as Record<string, number>;
|
||||
map[this.buildWpKeyString(id, type, episodeId)] = deletedAtMs || Date.now();
|
||||
await mmkvStorage.setItem(key, JSON.stringify(map));
|
||||
} catch {}
|
||||
} catch { }
|
||||
}
|
||||
|
||||
public async clearWatchProgressTombstone(
|
||||
|
|
@ -105,7 +105,7 @@ class StorageService {
|
|||
delete map[k];
|
||||
await mmkvStorage.setItem(key, JSON.stringify(map));
|
||||
}
|
||||
} catch {}
|
||||
} catch { }
|
||||
}
|
||||
|
||||
public async getWatchProgressTombstones(): Promise<Record<string, number>> {
|
||||
|
|
@ -220,7 +220,7 @@ class StorageService {
|
|||
lastUpdated: Date.now()
|
||||
};
|
||||
await this.setWatchProgress(id, type, updatedProgress, episodeId);
|
||||
logger.log(`[StorageService] Updated progress duration from ${(existingProgress.duration/60).toFixed(0)}min to ${(newDuration/60).toFixed(0)}min`);
|
||||
logger.log(`[StorageService] Updated progress duration from ${(existingProgress.duration / 60).toFixed(0)}min to ${(newDuration / 60).toFixed(0)}min`);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('Error updating progress duration:', error);
|
||||
|
|
@ -247,7 +247,7 @@ class StorageService {
|
|||
if (newestTombAt && (progress.lastUpdated == null || progress.lastUpdated <= newestTombAt)) {
|
||||
return;
|
||||
}
|
||||
} catch {}
|
||||
} catch { }
|
||||
|
||||
// Check if progress has actually changed significantly, unless forceWrite is requested
|
||||
if (!options?.forceWrite) {
|
||||
|
|
@ -266,6 +266,21 @@ class StorageService {
|
|||
const timestamp = (options?.preserveTimestamp && typeof progress.lastUpdated === 'number')
|
||||
? progress.lastUpdated
|
||||
: Date.now();
|
||||
|
||||
|
||||
try {
|
||||
const removedMap = await this.getContinueWatchingRemoved();
|
||||
const removedKey = this.buildWpKeyString(id, type);
|
||||
const removedAt = removedMap[removedKey];
|
||||
|
||||
if (removedAt != null && timestamp > removedAt) {
|
||||
logger.log(`♻️ [StorageService] restoring content to continue watching due to new progress: ${type}:${id}`);
|
||||
await this.removeContinueWatchingRemoved(id, type);
|
||||
}
|
||||
} catch (e) {
|
||||
// Ignore error checks for restoration to prevent blocking save
|
||||
}
|
||||
|
||||
const updated = { ...progress, lastUpdated: timestamp };
|
||||
await mmkvStorage.setItem(key, JSON.stringify(updated));
|
||||
|
||||
|
|
@ -309,7 +324,7 @@ class StorageService {
|
|||
|
||||
// Only notify if we have subscribers
|
||||
if (this.watchProgressSubscribers.length > 0) {
|
||||
this.watchProgressSubscribers.forEach(callback => callback());
|
||||
this.watchProgressSubscribers.forEach(callback => callback());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -364,7 +379,7 @@ class StorageService {
|
|||
// Notify subscribers
|
||||
this.notifyWatchProgressSubscribers();
|
||||
// Emit explicit remove event for sync layer
|
||||
try { this.watchProgressRemoveListeners.forEach(l => l(id, type, episodeId)); } catch {}
|
||||
try { this.watchProgressRemoveListeners.forEach(l => l(id, type, episodeId)); } catch { }
|
||||
} catch (error) {
|
||||
logger.error('Error removing watch progress:', error);
|
||||
}
|
||||
|
|
@ -419,7 +434,7 @@ class StorageService {
|
|||
exactTime?: number
|
||||
): Promise<void> {
|
||||
try {
|
||||
const existingProgress = await this.getWatchProgress(id, type, episodeId);
|
||||
const existingProgress = await this.getWatchProgress(id, type, episodeId);
|
||||
if (existingProgress) {
|
||||
// Preserve the highest Trakt progress and currentTime values to avoid accidental regressions
|
||||
const highestTraktProgress = (() => {
|
||||
|
|
@ -623,17 +638,17 @@ class StorageService {
|
|||
const durationDiff = Math.abs(calculatedDuration - localProgress.duration);
|
||||
if (durationDiff > 300) { // More than 5 minutes difference
|
||||
duration = calculatedDuration;
|
||||
logger.log(`[StorageService] Updated duration based on exact time: ${(localProgress.duration/60).toFixed(0)}min → ${(duration/60).toFixed(0)}min`);
|
||||
logger.log(`[StorageService] Updated duration based on exact time: ${(localProgress.duration / 60).toFixed(0)}min → ${(duration / 60).toFixed(0)}min`);
|
||||
}
|
||||
} else if (localProgress.duration > 0) {
|
||||
// Use percentage calculation with local duration
|
||||
currentTime = (traktProgress / 100) * localProgress.duration;
|
||||
} else {
|
||||
// No local duration, check stored duration
|
||||
const storedDuration = await this.getContentDuration(id, type, episodeId);
|
||||
duration = storedDuration || 0;
|
||||
// No local duration, check stored duration
|
||||
const storedDuration = await this.getContentDuration(id, type, episodeId);
|
||||
duration = storedDuration || 0;
|
||||
|
||||
if (!duration || duration <= 0) {
|
||||
if (!duration || duration <= 0) {
|
||||
if (exactTime && exactTime > 0) {
|
||||
duration = (exactTime / traktProgress) * 100;
|
||||
currentTime = exactTime;
|
||||
|
|
@ -649,20 +664,20 @@ class StorageService {
|
|||
currentTime = (traktProgress / 100) * duration;
|
||||
}
|
||||
} else {
|
||||
currentTime = exactTime && exactTime > 0 ? exactTime : (traktProgress / 100) * duration;
|
||||
currentTime = exactTime && exactTime > 0 ? exactTime : (traktProgress / 100) * duration;
|
||||
}
|
||||
}
|
||||
|
||||
const updatedProgress: WatchProgress = {
|
||||
const updatedProgress: WatchProgress = {
|
||||
...localProgress,
|
||||
currentTime,
|
||||
duration,
|
||||
lastUpdated: traktTimestamp,
|
||||
traktSynced: true,
|
||||
traktLastSynced: Date.now(),
|
||||
traktProgress
|
||||
};
|
||||
await this.setWatchProgress(id, type, updatedProgress, episodeId);
|
||||
lastUpdated: traktTimestamp,
|
||||
traktSynced: true,
|
||||
traktLastSynced: Date.now(),
|
||||
traktProgress
|
||||
};
|
||||
await this.setWatchProgress(id, type, updatedProgress, episodeId);
|
||||
|
||||
// Progress update logging removed
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue