| #// Copyright (c) 2000-2017 Ericsson Telecom AB // |
| #// All rights reserved. This program and the accompanying materials are made available under the terms // |
| #// of the Eclipse Public License v2.0 which accompanies this distribution, and is available at // |
| #// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // |
| #///////////////////////////////////////////////////////////////////////////////////////////////////////// |
| import os, json, logging |
| from Common.DsRestAPI import DsRestAPI |
| from ScheduledPlaylist import ScheduledPlaylist |
| from Help import DSHELP |
| |
| class Playlist: |
| |
| SOURCE_ID = 'Playlist' |
| |
| def __init__(self, directory): |
| self._logger = logging.getLogger(__name__) |
| self._playlistDir = os.path.join(directory, 'Playlists') |
| self._dsRestAPI = DsRestAPI(self._getDataHandler, self._setDataHandler) |
| self._running = {} |
| |
| def _getDataHandler(self, request, userCredentials): |
| element = request['element'] |
| params = request['params'] |
| |
| if element == 'help': |
| help = {'sources': [{'source': self.SOURCE_ID, 'dataElements': DSHELP}]} |
| return {'node': {'val': json.dumps(help).encode('hex'), 'tp': 5}} |
| elif element == 'Playlists': |
| list = [] |
| for dir in os.listdir(self._playlistDir): |
| if dir in userCredentials['groups']: |
| for file in os.listdir(os.path.join(self._playlistDir, dir)): |
| if file.endswith('.json'): |
| list.append({'node': {'val': os.path.join(dir, file)[:-5], 'tp': 10}}) |
| list.sort(key = lambda element: element['node']['val']) |
| return {'list': list} |
| elif len(params) == 1 and params[0]['paramName'] == 'Playlist': |
| playlist = params[0]['paramValue'] |
| if playlist.split('/')[0] in userCredentials['groups']: |
| if element == 'Status': |
| if playlist in self._running: |
| return self._running[params[0]['paramValue']].getStatus() |
| else: |
| return {'node': {'val': '[led:blue]Not running', 'tp': 11}} |
| elif element == 'Start': |
| tp = 1 |
| if playlist in self._running and self._running[playlist].isRunning(): |
| tp = -1 |
| return {'node': {'val': '0', 'tp': tp}} |
| elif element == 'Stop': |
| tp = -1 |
| if playlist in self._running and self._running[playlist].isRunning(): |
| tp = 1 |
| return {'node': {'val': '0', 'tp': tp}} |
| elif element == 'Pause': |
| tp = -1 |
| if playlist in self._running and self._running[playlist].isRunning(): |
| tp = 1 |
| return {'node': {'val': '0', 'tp': tp}} |
| elif element == 'Edit': |
| return {'node': {'val': playlist, 'tp': 4}} |
| elif element == 'Delete': |
| return {'node': {'val': '0', 'tp': 1}} |
| elif element == 'Descriptor': |
| with open(os.path.join(self._playlistDir, playlist) + '.json', 'r') as f: |
| content = f.read() |
| return {'node': {'val': content, 'tp': 4}} |
| else: |
| return {'node': {'val': '', 'tp': 0}} |
| |
| def _setDataHandler(self, request, userCredentials): |
| element = request['element'] |
| params = request['params'] |
| content = request['content'] |
| |
| if len(params) == 1 and params[0]['paramName'] == 'Playlist': |
| playlist = params[0]['paramValue'] |
| group = playlist.split('/')[0] |
| if group in userCredentials['groups']: |
| if element == 'Start': |
| return self._start(playlist, userCredentials) |
| elif element == 'Stop': |
| return self._stop(playlist) |
| elif element == 'Pause': |
| return self._pause(playlist) |
| elif element == 'Descriptor': |
| groupDir = os.path.join(self._playlistDir, group) |
| if not os.path.exists(groupDir): |
| os.makedirs(groupDir) |
| with open(os.path.join(self._playlistDir, playlist) + '.json', 'w') as f: |
| f.write(content) |
| return {'node': {'val': 'saved', 'tp': 4}} |
| elif element == 'Delete': |
| fileName = os.path.join(self._playlistDir, playlist) + '.json' |
| os.unlink(fileName) |
| return {'node': {'val': '0', 'tp': 1}} |
| else: |
| return {'node': {'val': '', 'tp': 0}} |
| |
| def _createPlaylistExecutor(self, descriptor): |
| return ScheduledPlaylist(descriptor) |
| |
| def _start(self, playlist, userCredentials): |
| if playlist in self._running and self._running[playlist].isRunning(): |
| return {'node': {'val': '0', 'tp': -1}} |
| try: |
| descriptor = [] |
| with open(os.path.join(self._playlistDir, playlist) + '.json', 'r') as f: |
| descriptor = json.load(f) |
| scheduledPlaylist = self._createPlaylistExecutor(descriptor) |
| scheduledPlaylist.start(userCredentials) |
| self._running[playlist] = scheduledPlaylist |
| except: |
| self._logger.exception('Failed to start playlist') |
| return {'node': {'val': '0', 'tp': 1}} |
| |
| def _stop(self, playlist): |
| if playlist in self._running and self._running[playlist].isRunning(): |
| self._running[playlist].stop() |
| return {'node': {'val': '0', 'tp': 1}} |
| else: |
| return {'node': {'val': '0', 'tp': -1}} |
| |
| def _pause(self, playlist): |
| if playlist in self._running and self._running[playlist].isRunning(): |
| self._running[playlist].pause() |
| return {'node': {'val': '0', 'tp': 1}} |
| else: |
| return {'node': {'val': '0', 'tp': -1}} |
| |
| def handleMessage(self, method, path, headers, body, userCredentials, response): |
| response['body'] = json.dumps(self._dsRestAPI.parseRequest(json.loads(body), userCredentials)) |
| response['headers']['Content-Type'] = 'application/json' |
| |
| def getDataSourceHandlers(self): |
| return { |
| self.SOURCE_ID: { |
| 'getDataHandler': self._getDataHandler, |
| 'setDataHandler': self._setDataHandler |
| } |
| } |
| |
| def close(self): |
| for playlist in self._running: |
| self._stop(playlist) |