From e7b1e34f09ed1520cfc07539c6cc2574d608c806 Mon Sep 17 00:00:00 2001
From: HappyTreeBeard <34220817+HappyTreeBeard@users.noreply.github.com>
Date: Fri, 15 Dec 2017 00:45:51 -0800
Subject: [PATCH] API Subtitle, Proper, and Daily Search (#4193)

* Implemented API features to trigger subtitle, proper, and daily search (#4141)

* isort
---
 sickbeard/webapi.py | 81 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py
index c2f6a3d05..e62844e51 100644
--- a/sickbeard/webapi.py
+++ b/sickbeard/webapi.py
@@ -30,6 +30,7 @@ import os
 import re
 import time
 import traceback
+from abc import abstractmethod
 
 import six
 # noinspection PyUnresolvedReferences
@@ -845,6 +846,83 @@ class CMDEpisodeSearch(ApiCall):
         return _responds(RESULT_FAILURE, msg='Unable to find episode')
 
 
+class AbstractStartScheduler(ApiCall):
+
+    @property
+    @abstractmethod
+    def scheduler(self):
+        return AbstractStartScheduler
+
+    @property
+    @abstractmethod
+    def scheduler_class_str(self):
+        return 'sickbeard.scheduler.Scheduler'
+
+    def run(self):
+        error_str = 'Start scheduler failed'
+        if not isinstance(self.scheduler, sickbeard.scheduler.Scheduler):
+            error_str = '{0}: {1} is not initialized as a static variable'.format(error_str, self.scheduler_class_str)
+            return _responds(RESULT_FAILURE, msg=error_str)
+
+        if not self.scheduler.enable:
+            error_str = '{0}: {1} is not enabled'.format(error_str, self.scheduler_class_str)
+            return _responds(RESULT_FAILURE, msg=error_str)
+
+        if not hasattr(self.scheduler.action, 'amActive'):
+            error_str = '{0}: {1} is not a valid action'.format(error_str, self.scheduler.action)
+            return _responds(RESULT_FAILURE, msg=error_str)
+
+        time_remain = self.scheduler.timeLeft()
+        # Force the search to start in order to skip the search interval check
+        if self.scheduler.forceRun():
+            cycle_time = self.scheduler.cycleTime
+            next_run = datetime.datetime.now() + cycle_time
+            result_str = 'Force run successful: {0} search underway. Time Remaining: {1}. ' \
+                         'Next Run: {2}'.format(self.scheduler_class_str, time_remain, next_run)
+            return _responds(RESULT_SUCCESS, msg=result_str)
+        else:
+            # Scheduler is currently active
+            error_str = '{0}: {1} search underway. Time remaining: {}.'.format(
+                error_str, self.scheduler_class_str, time_remain)
+            return _responds(RESULT_FAILURE, msg=error_str)
+
+
+class CMDFullSubtitleSearch(AbstractStartScheduler):
+    _help = {"desc": "Force a subtitle search for all shows."}
+
+    @property
+    def scheduler(self):
+        return sickbeard.subtitlesFinderScheduler
+
+    @property
+    def scheduler_class_str(self):
+        return 'sickbeard.subtitlesFinderScheduler'
+
+
+class CMDProperSearch(AbstractStartScheduler):
+    _help = {"desc": "Force a proper search for all shows."}
+
+    @property
+    def scheduler(self):
+        return sickbeard.properFinderScheduler
+
+    @property
+    def scheduler_class_str(self):
+        return 'sickbeard.properFinderScheduler'
+
+
+class CMDDailySearch(AbstractStartScheduler):
+    _help = {"desc": "Force a daily search for all shows."}
+
+    @property
+    def scheduler(self):
+        return sickbeard.dailySearchScheduler
+
+    @property
+    def scheduler_class_str(self):
+        return 'sickbeard.dailySearchScheduler'
+
+
 # noinspection PyAbstractClass
 class CMDEpisodeSetStatus(ApiCall):
     _help = {
@@ -2828,6 +2906,9 @@ function_mapper = {
     "sb.pausebacklog": CMDSickBeardPauseBacklog,
     "sb.ping": CMDSickBeardPing,
     "sb.restart": CMDSickBeardRestart,
+    "sb.dailysearch": CMDDailySearch,
+    "sb.propersearch": CMDProperSearch,
+    "sb.subtitlesearch": CMDFullSubtitleSearch,
     "sb.searchindexers": CMDSickBeardSearchIndexers,
     "sb.searchtvdb": CMDSickBeardSearchTVDB,
     "sb.searchtvrage": CMDSickBeardSearchTVRAGE,
-- 
GitLab