From 6c89accc86610ea55ef600e5f478dadcb97f2d65 Mon Sep 17 00:00:00 2001 From: vincent Date: Mon, 16 Nov 2020 14:32:58 +0100 Subject: [PATCH] scan Api implementation --- supysonic/api/__init__.py | 1 + supysonic/api/exceptions.py | 7 +++++++ supysonic/api/scan.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 supysonic/api/scan.py diff --git a/supysonic/api/__init__.py b/supysonic/api/__init__.py index 175e69e..880ef65 100644 --- a/supysonic/api/__init__.py +++ b/supysonic/api/__init__.py @@ -116,3 +116,4 @@ from .playlists import * from .jukebox import * from .radio import * from .unsupported import * +from .scan import * \ No newline at end of file diff --git a/supysonic/api/exceptions.py b/supysonic/api/exceptions.py index 6a1a80e..0354f83 100644 --- a/supysonic/api/exceptions.py +++ b/supysonic/api/exceptions.py @@ -122,3 +122,10 @@ class AggregateException(SubsonicAPIException): ) # rv.status_code = self.code return rv + +class DaemonUnavailable(SubsonicAPIException): + code = 404 + api_code = 80 + message = ( + "Supysonic Daemon not running on this server." + ) \ No newline at end of file diff --git a/supysonic/api/scan.py b/supysonic/api/scan.py new file mode 100644 index 0000000..55eb585 --- /dev/null +++ b/supysonic/api/scan.py @@ -0,0 +1,33 @@ + +from . import api +from functools import wraps +from flask import request +from flask import current_app +from .user import admin_only +from .exceptions import Forbidden,DaemonUnavailable,ServerError +from ..db import Folder +from ..daemon.client import DaemonClient +from ..daemon.exceptions import DaemonUnavailableError +from ..managers.folder import FolderManager + +@api.route("/startScan.view", methods=["GET", "POST"]) +@admin_only +def startScan(): + try: + DaemonClient(current_app.config["DAEMON"]["socket"]).scan() + except ValueError as e: + ServerError(str(e)) + except DaemonUnavailableError: + raise DaemonUnavailable() + return getScanStatus() + +@api.route("/getScanStatus.view", methods=["GET", "POST"]) +@admin_only +def getScanStatus(): + try: + scanned=DaemonClient(current_app.config["DAEMON"]["socket"]).get_scanning_progress() + except DaemonUnavailableError: + raise DaemonUnavailable() + return request.formatter("scanStatus", + dict(scanning='true' if scanned is not None else 'false', + count= scanned if scanned is not None else 0)) \ No newline at end of file