fix: resume from homepage not correctly handling source_id
This commit is contained in:
@@ -1387,6 +1387,7 @@ class WatchPage {
|
|||||||
await window.API.request('POST', '/history', {
|
await window.API.request('POST', '/history', {
|
||||||
id: this.content.id,
|
id: this.content.id,
|
||||||
type: this.content.type === 'movie' ? 'movie' : 'episode',
|
type: this.content.type === 'movie' ? 'movie' : 'episode',
|
||||||
|
sourceId: this.content.sourceId, // Add sourceId at top level for resume
|
||||||
progress,
|
progress,
|
||||||
duration,
|
duration,
|
||||||
data
|
data
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ function initSchema() {
|
|||||||
CREATE TABLE IF NOT EXISTS watch_history (
|
CREATE TABLE IF NOT EXISTS watch_history (
|
||||||
id TEXT PRIMARY KEY, -- Composite key: user_id:item_id
|
id TEXT PRIMARY KEY, -- Composite key: user_id:item_id
|
||||||
user_id INTEGER NOT NULL,
|
user_id INTEGER NOT NULL,
|
||||||
|
source_id INTEGER, -- Source ID for Xtream/M3U
|
||||||
item_type TEXT NOT NULL, -- 'movie', 'episode'
|
item_type TEXT NOT NULL, -- 'movie', 'episode'
|
||||||
item_id TEXT NOT NULL, -- The original item ID (stream_id or composite)
|
item_id TEXT NOT NULL, -- The original item ID (stream_id or composite)
|
||||||
parent_id TEXT, -- For episodes (series ID)
|
parent_id TEXT, -- For episodes (series ID)
|
||||||
@@ -134,6 +135,14 @@ function initSchema() {
|
|||||||
CREATE INDEX IF NOT EXISTS idx_history_user_item ON watch_history(user_id, item_id);
|
CREATE INDEX IF NOT EXISTS idx_history_user_item ON watch_history(user_id, item_id);
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
// Migration: Add source_id column if missing (for existing databases)
|
||||||
|
try {
|
||||||
|
db.exec(`ALTER TABLE watch_history ADD COLUMN source_id INTEGER`);
|
||||||
|
console.log('[SQLite] Added source_id column to watch_history');
|
||||||
|
} catch (e) {
|
||||||
|
// Column already exists, ignore
|
||||||
|
}
|
||||||
|
|
||||||
console.log('[SQLite] Schema initialized');
|
console.log('[SQLite] Schema initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ router.post('/', (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const db = getDb();
|
const db = getDb();
|
||||||
const userId = req.user.id;
|
const userId = req.user.id;
|
||||||
const { id, type, parentId, progress, duration, data } = req.body;
|
const { id, type, parentId, progress, duration, data, sourceId } = req.body;
|
||||||
|
|
||||||
if (!id || !type) {
|
if (!id || !type) {
|
||||||
return res.status(400).json({ error: 'Missing required fields (id, type)' });
|
return res.status(400).json({ error: 'Missing required fields (id, type)' });
|
||||||
@@ -53,9 +53,10 @@ router.post('/', (req, res) => {
|
|||||||
const timestamp = Date.now();
|
const timestamp = Date.now();
|
||||||
|
|
||||||
const stmt = db.prepare(`
|
const stmt = db.prepare(`
|
||||||
INSERT INTO watch_history (id, user_id, item_type, item_id, parent_id, progress, duration, updated_at, data)
|
INSERT INTO watch_history (id, user_id, source_id, item_type, item_id, parent_id, progress, duration, updated_at, data)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
ON CONFLICT(id) DO UPDATE SET
|
ON CONFLICT(id) DO UPDATE SET
|
||||||
|
source_id = excluded.source_id,
|
||||||
progress = excluded.progress,
|
progress = excluded.progress,
|
||||||
duration = excluded.duration,
|
duration = excluded.duration,
|
||||||
updated_at = excluded.updated_at,
|
updated_at = excluded.updated_at,
|
||||||
@@ -65,6 +66,7 @@ router.post('/', (req, res) => {
|
|||||||
stmt.run(
|
stmt.run(
|
||||||
compositeId,
|
compositeId,
|
||||||
userId,
|
userId,
|
||||||
|
sourceId || null,
|
||||||
type,
|
type,
|
||||||
id.toString(),
|
id.toString(),
|
||||||
parentId ? parentId.toString() : null,
|
parentId ? parentId.toString() : null,
|
||||||
|
|||||||
Reference in New Issue
Block a user