unified-video-framework 1.4.156 → 1.4.158

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/package.json +1 -1
  2. package/packages/web/dist/WebPlayer.d.ts +8 -0
  3. package/packages/web/dist/WebPlayer.d.ts.map +1 -1
  4. package/packages/web/dist/WebPlayer.js +220 -55
  5. package/packages/web/dist/WebPlayer.js.map +1 -1
  6. package/packages/web/dist/chapters/ChapterManager.d.ts.map +1 -1
  7. package/packages/web/dist/chapters/ChapterManager.js +22 -0
  8. package/packages/web/dist/chapters/ChapterManager.js.map +1 -1
  9. package/packages/web/dist/chapters/types/ChapterTypes.d.ts +1 -0
  10. package/packages/web/dist/chapters/types/ChapterTypes.d.ts.map +1 -1
  11. package/packages/web/dist/chapters/types/ChapterTypes.js +2 -1
  12. package/packages/web/dist/chapters/types/ChapterTypes.js.map +1 -1
  13. package/packages/web/dist/react/WebPlayerView.d.ts +1 -0
  14. package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
  15. package/packages/web/dist/react/WebPlayerView.js +1 -0
  16. package/packages/web/dist/react/WebPlayerView.js.map +1 -1
  17. package/packages/web/src/WebPlayer.ts +305 -72
  18. package/packages/web/src/chapters/ChapterManager.ts +32 -0
  19. package/packages/web/src/chapters/types/ChapterTypes.ts +5 -1
  20. package/packages/web/src/react/WebPlayerView.tsx +2 -0
  21. package/packages/core/dist/chapter-manager.d.ts +0 -39
  22. package/packages/ios/README.md +0 -84
  23. package/packages/web/dist/HTML5Player.js.map +0 -1
  24. package/packages/web/dist/epg/EPGController.d.ts +0 -78
  25. package/packages/web/dist/epg/EPGController.d.ts.map +0 -1
  26. package/packages/web/dist/epg/EPGController.js +0 -476
  27. package/packages/web/dist/epg/EPGController.js.map +0 -1
@@ -1,84 +0,0 @@
1
- # UnifiedVideoPlayer (iOS SDK)
2
-
3
- A unified iOS video player SDK with:
4
- - HLS playback (AVPlayer)
5
- - FairPlay DRM (SPC/CKC)
6
- - Subtitles/audio track selection (AVMediaSelection)
7
- - Picture-in-Picture (AVPictureInPictureController)
8
- - AirPlay (AVRoutePickerView)
9
- - Remote Command Center + Now Playing (lock screen controls)
10
- - Background audio (AVAudioSession)
11
-
12
- ## Installation
13
-
14
- ### CocoaPods
15
- 1) Ensure this SDK is in a public Git repository. Update the podspec `s.source` to point at that repo and tag.
16
- 2) In your Podfile:
17
- ```ruby
18
- platform :ios, '13.0'
19
- use_frameworks!
20
-
21
- target 'YourApp' do
22
- pod 'UnifiedVideoPlayer', :git => 'https://github.com/yourcompany/unified-video-ios.git', :tag => '1.0.0'
23
- end
24
- ```
25
- 3) Run:
26
- ```bash
27
- pod install
28
- ```
29
-
30
- ### Swift Package Manager
31
- Add the package at the repository URL or use Add Local Package pointing to `packages/ios`.
32
-
33
- ## Quick Start
34
- ```swift
35
- import UnifiedVideoPlayer
36
-
37
- let containerView = UIView(frame: .zero)
38
- let player = UnifiedVideoPlayer()
39
- let config = PlayerConfiguration()
40
- config.autoPlay = true
41
-
42
- player.initialize(container: containerView, configuration: config)
43
-
44
- let source = MediaSource(url: "https://example.com/stream.m3u8")
45
- source.metadata = ["title": "Demo Stream"]
46
- player.onReady = { print("ready") }
47
- player.onQualityChange = { br in print("bitrate: \(br)") }
48
-
49
- player.load(source: source)
50
- ```
51
-
52
- ### FairPlay DRM
53
- ```swift
54
- let drm = DRMConfiguration(type: "fairplay", licenseUrl: "https://license.example.com/fps")
55
- drm.certificateUrl = "https://license.example.com/cert"
56
- drm.headers = ["X-Tenant-ID": "default"]
57
-
58
- let source = MediaSource(url: "https://cdn.example.com/protected/playlist.m3u8")
59
- source.drm = drm
60
- player.load(source: source)
61
- ```
62
-
63
- ### Tracks
64
- ```swift
65
- let audios = player.audioTracks() // [String]
66
- let subs = player.subtitleTracks() // [String]
67
- player.selectAudioTrack(index: 0)
68
- player.selectSubtitleTrack(index: -1) // off
69
- ```
70
-
71
- ### PiP & AirPlay
72
- ```swift
73
- player.startPictureInPicture()
74
- player.stopPictureInPicture()
75
- let airPlay = player.makeAirPlayPickerView()
76
- ```
77
-
78
- ## Capabilities
79
- - Enable Background Modes > Audio
80
- - For DRM endpoints, configure ATS exceptions if necessary.
81
-
82
- ## License
83
- MIT
84
-
@@ -1 +0,0 @@
1
- {"version":3,"file":"HTML5Player.js","sourceRoot":"","sources":["../src/HTML5Player.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- export interface EPGProgram {
2
- id: number;
3
- title: string;
4
- description?: string;
5
- since: string;
6
- till: string;
7
- image?: string;
8
- source_type_id: number;
9
- }
10
- export interface EPGChannel {
11
- channelId: string;
12
- channelLogo?: string;
13
- channelName: string;
14
- channelNumber: string;
15
- programs: EPGProgram[];
16
- }
17
- export interface EPGConfig {
18
- enabled?: boolean;
19
- channels?: EPGChannel[];
20
- ui?: {
21
- title?: string;
22
- showFavorites?: boolean;
23
- showRecording?: boolean;
24
- showReminder?: boolean;
25
- showCatchup?: boolean;
26
- brandColor?: string;
27
- backgroundColor?: string;
28
- textColor?: string;
29
- };
30
- callbacks?: {
31
- onProgramSelect?: (program: EPGProgram) => void;
32
- onFavoriteToggle?: (program: EPGProgram, isFavorite: boolean) => void;
33
- onRecordingToggle?: (program: EPGProgram, isRecording: boolean) => void;
34
- onReminderSet?: (program: EPGProgram) => void;
35
- onCatchupRequest?: (program: EPGProgram) => void;
36
- };
37
- }
38
- export declare class EPGController {
39
- private config;
40
- private container;
41
- private epgElement;
42
- private isVisible;
43
- private currentDate;
44
- private selectedTimeSlot;
45
- private favoritePrograms;
46
- private recordingPrograms;
47
- private timeIndicatorInterval;
48
- constructor(config: EPGConfig);
49
- private updateCurrentTimeIndicator;
50
- setContainer(container: HTMLElement): void;
51
- show(): void;
52
- hide(): void;
53
- toggle(): void;
54
- updateChannels(channels: EPGChannel[]): void;
55
- private initializeEPG;
56
- private generateProgramHTML;
57
- private createEPGOverlay;
58
- private generateEPGHTML;
59
- private generateProgramBlocks;
60
- private generateTimeSlots;
61
- private isCurrentTimeSlot;
62
- private setupEPGEventListeners;
63
- private navigateDate;
64
- private refreshEPGContent;
65
- private setInitialTimeSlot;
66
- private scrollToCurrentTime;
67
- private getRemainingTime;
68
- private findProgramById;
69
- private showProgramDetails;
70
- private removeProgramDetails;
71
- private setupDetailsEventListeners;
72
- private toggleFavorite;
73
- private toggleRecording;
74
- private formatTime;
75
- private formatDate;
76
- destroy(): void;
77
- }
78
- //# sourceMappingURL=EPGController.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EPGController.d.ts","sourceRoot":"","sources":["../../src/epg/EPGController.ts"],"names":[],"mappings":"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"}
@@ -1,476 +0,0 @@
1
- export class EPGController {
2
- constructor(config) {
3
- this.container = null;
4
- this.epgElement = null;
5
- this.isVisible = false;
6
- this.currentDate = new Date();
7
- this.selectedTimeSlot = '';
8
- this.favoritePrograms = new Set();
9
- this.recordingPrograms = new Set();
10
- this.config = config;
11
- this.initializeEPG();
12
- }
13
- updateCurrentTimeIndicator() {
14
- if (!this.epgElement)
15
- return;
16
- const indicator = this.epgElement.querySelector('.uvf-epg-current-time-indicator');
17
- if (indicator) {
18
- const now = new Date();
19
- const startOfDay = new Date(now);
20
- startOfDay.setHours(0, 0, 0, 0);
21
- const minutesPast = (now.getTime() - startOfDay.getTime()) / 60000;
22
- const leftPosition = (minutesPast / 30) * 200;
23
- indicator.style.left = `${leftPosition}px`;
24
- }
25
- }
26
- setContainer(container) {
27
- this.container = container;
28
- }
29
- show() {
30
- if (!this.container || !this.config.enabled)
31
- return;
32
- this.createEPGOverlay();
33
- this.isVisible = true;
34
- setTimeout(() => {
35
- if (this.epgElement) {
36
- this.epgElement.classList.add('visible');
37
- }
38
- }, 10);
39
- }
40
- hide() {
41
- if (!this.epgElement)
42
- return;
43
- this.epgElement.classList.remove('visible');
44
- setTimeout(() => {
45
- if (this.epgElement && this.container) {
46
- this.container.removeChild(this.epgElement);
47
- this.epgElement = null;
48
- this.isVisible = false;
49
- }
50
- }, 300);
51
- }
52
- toggle() {
53
- if (this.isVisible) {
54
- this.hide();
55
- }
56
- else {
57
- this.show();
58
- }
59
- }
60
- updateChannels(channels) {
61
- this.config.channels = channels;
62
- if (this.isVisible) {
63
- this.refreshEPGContent();
64
- }
65
- }
66
- initializeEPG() {
67
- try {
68
- const favorites = localStorage.getItem('uvf-epg-favorites');
69
- if (favorites) {
70
- this.favoritePrograms = new Set(JSON.parse(favorites));
71
- }
72
- const recordings = localStorage.getItem('uvf-epg-recordings');
73
- if (recordings) {
74
- this.recordingPrograms = new Set(JSON.parse(recordings));
75
- }
76
- }
77
- catch (e) {
78
- console.warn('Failed to load EPG preferences from localStorage');
79
- }
80
- }
81
- generateProgramHTML(program, timeSlots, currentTime) {
82
- const startTime = new Date(program.since);
83
- const endTime = new Date(program.till);
84
- const isCurrentProgram = currentTime >= startTime && currentTime <= endTime;
85
- const isPastProgram = currentTime > endTime;
86
- const duration = (endTime.getTime() - startTime.getTime()) / (1000 * 60 * 60);
87
- const width = Math.max(duration * 120, 120);
88
- const dayStart = new Date(startTime);
89
- dayStart.setHours(6, 0, 0, 0);
90
- const offsetHours = (startTime.getTime() - dayStart.getTime()) / (1000 * 60 * 60);
91
- const leftOffset = Math.max(offsetHours * 120, 0);
92
- const isFavorite = this.favoritePrograms.has(program.id);
93
- const isRecording = this.recordingPrograms.has(program.id);
94
- return `
95
- <div class="uvf-epg-program ${isCurrentProgram ? 'current' : ''} ${isPastProgram ? 'past' : ''}"
96
- data-program-id="${program.id}"
97
- data-start="${program.since}"
98
- data-end="${program.till}"
99
- style="width: ${width}px; margin-left: ${leftOffset}px; flex-shrink: 0;">
100
- <div class="uvf-epg-program-content">
101
- <div class="uvf-epg-program-time">
102
- ${this.formatTime(program.since)} - ${this.formatTime(program.till)}
103
- </div>
104
- <div class="uvf-epg-program-title">${program.title}</div>
105
- <div class="uvf-epg-program-indicators">
106
- ${isFavorite ? '<span class="uvf-epg-indicator favorite">♥</span>' : ''}
107
- ${isRecording ? '<span class="uvf-epg-indicator recording">⏺</span>' : ''}
108
- ${isCurrentProgram ? '<span class="uvf-epg-indicator live">LIVE</span>' : ''}
109
- </div>
110
- </div>
111
- </div>
112
- `;
113
- }
114
- createEPGOverlay() {
115
- if (!this.container || this.epgElement)
116
- return;
117
- this.epgElement = document.createElement('div');
118
- this.epgElement.className = 'uvf-epg-overlay';
119
- this.epgElement.innerHTML = this.generateEPGHTML();
120
- this.container.appendChild(this.epgElement);
121
- this.setupEPGEventListeners();
122
- this.setInitialTimeSlot();
123
- }
124
- generateEPGHTML() {
125
- const channels = this.config.channels || [];
126
- const currentTime = new Date();
127
- const timeSlots = this.generateTimeSlots(currentTime);
128
- return `
129
- <div class="uvf-epg-container">
130
- <div class="uvf-epg-header">
131
- <h2>${this.config.ui?.title || 'TV Guide'}</h2>
132
- <div class="uvf-epg-date-nav">
133
- <button class="uvf-epg-nav-btn" data-direction="prev"><</button>
134
- <span>${this.formatDate(this.currentDate)}</span>
135
- <button class="uvf-epg-nav-btn" data-direction="next">></button>
136
- </div>
137
- <button class="uvf-epg-close-btn">×</button>
138
- </div>
139
- <div class="uvf-epg-body">
140
- <div class="uvf-epg-time-bar">
141
- <div class="uvf-epg-time-bar-spacer"></div>
142
- ${timeSlots.map(slot => `<div class="uvf-epg-time-slot">${slot}</div>`).join('')}
143
- </div>
144
- <div class="uvf-epg-grid">
145
- <div class="uvf-epg-channel-list">
146
- ${channels.map(channel => `
147
- <div class="uvf-epg-channel-info">
148
- <img src="${channel.channelLogo}" alt="${channel.channelName}" class="uvf-epg-channel-logo">
149
- <span class="uvf-epg-channel-number">${channel.channelNumber}</span>
150
- <span class="uvf-epg-channel-name">${channel.channelName}</span>
151
- </div>
152
- `).join('')}
153
- </div>
154
- <div class="uvf-epg-program-grid">
155
- ${channels.map(channel => `
156
- <div class="uvf-epg-program-row">
157
- ${this.generateProgramBlocks(channel.programs, currentTime)}
158
- </div>
159
- `).join('')}
160
- <div class="uvf-epg-current-time-indicator"></div>
161
- </div>
162
- </div>
163
- </div>
164
- </div>
165
- `;
166
- }
167
- generateProgramBlocks(programs, currentTime) {
168
- return programs.map(program => {
169
- const start = new Date(program.since);
170
- const end = new Date(program.till);
171
- const durationMinutes = (end.getTime() - start.getTime()) / 60000;
172
- const width = (durationMinutes / 30) * 200;
173
- const isCurrent = currentTime >= start && currentTime < end;
174
- const isPast = currentTime >= end;
175
- return `
176
- <div
177
- class="uvf-epg-program-block ${isCurrent ? 'current' : ''} ${isPast ? 'past' : ''}"
178
- style="width: ${width}px;"
179
- data-program-id="${program.id}"
180
- >
181
- <span class="uvf-epg-program-title">${program.title}</span>
182
- </div>
183
- `;
184
- }).join('');
185
- }
186
- generateTimeSlots(currentTime) {
187
- const slots = [];
188
- for (let hour = 6; hour < 30; hour++) {
189
- const displayHour = hour >= 24 ? hour - 24 : hour;
190
- const period = displayHour >= 12 ? 'PM' : 'AM';
191
- const displayHour12 = displayHour === 0 ? 12 : displayHour > 12 ? displayHour - 12 : displayHour;
192
- slots.push(`${displayHour12}:00 ${period}`);
193
- }
194
- return slots;
195
- }
196
- isCurrentTimeSlot(timeSlot) {
197
- const now = new Date();
198
- const currentHour = now.getHours();
199
- const currentHour12 = currentHour === 0 ? 12 : currentHour > 12 ? currentHour - 12 : currentHour;
200
- const period = currentHour >= 12 ? 'PM' : 'AM';
201
- const currentTimeString = `${currentHour12}:00 ${period}`;
202
- return timeSlot === currentTimeString;
203
- }
204
- setupEPGEventListeners() {
205
- if (!this.epgElement)
206
- return;
207
- const closeBtn = this.epgElement.querySelector('.uvf-epg-close-btn');
208
- closeBtn?.addEventListener('click', () => this.hide());
209
- const navButtons = this.epgElement.querySelectorAll('.uvf-epg-nav-btn');
210
- navButtons.forEach(btn => {
211
- btn.addEventListener('click', (e) => {
212
- const direction = e.target.getAttribute('data-direction');
213
- if (direction === 'prev') {
214
- this.navigateDate(-1);
215
- }
216
- else if (direction === 'next') {
217
- this.navigateDate(1);
218
- }
219
- });
220
- });
221
- const todayBtn = this.epgElement.querySelector('.uvf-epg-today-btn');
222
- todayBtn?.addEventListener('click', () => {
223
- this.currentDate = new Date();
224
- this.refreshEPGContent();
225
- });
226
- const programs = this.epgElement.querySelectorAll('.uvf-epg-program');
227
- programs.forEach(program => {
228
- program.addEventListener('click', (e) => {
229
- const programId = parseInt(e.currentTarget.getAttribute('data-program-id') || '0');
230
- const programData = this.findProgramById(programId);
231
- if (programData) {
232
- this.showProgramDetails(programData, e.currentTarget);
233
- }
234
- });
235
- });
236
- const scrollLeftBtn = this.epgElement.querySelector('#uvf-epg-scroll-left');
237
- const scrollRightBtn = this.epgElement.querySelector('#uvf-epg-scroll-right');
238
- const channelsContainer = this.epgElement.querySelector('#uvf-epg-channels-container');
239
- const timeSlotsContainer = this.epgElement.querySelector('#uvf-epg-time-slots');
240
- const programContainers = this.epgElement.querySelectorAll('.uvf-epg-channel-programs');
241
- scrollLeftBtn?.addEventListener('click', () => {
242
- if (channelsContainer && timeSlotsContainer) {
243
- const scrollAmount = 240;
244
- timeSlotsContainer.scrollBy({ left: -scrollAmount, behavior: 'smooth' });
245
- programContainers.forEach(container => {
246
- container.scrollBy({ left: -scrollAmount, behavior: 'smooth' });
247
- });
248
- }
249
- });
250
- scrollRightBtn?.addEventListener('click', () => {
251
- if (channelsContainer && timeSlotsContainer) {
252
- const scrollAmount = 240;
253
- timeSlotsContainer.scrollBy({ left: scrollAmount, behavior: 'smooth' });
254
- programContainers.forEach(container => {
255
- container.scrollBy({ left: scrollAmount, behavior: 'smooth' });
256
- });
257
- }
258
- });
259
- timeSlotsContainer?.addEventListener('scroll', (e) => {
260
- const scrollLeft = e.target.scrollLeft;
261
- programContainers.forEach(container => {
262
- container.scrollLeft = scrollLeft;
263
- });
264
- });
265
- programContainers.forEach(container => {
266
- container.addEventListener('scroll', (e) => {
267
- const scrollLeft = e.target.scrollLeft;
268
- if (timeSlotsContainer) {
269
- timeSlotsContainer.scrollLeft = scrollLeft;
270
- }
271
- programContainers.forEach(otherContainer => {
272
- if (otherContainer !== e.target) {
273
- otherContainer.scrollLeft = scrollLeft;
274
- }
275
- });
276
- });
277
- });
278
- document.addEventListener('keydown', (e) => {
279
- if (e.key === 'Escape' && this.isVisible) {
280
- this.hide();
281
- }
282
- });
283
- }
284
- navigateDate(days) {
285
- this.currentDate.setDate(this.currentDate.getDate() + days);
286
- this.refreshEPGContent();
287
- }
288
- refreshEPGContent() {
289
- if (!this.epgElement)
290
- return;
291
- this.epgElement.innerHTML = this.generateEPGHTML();
292
- this.setupEPGEventListeners();
293
- this.setInitialTimeSlot();
294
- }
295
- setInitialTimeSlot() {
296
- const now = new Date();
297
- const currentHour = now.getHours();
298
- const currentHour12 = currentHour === 0 ? 12 : currentHour > 12 ? currentHour - 12 : currentHour;
299
- const period = currentHour >= 12 ? 'PM' : 'AM';
300
- this.selectedTimeSlot = `${currentHour12}:00 ${period}`;
301
- this.scrollToCurrentTime();
302
- }
303
- scrollToCurrentTime() {
304
- if (!this.epgElement)
305
- return;
306
- const timeSlotsContainer = this.epgElement.querySelector('#uvf-epg-time-slots');
307
- const currentSlot = this.epgElement.querySelector('.uvf-epg-time-slot.current-time');
308
- if (timeSlotsContainer && currentSlot) {
309
- const containerWidth = timeSlotsContainer.clientWidth;
310
- const slotLeft = currentSlot.offsetLeft;
311
- const scrollPosition = slotLeft - (containerWidth / 2) + (currentSlot.clientWidth / 2);
312
- timeSlotsContainer.scrollTo({
313
- left: scrollPosition,
314
- behavior: 'smooth'
315
- });
316
- }
317
- }
318
- getRemainingTime(endTime) {
319
- const end = new Date(endTime);
320
- const now = new Date();
321
- const diff = end.getTime() - now.getTime();
322
- if (diff <= 0) {
323
- return 'Finished';
324
- }
325
- const minutes = Math.floor(diff / 60000);
326
- return `${minutes} min remaining`;
327
- }
328
- findProgramById(programId) {
329
- const channels = this.config.channels || [];
330
- for (const channel of channels) {
331
- const program = channel.programs.find(p => p.id === programId);
332
- if (program)
333
- return program;
334
- }
335
- return null;
336
- }
337
- showProgramDetails(program, programElement) {
338
- this.removeProgramDetails();
339
- const detailsHtml = `
340
- <div class="uvf-epg-program-details-inline">
341
- <div class="uvf-epg-details-content">
342
- <div class="uvf-epg-details-header">
343
- <button class="uvf-epg-details-back-btn">< Back</button>
344
- <h3 class="uvf-epg-details-title">${program.title}</h3>
345
- </div>
346
- <div class="uvf-epg-details-body">
347
- <p>${program.description || 'No description available.'}</p>
348
- <div class="uvf-epg-details-time">
349
- <span>${this.formatTime(program.since)} - ${this.formatTime(program.till)}</span>
350
- <span>${this.getRemainingTime(program.till)}</span>
351
- </div>
352
- <div class="uvf-epg-details-actions">
353
- <button class="uvf-epg-action-btn">Add to Favourite</button>
354
- <button class="uvf-epg-action-btn">Record</button>
355
- <button class="uvf-epg-action-btn">Set Reminder</button>
356
- <button class="uvf-epg-action-btn">Catchup</button>
357
- </div>
358
- </div>
359
- </div>
360
- <div class="uvf-epg-details-ad">
361
- <img src="https://via.placeholder.com/300x250.png?text=Ad" alt="Advertisement">
362
- </div>
363
- </div>
364
- `;
365
- const programRow = programElement.closest('.uvf-epg-program-row');
366
- if (programRow) {
367
- const detailsElement = document.createElement('div');
368
- detailsElement.className = 'uvf-epg-details-wrapper';
369
- detailsElement.innerHTML = detailsHtml;
370
- programRow.after(detailsElement);
371
- this.setupDetailsEventListeners(program, detailsElement);
372
- }
373
- }
374
- removeProgramDetails() {
375
- const existingDetails = this.epgElement?.querySelector('.uvf-epg-details-wrapper');
376
- if (existingDetails) {
377
- existingDetails.remove();
378
- }
379
- }
380
- setupDetailsEventListeners(program, detailsElement) {
381
- if (!this.epgElement)
382
- return;
383
- const detailsPanel = this.epgElement.querySelector('.uvf-epg-program-details');
384
- if (!detailsPanel)
385
- return;
386
- const closeBtn = detailsPanel.querySelector('.uvf-epg-details-close');
387
- closeBtn?.addEventListener('click', () => {
388
- detailsPanel.remove();
389
- });
390
- const favoriteBtn = detailsPanel.querySelector('.favorite-btn');
391
- favoriteBtn?.addEventListener('click', () => {
392
- this.toggleFavorite(program);
393
- detailsPanel.remove();
394
- });
395
- const recordingBtn = detailsPanel.querySelector('.recording-btn');
396
- recordingBtn?.addEventListener('click', () => {
397
- this.toggleRecording(program);
398
- detailsPanel.remove();
399
- });
400
- const reminderBtn = detailsPanel.querySelector('.reminder-btn');
401
- reminderBtn?.addEventListener('click', () => {
402
- this.config.callbacks?.onReminderSet?.(program);
403
- detailsPanel.remove();
404
- });
405
- const catchupBtn = detailsPanel.querySelector('.catchup-btn');
406
- catchupBtn?.addEventListener('click', () => {
407
- this.config.callbacks?.onCatchupRequest?.(program);
408
- detailsPanel.remove();
409
- });
410
- detailsPanel.addEventListener('click', (e) => {
411
- if (e.target === detailsPanel) {
412
- detailsPanel.remove();
413
- }
414
- });
415
- }
416
- toggleFavorite(program) {
417
- if (this.favoritePrograms.has(program.id)) {
418
- this.favoritePrograms.delete(program.id);
419
- }
420
- else {
421
- this.favoritePrograms.add(program.id);
422
- }
423
- try {
424
- localStorage.setItem('uvf-epg-favorites', JSON.stringify([...this.favoritePrograms]));
425
- }
426
- catch (e) {
427
- console.warn('Failed to save favorites to localStorage');
428
- }
429
- this.config.callbacks?.onFavoriteToggle?.(program, this.favoritePrograms.has(program.id));
430
- this.refreshEPGContent();
431
- }
432
- toggleRecording(program) {
433
- if (this.recordingPrograms.has(program.id)) {
434
- this.recordingPrograms.delete(program.id);
435
- }
436
- else {
437
- this.recordingPrograms.add(program.id);
438
- }
439
- try {
440
- localStorage.setItem('uvf-epg-recordings', JSON.stringify([...this.recordingPrograms]));
441
- }
442
- catch (e) {
443
- console.warn('Failed to save recordings to localStorage');
444
- }
445
- this.config.callbacks?.onRecordingToggle?.(program, this.recordingPrograms.has(program.id));
446
- this.refreshEPGContent();
447
- }
448
- formatTime(dateString) {
449
- try {
450
- const date = new Date(dateString);
451
- return date.toLocaleTimeString('en-US', {
452
- hour: 'numeric',
453
- minute: '2-digit',
454
- hour12: true
455
- });
456
- }
457
- catch (e) {
458
- return dateString;
459
- }
460
- }
461
- formatDate(date) {
462
- return date.toLocaleDateString('en-US', {
463
- weekday: 'long',
464
- year: 'numeric',
465
- month: 'long',
466
- day: 'numeric'
467
- });
468
- }
469
- destroy() {
470
- this.hide();
471
- document.removeEventListener('keydown', () => { });
472
- this.container = null;
473
- this.epgElement = null;
474
- }
475
- }
476
- //# sourceMappingURL=EPGController.js.map