@@ -8,6 +8,7 @@ import { ViewState } from "src/types/ViewState";
88import type DownloadedEpisode from "src/types/DownloadedEpisode" ;
99import { TFile } from "obsidian" ;
1010import type { LocalEpisode } from "src/types/LocalEpisode" ;
11+ import { getEpisodeKey } from "src/utility/episodeKey" ;
1112
1213export const plugin = writable < PodNotes > ( ) ;
1314export const currentTime = writable < number > ( 0 ) ;
@@ -46,18 +47,51 @@ export const playedEpisodes = (() => {
4647 const store = writable < { [ key : string ] : PlayedEpisode } > ( { } ) ;
4748 const { subscribe, update, set } = store ;
4849
50+ /**
51+ * Gets played episode data, checking both composite key and legacy title-only key
52+ * for backwards compatibility.
53+ */
54+ function getPlayedEpisode (
55+ playedEps : { [ key : string ] : PlayedEpisode } ,
56+ episode : Episode | null | undefined ,
57+ ) : PlayedEpisode | undefined {
58+ if ( ! episode ) return undefined ;
59+
60+ const key = getEpisodeKey ( episode ) ;
61+ // First try composite key
62+ if ( key && playedEps [ key ] ) {
63+ return playedEps [ key ] ;
64+ }
65+ // Fall back to title-only for backwards compatibility
66+ if ( episode . title && playedEps [ episode . title ] ) {
67+ return playedEps [ episode . title ] ;
68+ }
69+ return undefined ;
70+ }
71+
4972 return {
5073 subscribe,
5174 set,
5275 update,
76+ /**
77+ * Gets played episode data with backwards compatibility.
78+ */
79+ get : ( episode : Episode ) : PlayedEpisode | undefined => {
80+ return getPlayedEpisode ( get ( store ) , episode ) ;
81+ } ,
5382 setEpisodeTime : (
54- episode : Episode ,
83+ episode : Episode | null | undefined ,
5584 time : number ,
5685 duration : number ,
5786 finished : boolean ,
5887 ) => {
88+ if ( ! episode ) return ;
89+
5990 update ( ( playedEpisodes ) => {
60- playedEpisodes [ episode . title ] = {
91+ const key = getEpisodeKey ( episode ) ;
92+ if ( ! key ) return playedEpisodes ;
93+
94+ playedEpisodes [ key ] = {
6195 title : episode . title ,
6296 podcastName : episode . podcastName ,
6397 time,
@@ -68,29 +102,47 @@ export const playedEpisodes = (() => {
68102 return playedEpisodes ;
69103 } ) ;
70104 } ,
71- markAsPlayed : ( episode : Episode ) => {
105+ markAsPlayed : ( episode : Episode | null | undefined ) => {
106+ if ( ! episode ) return ;
107+
72108 update ( ( playedEpisodes ) => {
73- const playedEpisode = playedEpisodes [ episode . title ] || episode ;
109+ const key = getEpisodeKey ( episode ) ;
110+ if ( ! key ) return playedEpisodes ;
74111
75- if ( playedEpisode ) {
76- playedEpisode . time = playedEpisode . duration ;
77- playedEpisode . finished = true ;
78- }
112+ const playedEpisode = getPlayedEpisode ( playedEpisodes , episode ) || {
113+ title : episode . title ,
114+ podcastName : episode . podcastName ,
115+ time : 0 ,
116+ duration : 0 ,
117+ finished : false ,
118+ } ;
79119
80- playedEpisodes [ episode . title ] = playedEpisode ;
120+ playedEpisode . time = playedEpisode . duration ;
121+ playedEpisode . finished = true ;
122+
123+ playedEpisodes [ key ] = playedEpisode ;
81124 return playedEpisodes ;
82125 } ) ;
83126 } ,
84- markAsUnplayed : ( episode : Episode ) => {
127+ markAsUnplayed : ( episode : Episode | null | undefined ) => {
128+ if ( ! episode ) return ;
129+
85130 update ( ( playedEpisodes ) => {
86- const playedEpisode = playedEpisodes [ episode . title ] || episode ;
131+ const key = getEpisodeKey ( episode ) ;
132+ if ( ! key ) return playedEpisodes ;
87133
88- if ( playedEpisode ) {
89- playedEpisode . time = 0 ;
90- playedEpisode . finished = false ;
91- }
134+ const playedEpisode = getPlayedEpisode ( playedEpisodes , episode ) || {
135+ title : episode . title ,
136+ podcastName : episode . podcastName ,
137+ time : 0 ,
138+ duration : 0 ,
139+ finished : false ,
140+ } ;
92141
93- playedEpisodes [ episode . title ] = playedEpisode ;
142+ playedEpisode . time = 0 ;
143+ playedEpisode . finished = false ;
144+
145+ playedEpisodes [ key ] = playedEpisode ;
94146 return playedEpisodes ;
95147 } ) ;
96148 } ,
@@ -313,11 +365,16 @@ export const downloadedEpisodes = (() => {
313365 const index = podcastEpisodes . findIndex (
314366 ( e ) => e . title === episode . title ,
315367 ) ;
316- const filePath = podcastEpisodes [ index ] . filePath ;
317368
369+ // Guard against episode not found
370+ if ( index === - 1 ) {
371+ return downloadedEpisodes ;
372+ }
373+
374+ const filePath = podcastEpisodes [ index ] . filePath ;
318375 podcastEpisodes . splice ( index , 1 ) ;
319376
320- if ( removeFile ) {
377+ if ( removeFile && filePath ) {
321378 try {
322379 // @ts -ignore: app is not defined in the global scope anymore, but is still
323380 // available. Need to fix this later
0 commit comments