]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
Merge pull request #329 from Panzer1119/main
authorBastien Wirtz <bastien.wirtz@gmail.com>
Mon, 13 Dec 2021 19:54:04 +0000 (11:54 -0800)
committerGitHub <noreply@github.com>
Mon, 13 Dec 2021 19:54:04 +0000 (11:54 -0800)
Add Lidarr service

docs/customservices.md
src/components/services/Lidarr.vue [new file with mode: 0644]

index 6850bbbb13e2d993d4867580a7e56f0427620939..7d475422b33f3bbe63b935a457dec73175a0a0d9 100644 (file)
@@ -63,18 +63,18 @@ Two lines are needed in the config.yml :
 The url must be the root url of Medusa application.
 The Medusa API key can be found in General configuration > Interface. It is needed to access Medusa API.
 
-## Sonarr/Radarr
+## Lidarr, Sonarr and Radarr
 
-This service displays Activity (blue), Warning (orange) or Error (red) notifications bubbles from the Radarr/Sonarr application.
+This service displays Activity (blue), Warning (orange) or Error (red) notifications bubbles from the Lidarr, Radarr or Sonarr application.
 Two lines are needed in the config.yml :
 
 ```yaml
-  type: "Radarr" or "Sonarr"
+  type: "Lidarr", "Radarr" or "Sonarr"
   apikey: "01234deb70424befb1f4ef6a23456789"
 ```
 
-The url must be the root url of Radarr/Sonarr application.
-The Radarr/Sonarr API key can be found in Settings > General. It is needed to access the API.
+The url must be the root url of Lidarr, Radarr or Sonarr application.
+The Lidarr, Radarr or Sonarr API key can be found in Settings > General. It is needed to access the API.
 
 ## PaperlessNG
 
diff --git a/src/components/services/Lidarr.vue b/src/components/services/Lidarr.vue
new file mode 100644 (file)
index 0000000..f5d3434
--- /dev/null
@@ -0,0 +1,150 @@
+<template>
+  <div>
+    <div class="card" :class="item.class">
+      <a :href="item.url" :target="item.target" rel="noreferrer">
+        <div class="card-content">
+          <div class="media">
+            <div v-if="item.logo" class="media-left">
+              <figure class="image is-48x48">
+                <img :src="item.logo" :alt="`${item.name} logo`" />
+              </figure>
+            </div>
+            <div v-if="item.icon" class="media-left">
+              <figure class="image is-48x48">
+                <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
+              </figure>
+            </div>
+            <div class="media-content">
+              <p class="title is-4">{{ item.name }}</p>
+              <p class="subtitle is-6">{{ item.subtitle }}</p>
+            </div>
+            <div class="notifs">
+              <strong
+                v-if="activity > 0"
+                class="notif activity"
+                title="Activity"
+                >{{ activity }}</strong
+              >
+              <strong
+                v-if="warnings > 0"
+                class="notif warnings"
+                title="Warning"
+                >{{ warnings }}</strong
+              >
+              <strong v-if="errors > 0" class="notif errors" title="Error">{{
+                errors
+              }}</strong>
+              <strong
+                v-if="serverError"
+                class="notif errors"
+                title="Connection error to Lidarr API, check url and apikey in config.yml"
+                >?</strong
+              >
+            </div>
+          </div>
+          <div class="tag" :class="item.tagstyle" v-if="item.tag">
+            <strong class="tag-text">#{{ item.tag }}</strong>
+          </div>
+        </div>
+      </a>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Lidarr",
+  props: {
+    item: Object,
+  },
+  data: () => {
+    return {
+      activity: null,
+      warnings: null,
+      errors: null,
+      serverError: false,
+    };
+  },
+  created: function () {
+    this.fetchConfig();
+  },
+  methods: {
+    fetchConfig: function () {
+      fetch(`${this.item.url}/api/v1/health?apikey=${this.item.apikey}`, {
+        credentials: "include",
+      })
+        .then((response) => {
+          if (response.status != 200) {
+            throw new Error(response.statusText);
+          }
+          return response.json();
+        })
+        .then((health) => {
+          this.warnings = 0;
+          this.errors = 0;
+          for (var i = 0; i < health.length; i++) {
+            if (health[i].type == "warning") {
+              this.warnings++;
+            } else if (health[i].type == "error") {
+              this.errors++;
+            }
+          }
+        })
+        .catch((e) => {
+          console.error(e);
+          this.serverError = true;
+        });
+      fetch(`${this.item.url}/api/v1/queue/status?apikey=${this.item.apikey}`, {
+        credentials: "include",
+      })
+        .then((response) => {
+          if (response.status != 200) {
+            throw new Error(response.statusText);
+          }
+          return response.json();
+        })
+        .then((queue) => {
+          this.activity = queue.totalCount;
+        })
+        .catch((e) => {
+          console.error(e);
+          this.serverError = true;
+        });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.media-left img {
+  max-height: 100%;
+}
+.notifs {
+  position: absolute;
+  color: white;
+  font-family: sans-serif;
+  top: 0.3em;
+  right: 0.5em;
+}
+.notif {
+  padding-right: 0.35em;
+  padding-left: 0.35em;
+  padding-top: 0.2em;
+  padding-bottom: 0.2em;
+  border-radius: 0.25em;
+  position: relative;
+  margin-left: 0.3em;
+  font-size: 0.8em;
+}
+.activity {
+  background-color: #4fb5d6;
+}
+
+.warnings {
+  background-color: #d08d2e;
+}
+
+.errors {
+  background-color: #e51111;
+}
+</style>