mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-11 11:06:16 -08:00
feat: export/import/delete all playlists
This commit is contained in:
1 parent
839077851e
commit
932eb97bf5
7 files changed
+90
-25
No files matched your search
@@ -7,12 +7,12 @@ import { Channel } from '../../../shared/channel.interface';
|
||||
import { GLOBAL_FAVORITES_PLAYLIST_ID } from '../../../shared/constants';
|
||||
import {
|
||||
Playlist,
|
||||
PlaylistUpdateState
|
||||
PlaylistUpdateState,
|
||||
} from '../../../shared/playlist.interface';
|
||||
import {
|
||||
aggregateFavoriteChannels,
|
||||
createFavoritesPlaylist,
|
||||
createPlaylistObject
|
||||
createPlaylistObject,
|
||||
} from '../../../shared/playlist.utils';
|
||||
import { DbStores } from '../indexed-db.config';
|
||||
import { PlaylistMeta } from '../shared/playlist-meta.type';
|
||||
@@ -193,10 +193,16 @@ export class PlaylistsService {
|
||||
}
|
||||
|
||||
getRawPlaylistById(id: string) {
|
||||
return this.dbService.getByID<Playlist>(DbStores.Playlists, id).pipe(map(playlist => {
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
||||
return playlist.playlist.header.raw + '\n' + playlist.playlist.items.map(item => item.raw).join('\n');
|
||||
}));
|
||||
return this.dbService.getByID<Playlist>(DbStores.Playlists, id).pipe(
|
||||
map((playlist) => {
|
||||
return (
|
||||
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
||||
playlist.playlist.header.raw +
|
||||
'\n' +
|
||||
playlist.playlist.items.map((item) => item.raw).join('\n')
|
||||
);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
getAllData() {
|
||||
@@ -204,8 +210,6 @@ export class PlaylistsService {
|
||||
}
|
||||
|
||||
removeAll() {
|
||||
this.dbService.clear(DbStores.Playlists).subscribe(data => {
|
||||
console.log(data);
|
||||
});
|
||||
return this.dbService.clear(DbStores.Playlists);
|
||||
}
|
||||
}
|
||||
@@ -216,7 +216,7 @@
|
||||
"
|
||||
color="warn"
|
||||
>
|
||||
{{ 'SETTINGS.REMOVE_ALL' | translate }}
|
||||
{{ 'SETTINGS.REMOVE_ALL_BUTTON' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,6 +13,7 @@ import { TranslateService } from '@ngx-translate/core';
|
||||
import { take } from 'rxjs';
|
||||
import * as semver from 'semver';
|
||||
import { EPG_FORCE_FETCH } from '../../../shared/ipc-commands';
|
||||
import { Playlist } from '../../../shared/playlist.interface';
|
||||
import { DataService } from '../services/data.service';
|
||||
import { DialogService } from '../services/dialog.service';
|
||||
import { EpgService } from '../services/epg.service';
|
||||
@@ -302,15 +303,38 @@ export class SettingsComponent implements OnInit {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
const contents = reader.result;
|
||||
console.log(contents);
|
||||
|
||||
const parsedPlaylists = JSON.parse(contents.toString());
|
||||
try {
|
||||
const parsedPlaylists: Playlist[] = JSON.parse(
|
||||
contents.toString()
|
||||
);
|
||||
|
||||
this.store.dispatch(
|
||||
PlaylistActions.addManyPlaylists({
|
||||
playlists: parsedPlaylists,
|
||||
})
|
||||
);
|
||||
if (!Array.isArray(parsedPlaylists)) {
|
||||
this.snackBar.open(
|
||||
this.translate.instant(
|
||||
'SETTINGS.IMPORT_ERROR'
|
||||
),
|
||||
null,
|
||||
{
|
||||
duration: 2000,
|
||||
}
|
||||
);
|
||||
} else {
|
||||
this.store.dispatch(
|
||||
PlaylistActions.addManyPlaylists({
|
||||
playlists: parsedPlaylists,
|
||||
})
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
this.snackBar.open(
|
||||
this.translate.instant('SETTINGS.IMPORT_ERROR'),
|
||||
null,
|
||||
{
|
||||
duration: 2000,
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
reader.readAsText(file);
|
||||
}
|
||||
@@ -324,7 +348,8 @@ export class SettingsComponent implements OnInit {
|
||||
this.dialogService.openConfirmDialog({
|
||||
title: this.translate.instant('SETTINGS.REMOVE_DIALOG.TITLE'),
|
||||
message: this.translate.instant('SETTINGS.REMOVE_DIALOG.MESSAGE'),
|
||||
onConfirm: (): void => this.playlistsService.removeAll(),
|
||||
onConfirm: (): void =>
|
||||
this.store.dispatch(PlaylistActions.removeAllPlaylists()),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -115,3 +115,7 @@ export const updatePlaylistPositions = createAction(
|
||||
positionUpdates: { id: string; changes: { position: number } }[];
|
||||
}>()
|
||||
);
|
||||
|
||||
export const removeAllPlaylists = createAction(
|
||||
`${STORE_KEY} Remove all playlists`
|
||||
);
|
||||
@@ -1,8 +1,10 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router } from '@angular/router';
|
||||
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { combineLatestWith, map, switchMap, tap } from 'rxjs/operators';
|
||||
import {
|
||||
CHANNEL_SET_USER_AGENT,
|
||||
@@ -203,11 +205,32 @@ export class PlaylistEffects {
|
||||
{ dispatch: false }
|
||||
);
|
||||
|
||||
removeAll$ = createEffect(
|
||||
() => {
|
||||
return this.actions$.pipe(
|
||||
ofType(PlaylistActions.removeAllPlaylists),
|
||||
switchMap(() => this.playlistsService.removeAll()),
|
||||
tap(() => {
|
||||
this.snackBar.open(
|
||||
this.translate.instant('SETTINGS.PLAYLISTS_REMOVED'),
|
||||
null,
|
||||
{
|
||||
duration: 2000,
|
||||
}
|
||||
);
|
||||
})
|
||||
);
|
||||
},
|
||||
{ dispatch: false }
|
||||
);
|
||||
|
||||
constructor(
|
||||
private actions$: Actions,
|
||||
private playlistsService: PlaylistsService,
|
||||
private dataService: DataService,
|
||||
private router: Router,
|
||||
private snackBar: MatSnackBar,
|
||||
private store: Store,
|
||||
private router: Router
|
||||
private translate: TranslateService
|
||||
) {}
|
||||
}
|
||||
@@ -205,6 +205,12 @@ export const playlistReducer = createReducer(
|
||||
state.playlists
|
||||
),
|
||||
};
|
||||
}),
|
||||
on(PlaylistActions.removeAllPlaylists, (state): PlaylistState => {
|
||||
return {
|
||||
...state,
|
||||
playlists: playlistsAdapter.removeAll(state.playlists),
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
@@ -90,16 +90,19 @@
|
||||
"VERSION_DESCRIPTION": "Current version of the application",
|
||||
"EPG_NOTE": "Currently EPG is available only in the electron-based version of IPTVnator.",
|
||||
"EPG_NOTE_URL_TEXT": "Check it here",
|
||||
"IMPORT_EXPORT_DATA": "Import/Export playlists",
|
||||
"IMPORT_EXPORT_DATA_DESCRIPTION": "E2xport and import playlists in the JSON format used within the application.",
|
||||
"IMPORT_DATA": "Import playlists",
|
||||
"EXPORT_DATA": "Export playlists",
|
||||
"REMOVE_ALL": "Remove playlists",
|
||||
"IMPORT_EXPORT_DATA": "Import/export playlists",
|
||||
"IMPORT_EXPORT_DATA_DESCRIPTION": "Export or import playlists in the JSON format used within the application.",
|
||||
"IMPORT_DATA": "Import",
|
||||
"EXPORT_DATA": "Export",
|
||||
"REMOVE_ALL": "Remove playlist",
|
||||
"REMOVE_ALL_BUTTON": "Remove",
|
||||
"REMOVE_ALL_DESCRIPTION": "It will remove all existing playlists from the application.",
|
||||
"REMOVE_DIALOG": {
|
||||
"TITLE": "Remove all playlists",
|
||||
"MESSAGE": "Are you sure you want to delete all playlist from the application?"
|
||||
}
|
||||
},
|
||||
"IMPORT_ERROR": "Import error, please try with another file.",
|
||||
"PLAYLISTS_REMOVED": "All playlists were removed."
|
||||
},
|
||||
"THEMES": {
|
||||
"DARK_THEME": "Dark theme",
|
||||
|
||||
Reference in new issue
Block a user