]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
Adds SABnzbd custom service; fixes #494 (#555)
authorMatt Bentley <mbentley@mbentley.net>
Sat, 19 Nov 2022 15:14:22 +0000 (10:14 -0500)
committerGitHub <noreply@github.com>
Sat, 19 Nov 2022 15:14:22 +0000 (07:14 -0800)
* Adds SABnzbd custom service; fixes #494

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

index 7448a8c00b1071a9a08e0f6c9a847ee1d300a1f4..5bb08ff06b59cb8e4d58f212d20a4ce336cc04c9 100644 (file)
@@ -30,6 +30,7 @@ within Homer:
   - [CopyToClipboard](#copy-to-clipboard)
   - [Speedtest Tracker](#SpeedtestTracker)
   - [What's Up Docker](#whats-up-docker)
+  - [SABnzbd](#sabnzbd)
 
 If you experiencing any issue, please have a look to the [troubleshooting](troubleshooting.md) page.
 
@@ -361,3 +362,18 @@ The following configuration is available for the WUD service.
   url: "http://192.168.1.12:3001"
   type: "WUD"
 ```
+
+## SABnzbd
+
+The SABnzbd service can allow you to show the number of currently active
+downloads on your SABnzbd instance. An API key is required, and can be obtained from
+the "Config" > "General" section of the SABnzbd config in the SABnzbd web UI.
+
+```yaml
+- name: "SABnzbd"
+  logo: "assets/tools/sample.png"
+  url: "http://192.168.0.151:8080"
+  type: "SABnzbd"
+  apikey: "MY-SUPER-SECRET-API-KEY"
+  downloadInterval: 5000 # (Optional) Interval (in ms) for updating the download count
+```
diff --git a/src/components/services/SABnzbd.vue b/src/components/services/SABnzbd.vue
new file mode 100644 (file)
index 0000000..2f93c71
--- /dev/null
@@ -0,0 +1,99 @@
+<template>
+  <Generic :item="item">
+    <template #indicator>
+      <div class="notifs">
+        <strong
+          v-if="downloads > 0"
+          class="notif downloading"
+          :title="`${downloads} active download${downloads > 1 ? 's' : ''}`"
+        >
+          {{ downloads }}
+        </strong>
+        <i
+          v-if="error"
+          class="notif error fa-solid fa-triangle-exclamation"
+          title="Unable to fetch current status"
+        ></i>
+      </div>
+    </template>
+  </Generic>
+</template>
+
+<script>
+import service from "@/mixins/service.js";
+import Generic from "./Generic.vue";
+
+export default {
+  name: "SABnzbd",
+  mixins: [service],
+  props: {
+    item: Object,
+  },
+  components: {
+    Generic,
+  },
+  data: () => ({
+    stats: null,
+    error: false,
+  }),
+  computed: {
+    downloads: function () {
+      if (!this.stats) {
+        return "";
+      }
+      return this.stats.noofslots;
+    },
+  },
+  created() {
+    const downloadInterval = parseInt(this.item.downloadInterval, 10) || 0;
+    if (downloadInterval > 0) {
+      setInterval(() => this.fetchStatus(), downloadInterval);
+    }
+
+    this.fetchStatus();
+  },
+  methods: {
+    fetchStatus: async function () {
+      try {
+        const response = await this.fetch(
+          `/api?output=json&apikey=${this.item.apikey}&mode=queue`
+        );
+        this.error = false;
+        this.stats = response.queue;
+      } catch (e) {
+        this.error = true;
+        console.error(e);
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.notifs {
+  position: absolute;
+  color: white;
+  font-family: sans-serif;
+  top: 0.3em;
+  right: 0.5em;
+
+  .notif {
+    display: inline-block;
+    padding: 0.2em 0.35em;
+    border-radius: 0.25em;
+    position: relative;
+    margin-left: 0.3em;
+    font-size: 0.8em;
+
+    &.downloading {
+      background-color: #4fb5d6;
+    }
+
+    &.error {
+      border-radius: 50%;
+      aspect-ratio: 1;
+      background-color: #e51111;
+    }
+  }
+}
+</style>