obscreen/src/controller/PlaylistController.py
2024-07-18 17:18:19 +02:00

95 lines
4.7 KiB
Python

import json
from flask import Flask, render_template, redirect, request, url_for, jsonify, abort
from src.service.ModelStore import ModelStore
from src.model.entity.Playlist import Playlist
from src.model.enum.FolderEntity import FolderEntity
from src.model.enum.ContentType import ContentType
from src.interface.ObController import ObController
class PlaylistController(ObController):
def register(self):
self._app.add_url_rule('/playlist', 'playlist', self._auth(self.playlist), methods=['GET'])
self._app.add_url_rule('/playlist/list/<playlist_id>', 'playlist_list', self._auth(self.playlist_list), methods=['GET'])
self._app.add_url_rule('/playlist/add', 'playlist_add', self._auth(self.playlist_add), methods=['POST'])
self._app.add_url_rule('/playlist/save', 'playlist_save', self._auth(self.playlist_save), methods=['POST'])
self._app.add_url_rule('/playlist/delete/<playlist_id>', 'playlist_delete', self._auth(self.playlist_delete), methods=['GET'])
self._app.add_url_rule('/playlist/set-default/<playlist_id>', 'playlist_set_fallback', self._auth(self.playlist_set_fallback), methods=['GET'])
def playlist(self):
return redirect(url_for('playlist_list', playlist_id=0))
def playlist_list(self, playlist_id: int = 0):
self._model_store.variable().update_by_name('last_pillmenu_slideshow', 'playlist')
current_playlist = self._model_store.playlist().get(playlist_id)
playlists = self._model_store.playlist().get_all(sort="created_at", ascending=True)
durations = self._model_store.playlist().get_durations_by_playlists()
working_folder_path = self._model_store.variable().get_one_by_name('last_folder_content').as_string()
working_folder = self._model_store.folder().get_one_by_path(path=working_folder_path, entity=FolderEntity.CONTENT)
slides_with_content = self._model_store.slide().get_all_indexed(attribute='content_id', multiple=True)
if not current_playlist and len(playlists) > 0:
current_playlist = None
return render_template(
'playlist/list.jinja.html',
error=request.args.get('error', None),
current_playlist=current_playlist,
playlists=playlists,
durations=durations,
slides_with_content=slides_with_content,
slides=self._model_store.slide().get_slides(playlist_id=current_playlist.id, is_notification=False) if current_playlist else [],
notifications=self._model_store.slide().get_slides(playlist_id=current_playlist.id, is_notification=True) if current_playlist else [],
foldered_contents=self._model_store.content().get_all_indexed('folder_id', multiple=True),
contents={content.id: {"id": content.id, "name": content.name, "type": content.type.value} for content in self._model_store.content().get_contents()},
working_folder_path=working_folder_path,
working_folder=working_folder,
folders_tree=self._model_store.folder().get_folder_tree(FolderEntity.CONTENT),
enum_content_type=ContentType,
enum_folder_entity=FolderEntity,
)
def playlist_add(self):
playlist = Playlist(
name=request.form['name'],
enabled=True,
time_sync=False
)
try:
playlist = self._model_store.playlist().add_form(playlist)
except:
abort(409)
return redirect(url_for('playlist_list', playlist_id=playlist.id))
def playlist_save(self):
self._model_store.playlist().update_form(
id=request.form['id'],
name=request.form['name'],
time_sync=True if 'time_sync' in request.form else False,
enabled=True if 'enabled' in request.form else False
)
return redirect(url_for('playlist_list', playlist_id=request.form['id']))
def playlist_delete(self, playlist_id: int):
playlist = self._model_store.playlist().get(playlist_id)
if not playlist:
abort(404)
if self._model_store.slide().count_slides_for_playlist(playlist_id) > 0:
return redirect(url_for('playlist_list', playlist_id=playlist_id, error='playlist_delete_has_slides'))
if self._model_store.node_player_group().count_node_player_groups_for_playlist(playlist_id) > 0:
return redirect(url_for('playlist_list', playlist_id=playlist_id, error='playlist_delete_has_node_player_groups'))
self._model_store.playlist().delete(playlist_id)
return redirect(url_for('playlist'))
def playlist_set_fallback(self, playlist_id: int):
self._model_store.playlist().set_fallback(playlist_id)
return redirect(url_for('playlist_list', playlist_id=playlist_id))