- [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.
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
+```
--- /dev/null
+<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>