fix: normalize favorites and fix stalker nav

This commit is contained in:
4gray committed 2026-01-12 00:39:11 +01:00
1 parent a37192c2ad
commit f26e3e57c8
5 files changed
+51 -20

No files matched your search

@@ -1,13 +1,4 @@
@if (itemDetails) {
<button
mat-button
(click)="itemDetails = null"
[attr.aria-label]="'SETTINGS.BACK_TO_HOME' | translate"
class="back-button"
>
<mat-icon>arrow_back</mat-icon>
{{ 'SETTINGS.BACK_TO_HOME' | translate }}
</button>
@switch (itemDetails.category_id) {
@case ('vod') {
<app-vod-details
@@ -19,10 +10,11 @@
itemDetails.details.info.movie_image
)
"
(backClicked)="itemDetails = null"
/>
}
@case ('series') {
<app-stalker-series-view />
<app-stalker-series-view (backClicked)="itemDetails = null" />
}
}
} @else {
@@ -14,10 +14,7 @@ import { StalkerStore } from '../stalker.store';
templateUrl: './stalker-favorites.component.html',
imports: [
FavoritesLayoutComponent,
MatButton,
MatIcon,
StalkerSeriesViewComponent,
TranslatePipe,
VodDetailsComponent,
],
styles: [
@@ -128,20 +125,21 @@ export class StalkerFavoritesComponent {
openItem(item: any) {
console.debug('Open item', item);
const normalizedItem = this.normalizeFavoriteItem(item);
switch (item.category_id) {
case 'itv':
this.stalkerStore.setSelectedContentType('itv');
this.createLinkToPlayVodItv(item.cmd, item.name, item.logo);
break;
case 'vod':
this.itemDetails = item;
this.stalkerStore.setSelectedItem(item);
this.itemDetails = normalizedItem;
this.stalkerStore.setSelectedItem(normalizedItem.details);
this.stalkerStore.setSelectedContentType('vod');
break;
case 'series':
this.itemDetails = item;
this.stalkerStore.setSelectedItem(item);
this.itemDetails = normalizedItem;
this.stalkerStore.setSelectedItem(normalizedItem.details);
this.stalkerStore.setSelectedContentType('series');
break;
default:
@@ -149,6 +147,41 @@ export class StalkerFavoritesComponent {
}
}
private normalizeFavoriteItem(item: any): any {
if (item.details && item.details.info) {
return item;
}
const source = item.details || item;
const info = source.info || {
name: item.name || item.title || 'Unknown',
movie_image: item.cover || item.screenshot_uri || item.logo,
description: item.description,
releasedate: item.releasedate || item.year,
genre: item.genre || item.genres_str,
duration: item.duration,
rating_imdb: item.rating_imdb || item.rating,
country: item.country,
actors: item.actors,
director: item.director,
backdrop_path:
item.backdrop_path ||
[item.cover, item.screenshot_uri].filter(Boolean),
};
return {
...item,
details: {
...source,
info: info,
cmd: item.cmd || source.cmd,
id: item.stream_id || item.id || source.id,
series: item.series || source.series,
is_series: item.is_series || source.is_series,
},
};
}
async createLinkToPlayVodItv(
cmd?: string,
title?: string,
@@ -4,6 +4,7 @@ import {
effect,
inject,
input,
output,
signal,
} from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
@@ -56,6 +57,7 @@ interface StalkerSeriesSeason {
})
export class StalkerSeriesViewComponent {
readonly stalkerStore = inject(StalkerStore);
readonly backClicked = output<void>();
/**
* Optional input for VOD items with embedded series array (vclub mode)
@@ -349,6 +351,7 @@ export class StalkerSeriesViewComponent {
}
goBack() {
this.backClicked.emit();
this.stalkerStore.clearSelectedItem();
}
}
@@ -96,8 +96,9 @@ export class CategoryContentViewComponent implements OnInit {
},
};
this.store.setSelectedItem(selectedItem);
if (!this.isStalker) {
if (this.isStalker) {
this.store.setSelectedItem(selectedItem);
} else {
this.router.navigate([item.xtream_id], {
relativeTo: this.activatedRoute,
});
@@ -36,6 +36,7 @@ export class VodDetailsComponent implements OnInit {
@Output() addToFavoritesClicked = new EventEmitter<any>();
@Output() playClicked = new EventEmitter<XtreamVodDetails>();
@Output() removeFromFavoritesClicked = new EventEmitter<number>();
@Output() backClicked = new EventEmitter<void>();
private location = inject(Location);
private playlistService = inject(PlaylistsService);
@@ -114,6 +115,7 @@ export class VodDetailsComponent implements OnInit {
}
goBack() {
this.backClicked.emit();
if (this.isStalker) {
// Stalker mode: clear selectedItem to return to category view
this.stalkerStore.clearSelectedItem();