commit e73ed046e416177c81e382f9aa282eb141147aa4 Author: Ben Casling Date: Sun Apr 21 19:49:18 2019 +0100 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a8a798e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +# Built and maintained by: +# Ben Casling , +# Cameron Sharp + +FROM python:3.7.3-alpine + +WORKDIR /usr/src/app +COPY requirements.txt ./ + +RUN pip install -r requirements.txt diff --git a/Jiffy.py b/Jiffy.py new file mode 100644 index 0000000..df0b19b --- /dev/null +++ b/Jiffy.py @@ -0,0 +1,143 @@ +import time +import json +import requests +import logging + +logging.basicConfig(level=logging.DEBUG) + +UPLOAD_IMAGE_JSON = json.dumps({ + "mimetype": "image", + "is_enabled": 0, + "name": '%s', + "end_date": "9999-04-16T21:44:31.552Z", + "duration": '%d', + "play_order": 0, + "nocache": 0, + "uri": '%s', + "skip_asset_check": 0, + "start_date": "2019-04-16T21:44:31.552Z" +}) + + +class Jiffy: + host = api_url_v1_0 = api_url_v1_2 = credentials = None + + def __init__(self, host, api_url_v1_0, api_url_v1_2, credentials): + self.host = host + self.api_url_v1_0 = api_url_v1_0 + self.api_url_v1_2 = api_url_v1_2 + self.credentials = credentials + + def _check_media_exists(self, media_url): + try: + logging.debug(f'Attempting to get file from "{media_url}".') + resp = requests.get(media_url) + except Exception as e: + logging.critical(f'An exception occurred: "{e}".') + return False + else: + media_check_status = resp.status_code if hasattr(resp, 'status_code') else None + logging.debug(f'Received status code "{media_check_status}"') + return media_check_status == 200 + + def _load_file_from_url(self, media_url, duration=10): + asset_upload_url = f'http://{self.host}/{self.api_url_v1_2}/assets' + data_to_upload = UPLOAD_IMAGE_JSON % (media_url, duration, media_url) + + logging.debug(f'Attempting to upload "{media_url}" to "{asset_upload_url}".') + + file_upload_response = requests.post(url=asset_upload_url, data=data_to_upload, auth=self.credentials) + file_upload_response_json = file_upload_response.json() + + if not isinstance(file_upload_response_json, dict): + logging.critical(f'Could not parse asset ID, received type "{type(file_upload_response_json)}"') + return + else: + asset_id = file_upload_response_json.get('asset_id') + logging.debug(f'Received asset ID "{asset_id}"') + + return asset_id + + def _display_asset(self, asset_id): + logging.debug(f'Attempting to display asset with ID "{asset_id}".') + + display_asset_response = requests.get( + f'http://{self.host}/{self.api_url_v1_0}/assets/control/asset&{asset_id}', + auth=self.credentials + ) + + display_asset_status_code = display_asset_response.status_code if getattr(display_asset_response, 'status_code') else None + + logging.debug( + f'Received status code of "{display_asset_status_code}" when trying to display asset with ID "{asset_id}".' + ) + + return display_asset_status_code == 200 + + def _delete_asset(self, asset_id): + logging.debug(f'Attempting to delete asset with ID "{asset_id}".') + + delete_asset_response = requests.delete(f'http://{self.host}/{self.api_url_v1_2}/assets/{asset_id}', auth=self.credentials) + delete_asset_status_code = delete_asset_response.status_code if getattr(delete_asset_response, 'status_code') else None + + logging.debug( + f'Received status code of "{delete_asset_status_code}", when trying to delete asset with ID "asset_id".' + ) + + return delete_asset_status_code + + def display_media_from_url(self, media_url, duration=10): + if not self._check_media_exists(media_url): + logging.critical(f'Media at {media_url} cannot be found. Terminating.') + return + else: + asset_id = self._load_file_from_url(media_url, duration) + + if asset_id is None: + logging.critical('No asset ID received. Terminating') + return + else: + self._display_asset(asset_id) + + logging.debug(f'Sleeping for {duration} to allow media to play.') + + time.sleep(duration) + self._delete_asset(asset_id) + +# # If they forgot the filename. +# if not len(sys.argv): +# raise Exception('You forgot the file url. Moron.') + +# file_url = sys.argv[1] + +# if len(sys.argv) >= 3: +# duration = sys.argv[2] +# else: +# duration = 10 + +# resp = requests.get(file_url) + +# # If they didn't give us a valid url. +# if resp.status_code != 200: +# raise Exception('Yeah no, that thing doesn\'t exist.') + +# # If by some miracle the user gave us a filename, and it actually exists somewhere. +# asset_upload_url = f'http://{DASHPI_HOST}/{DASHPI_API_v1_2}/assets' +# data_to_upload = UPLOAD_IMAGE_JSON % (file_url, duration, file_url) + +# # Upload the file to dashpi so we can switch to it. +# resp2 = requests.post(url=asset_upload_url, data=data_to_upload, auth=DASHPI_CREDS) +# resp2_json = resp2.json() + +# # Get the asset ID back from dashpi, or break. +# if not isinstance(resp2_json, dict): +# raise Exception('NO JSON FOUND') +# else: +# asset_id = resp2_json.get('asset_id') + +# # Tell dashpi we want to view the image we just uploaded, obviously. +# resp3 = requests.get(f'http://{DASHPI_HOST}/{DASHPI_API_V1_0}/assets/control/asset&{asset_id}', auth=DASHPI_CREDS) + +# # Wait till we are done displaying the gif (plus 5s for safety) then delete it from dashpi. +# time.sleep(duration+1) +# resp4 = requests.delete(f'http://{DASHPI_HOST}/{DASHPI_API_v1_2}/assets/{asset_id}', auth=DASHPI_CREDS) \ No newline at end of file diff --git a/cli_run.py b/cli_run.py new file mode 100644 index 0000000..12b0622 --- /dev/null +++ b/cli_run.py @@ -0,0 +1,25 @@ +import sys + +from Jiffy import Jiffy + +jiffy = Jiffy( + host='dashpi-g1', + api_url_v1_0='api/v1', + api_url_v1_2='api/v1.2', + credentials=( + 'admin', + 'hacklab' + ) + ) + +if not len(sys.argv): + raise Exception('You forgot the file url. Moron.') + +file_url = sys.argv[1] + +if len(sys.argv) >= 3: + duration = sys.argv[2] +else: + duration = 10 + +jiffy.display_media_from_url(file_url, duration) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0d3280c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +paho-mqtt==1.4.0 +