Vue normale

Decypharr & AllDebrid : No debrid clients available or no slots found + script de nettoyage de magnets par Bouby

Par : Aerya
26 janvier 2026 à 15:07

Les versions :latest et :fenrir-xx embarquent une fonctionnalité qui interroge les débrideurs pour connaître le nombre de slots d’upload disponibles sur le compte utilisé.
Problème : AllDebrid ne gère pas ça via son API.
Second effet Kiss Cool : cette option ne peut pour l’instant pas être désactivée, donc AD en erreur d’upload quand un magnet/.torrent n’est pas en cache.

L’astuce consiste à revenir sur une version plus ancienne de Decypharr, la :beta fonctionnant.

services:
  decypharr:
    image: ghcr.io/sirrobot01/decypharr:beta
    #image: cy01/blackhole:fenrir
    #image: cy01/blackhole:fenrir-09
    container_name: decypharr
    restart: always
    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - apparmor:unconfined
    ports:
      - 8282:8282
    volumes:
      - /mnt/:/mnt/:rshared
      - /mnt/Fichiers/decypharr/qbit:/mnt/Fichiers/decypharr/qbit
      - /mnt/Docker/decypharr/:/app
    environment:
      - TZ=Europe/Paris
    devices:
      - /dev/fuse:/dev/fuse:rwm

Et j’en profite pour vous présenter l’excellent script de Bouby, lecteur du blog (\o/), qui permet de nettoyer les magnets liés à un compte AD. En effet, chez AD un compte est limité à 5000 liens. Il faut donc parfois faire un peu de ménage, surtout quand on fait des bibliothèques Plex/Jellyfin où il faut clairement plusieurs comptes AD.
Vous les voyez sur l’onglet Magnets de votre compte ou via l’API

adscript
status	"success"
data	{ magnets: (704)[…] }


Un lien est ajouté quand on envoie un magnet ou .torrent sur son compte AD (captain Obvious!) mais aussi à CHAQUE recherche de contenu dessus via les outils Decypharr, DMM, Vortex, les addons sources de Stremio etc. Même si un contenu est en cache, le fait de le chercher en ajoutant un magnet/.torrent crée un lien sur votre compte.
Je n’ai pas cherché et ne sais absolument pas comment AD gère ça côté utilisateurs, si des liens vieux de plus de X mois/années/heures sont retirés ou non.

Quoi qu’il en soit voici le script Python de Bouby (encore merci !). J’ai augmenté les seuils en fonction de la limite de 5000 liens/compte.

#!/usr/bin/env python3
import requests
from datetime import datetime, timedelta

# ----------------------------------------
# CONFIGURATION DU SCRIPT (variables en dur)
# ----------------------------------------

# Clé API AllDebrid — obligatoire pour accéder aux magnets
API_KEY = "xxx"

# Dry-run : True = le script affiche ce qu’il ferait sans supprimer
# False = suppression réelle
DRY_RUN = False

# -----------------------------
# Seuils et limites pour la purge
# -----------------------------
THRESHOLD_HIGH = 4700  # déclenche la purge normale si nombre total de magnets > 900
THRESHOLD_LOW = 2700   # limite minimale après purge pour ne pas trop supprimer =700
MAX_DELETE = 2000      # nombre maximum de magnets à supprimer en mode normal
MIN_AGE_DAYS = 7      # ne supprimer que les magnets plus vieux que X jours (sauf urgence)

# -----------------------------
# Mode urgence
# -----------------------------
EMERGENCY_THRESHOLD = 4900  # si le nombre total de magnets > 950, on active la purge d'urgence
EMERGENCY_DELETE = 2000     # nombre de magnets à supprimer immédiatement en urgence, ignore l'âge minimum

# -----------------------------
# API endpoint AllDebrid
# -----------------------------
# v4.1 est le nouvel endpoint pour récupérer les magnets
BASE_URL = "https://api.alldebrid.com/v4.1/magnet/status"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# -----------------------------
# Catégories de statut
# -----------------------------
# Ces statuts sont utilisés pour trier les magnets par priorité
FAILED = {"Error", "error"}        # magnets ayant rencontré une erreur
IN_PROGRESS = {"Processing"}       # magnets en cours de téléchargement
DONE = {"Finished", "Ready"}       # magnets terminés

# ----------------------------------------
# Récupérer tous les magnets depuis l’API
# ----------------------------------------
def get_magnets():
    """
    Récupère la liste des magnets depuis l’API AllDebrid.
    Retourne une liste vide si erreur ou endpoint obsolète.
    """
    try:
        r = requests.get(BASE_URL, headers=HEADERS, timeout=30)
        r.raise_for_status()
        data = r.json()

        # Vérifie que la réponse contient bien les magnets
        if "data" not in data or "magnets" not in data["data"]:
            print("❌ Réponse API inattendue :")
            print(data)
            return []

        return data["data"]["magnets"]

    except requests.RequestException as e:
        print("❌ Erreur réseau ou API :", e)
        return []

# ----------------------------------------
# Supprimer un magnet par son ID
# ----------------------------------------
def delete_magnet(magnet_id):
    """
    Supprime un magnet via l’API.
    Si DRY_RUN = True, n’effectue pas la suppression mais affiche l’action.
    """
    delete_url = "https://api.alldebrid.com/v4/magnet/delete"
    if DRY_RUN:
        print(f"[DRY-RUN] DELETE {magnet_id}")
        return

    try:
        # POST pour supprimer le magnet
        r = requests.post(delete_url, headers=HEADERS, data={"id": magnet_id})
        r.raise_for_status()
        print(f"✅ Supprimé magnet {magnet_id}")
    except Exception as e:
        print(f"❌ Erreur suppression {magnet_id} :", e)

# ----------------------------------------
# Trier et filtrer les magnets
# ----------------------------------------
def bucketize(magnets, ignore_age=False):
    """
    Trie les magnets par statut et filtre par âge.
    ignore_age=True ignore la limite MIN_AGE_DAYS (mode urgence)
    """
    # Date limite selon l'âge minimum
    cutoff = datetime.utcnow() - timedelta(days=MIN_AGE_DAYS)

    # Séparer les magnets par statut pour appliquer la priorité
    failed, progress, done = [], [], []

    for m in magnets:
        status = m.get("status", "")
        created = m.get("uploadDate") or m.get("completionDate") or 0
        created_dt = datetime.utcfromtimestamp(created) if created else datetime.utcnow()

        # Filtrer par âge sauf si mode urgence
        if not ignore_age and created_dt > cutoff:
            continue

        # Trier par statut
        if status in FAILED:
            failed.append(m)
        elif status in IN_PROGRESS:
            progress.append(m)
        elif status in DONE:
            done.append(m)

    # Trier chaque catégorie par date de création (anciens d’abord)
    for lst in (failed, progress, done):
        lst.sort(key=lambda x: x.get("uploadDate", 0))

    # Retourner tous les magnets dans l'ordre priorité : failed → progress → done
    return failed + progress + done

# ----------------------------------------
# Fonction principale
# ----------------------------------------
def main():
    """
    Logique principale :
    - Récupère tous les magnets
    - Vérifie les seuils
    - Applique le mode urgence si nécessaire
    - Supprime les magnets selon les règles
    """
    magnets = get_magnets()
    total = len(magnets)
    print(f"Total magnets : {total}, Dry-run : {DRY_RUN}")

    # Mode urgence
    if total > EMERGENCY_THRESHOLD:
        print("🚨 MODE URGENCE activé")
        ordered = bucketize(magnets, ignore_age=True)
        to_delete = ordered[:EMERGENCY_DELETE]

    # Mode normal
    elif total > THRESHOLD_HIGH:
        print("Mode normal")
        ordered = bucketize(magnets, ignore_age=False)
        max_deletions = min(MAX_DELETE, total - THRESHOLD_LOW)
        to_delete = ordered[:max_deletions]

    else:
        print("Seuil non atteint → rien à faire.")
        return

    # Supprimer les magnets sélectionnés
    for m in to_delete:
        mid = m.get("id")
        name = m.get("filename") or m.get("name") or ""
        status = m.get("status")
        print(f"→ Suppression {status} : {name} (id={mid})")
        delete_magnet(mid)

    print("✨ Purge terminée.")

# ----------------------------------------
# Exécution du script
# ----------------------------------------
if __name__ == "__main__":
    main()

Comme il le suggère, je le fais tourner avec un Docker Alpine. Chaque nuit à 3h.

services:
  alldebrid-purger:
    image: python:3.12-alpine
    container_name: alldebrid-purger
    restart: always
    working_dir: /app
    command: >
      sh -c "
      apk add --no-cache py3-pip &&
      pip install --no-cache-dir requests &&
      echo '0 3 * * * python /app/purge_alldebrid_magnets.py >> /logs/purge.log 2>&1'
      > /etc/crontabs/root &&
      crond -f -d 8
      "
    volumes:
      - /mnt/Docker/alldebrid_purger:/app:ro
      - /mnt/Docker/alldebrid_purger/logs:/logs

Loading

ZimaOS : le grand frère de CasaOS pour serveurs et NAS DIY

Par : Aerya
22 janvier 2026 à 18:58

Après avoir mis de côté UNRAiD, dont je me suis lassé, j’ai passé le LincStation N1 sous TrueNAS. Cet OS ne m’apporte rien d’autre que la gestion simplifiée des RAIDs via une WebUI (parce que bon… mdadm… c’est chiant). Enfin je ne cherche pas à utiliser l’OS pour être précis, je ne peux donc pas dire qu’il est nul ou top. M’en tape.

Les autres machines, tout aussi peu puissantes que le N1 sont sous Archlinux et Ubuntu. Arch parce que j’aime bien me demander chaque jour si une MàJ va plomber le serveur et comment je vais m’en dépatouiller (et c’est accessoirement mon desktop). Ubuntu, pour changer de Debian, parce que j’ai quand même besoin d’un truc stable dans ma vie de geek. N’utilisant quasi plus de VM/LXC depuis l’avènement de Docker, je n’ai plus de ProxMox.

Du coup, je shunte Ubuntu au profit d’une distribution basée sur Debian : ZimaOS ! Jai passé hier l’ensemble de mes services « utiles » sur TrueNAS pour libérer cette machine pour ce test.

Avertissement : c’est asiat’. Alors pour les complotistes américains peureux bas du front (rayez ou non les mentions inutiles), n’allez pas plus loin. Je n’ai absolument pas fait de RE pour savoir s’ils ont mis des backdoors. « Mais » CVE-2026-21891 (non encore relayée sur GitHub) / discussion Reddit et si j’ai pas sniffé le trafic, mon DNS ne fait rien ressortir d’extraordinaire. La machine ping même pas Baidu, contrairement à la majorité des objets IoT qui s’assurent d’être connectés à Internet en pingant le de Google chinoix (oui, eux aussi ont leur GAFAM BATX).

J’ai découvert cet OS par hasard, quand je cherchais des infos sur des boards de serveurs. J’ai d’ailleurs commencé par découvrir CasaOS, dont j’étais pas fans. Ça faisait un peu Docker in Docker. Pour moi c’est plus à voir comme une alternative à YunoHost (très bon projet pour ceux qui sortent d’une grotte et ne connaissent pas). Même ressenti pour Cosmos d’ailleurs.
ZimaOS est développé pour leurs NAS ZimaCube mais on peut l’installer partout.

Ils font eux-mêmes la comparaison entre ZimaOS et CasaOS, en gros :

C’est un UNRAiD like, avec une interface plus moderne (avis 100% subjectif), avec des clients à la Synology pour Windows, macOS, Linux (AUR), iOS et Android, avec une documentation bien faite sans tomber dans un Wikipedia comme on peut le voir chez certains concurrents, un GitHub et donc la possibilité d’ouvrir des issues (ce qui est bien plus pratique qu’un forum),

Ça s’installe en 2-2 avec une clé USB (iso de 1.3Go) créée avec Balena et se gère uniquement via la WebUI.

zimaos1
zimaos2
zimaos3
zimaos4

J’utilise la version gratuite.

zimaos5

Et il faut activer le Mode Développeur notamment pour désactiver l’indexation du contenu avec leur « IA » (pour faciliter la recherche) et autoriser SSH.

zimaos6
zimaos7
zimaos8
zimaos9
zimaos10

Première vraie configuration à faire, mon stockage. De mémoire j’ai que 2 disques dans ce PC mais la version gratuite permet d’en gérer 4 en RAID. Et la version payante coûte 29$ (« à vie »).

zimaos11
zimaos12

Comme j’ai qu’un SSD en sus de celui de l’OS, je me contente de le formater et ça l’ajoute bien ensuite en stockage. Ce que je vois d’ailleurs avec le widget de la dashboard, qui passe à 718Go de stockage.

zimaos13

Et donc, en standard, ZimaOS intègre un explorateur de fichiers, un outil de backup (depuis ou vers le NAS), un gestionnaire de VM et un PairDrop (je vois la machine sous Windows mais pas mon Arch, faudra que je trouve pourquoi).
Depuis un client (Linux/iOS), on peut parcourir les fichiers du serveur et faire du backup. Notamment de photos depuis l’iPhone (arrière plan ou non).

zimaos14
zimaos18
zimaos15
zimaos16
zimaos17
zimaos19

On peut ajouter des liens externes à la dashboard, ce qui est une très bonne idée et pourrait m’inciter à me passer de mon brave Heimdall qui m’accompagne depuis maintenant des années…

zimaos21
zimaos20

Et nous terminons évidemment avec le fameux AppStore et ses 372 applications (Docker) « prêtes à installer » au moment de cet article. Rien de comparable avec UNRAiD, je vous l’accorde. Mais ici, ça s’installe en 1 clic.

zimaos22

Et on peut ajouter des dépôts et doubler, au moins, le nombre d’applications du store.

zimaos32

Tout comme il est possible d’installer une app via la WebUI si on elle n’est pas dans le Store et qu’on n’est vraiment pas à l’aise en console.

zimaos24

On peut tout à fait utiliser Docker en console ou via Komodo, Arcane, Dockge, Portainer/what ever. Et ça marche « out of the box » dans ce cas, il n’y a rien à adapter pour l’OS.

À noter que par défaut, les applications installées via l’AppStore sont dans /DATA, sur le disque système.

root@ZimaOS:~ ➜ # tree /DATA/
/DATA/
├── AppData
│   └── pihole
│       └── etc
│           └── pihole
│               ├── adlists.list
│               ├── cli_pw
│               ├── config_backups
│               │   └── pihole.toml.1
│               ├── dhcp.leases
│               ├── dnsmasq.conf
│               ├── gravity.db
│               ├── gravity_backups
│               │   └── gravity.db.1
│               ├── gravity_old.db
│               ├── hosts
│               │   └── custom.list
│               ├── listsCache
│               │   ├── list.1.raw.githubusercontent.com.domains
│               │   ├── list.1.raw.githubusercontent.com.domains.etag
│               │   └── list.1.raw.githubusercontent.com.domains.sha1
│               ├── logrotate
│               ├── migration_backup
│               │   └── adlists.list
│               ├── pihole-FTL.db
│               ├── pihole-FTL.db-shm
│               ├── pihole-FTL.db-wal
│               ├── pihole.toml
│               ├── tls.crt
│               ├── tls.pem
│               ├── tls_ca.crt
│               └── versions
├── Backup
├── Documents
├── Downloads
│   └── ISO
├── Gallery
├── Media
│   ├── Movies
│   ├── Music
│   └── TV Shows
└── lost+found

Comme ça se voit au-dessus, j’ai installé Pi-Hole depuis l’AppStore pour tester. Faut juste cliquer pour installer.

zimaos23
zimaos25
zimaos26
zimaos27
zimaos28
zimaos29

Pratique : en cas d’ajout de disques, on peut migrer les données facilement

zimaos30
zimaos31

Même si ZimaOS est basé sur Debian, c’est propriétaire et on ne peut pas utiliser Apt pour y installer ce qu’on veut. C’est une sécurité également, histoire de ne pas mettre en vrac l’OS (ce qu’on est nombreux à avoir fait avec Proxmox hein… mentez pas !!). Ceci dit ils ont prévu le coup.
Ceci dit, leur OS embarque déjà bon nombre d’utilitaires tels que ncdu, jq, rclone…

Dans l’idéal, j’aimerais un dash qui permet de mieux intégrer quelques applications comme le font Heimdall, Homarr, Organizr etc.

Aperçu du client iOS

zimaos33
zimaos34
zimaos35
zimaos36

Avec le recul de cet article, je perçois ZimaOS comme un DSM de Synology, enfin plutôt un Xpenology vu qu’on peut l’installer où on veut, avec un peu de combo d’UNRAiD et cousins.

Enfin tous ces OS se ressemblent mais ZimaOS serait un peu le « macOS » du groupe, à vouloir proposer une expérience très esthétique, complète (Docker natif ou magasin d’applications), pratique (outils intégrés, y compris pour périphériques) et répondant AMHA à la plupart des besoins. Bien que propriétaire, contrairement à CasaOS qui est open source mais n’est qu’une surcouche.

Je pense le faire tourner quelques temps en parallèle de TrueNAS voir remplacer ce dernier. Et j’avais oublié, ça embarque aussi Btop++ pour afficher des stats temps réel.

zimaos37

Loading

NexPhone: A Smartphone That Runs Android, Linux And Windows 11

22 janvier 2026 à 12:45
A U.S. company has made a smartphone that is different from most others on the market right now. The device, called NexPhone, is produced by the American start-up Nex Computer and comes with three operating systems installed from the factory: Android, Windows 11, and Linux. According to the company, the NexPhone was made with the idea that a smartphone could be all a person needs. Based on this idea, Android […]

💾

Entretien avec Louis Fouché - YouTube

7 janvier 2026 à 09:46

Thèmes principaux:

  • Gestion de la crise sanitaire COVID-19
  • Traitements précoces et médecine de ville
  • Critique des tests PCR, masques, vaccination
  • Reinfocovid : sortir de l'hypnose collective
  • Philosophie politique : peuple, frontières, individuation
  • Néguentropie et le vivant comme système organisé
  • Cercles restauratifs et CNV
  • Le Nous et le Je : extraction vs séparation
  • Pervers narcissiques dans les structures de pouvoir
  • Anthropologie de la souffrance (3 remédiations)
  • Non-agir, akrasia, permaculture
  • Conclusion : « Éteignez la télé, reprenez contact avec le réel »

Permalien

Motorola Signature Aims at the High-End Android Smartphone Segment

7 janvier 2026 à 02:57
Motorola is making a clear statement at the ultra-premium end of the smartphone market with the launch of Motorola Signature, its first smartphone designed to compete directly with the very best Android flagships. Positioned alongside devices such as the Samsung Galaxy S25 Ultra, Honor Magic8 Pro, OnePlus 15, and Google Pixel 10 Pro, the Motorola Signature represents a decisive shift for the brand toward high performance, imaging, and long-term support. […]

Le robotaxi premium d’Uber prend forme avec Lucid et Nuro

6 janvier 2026 à 11:00

Trois acteurs majeurs de la mobilité autonome ont dévoilé leur véhicule commun lors du CES 2026. Uber, Lucid Motors et Nuro présentent la version quasi définitive d’un projet né il y a plus de sept mois dans le cadre d’un accord financier substantiel. L’alliance repose sur un investissement de 300 millions de dollars consenti par ... Lire plus

L'article Le robotaxi premium d’Uber prend forme avec Lucid et Nuro est apparu en premier sur Fredzone.

bontegames - Blog of Bart Bonte, a Belgian independent game designer

12 décembre 2025 à 14:14

I loved his series of free Android & iPhone logic puzzle games:

They can also be played in your web browser.

If necessary, you can find hints for the logic puzzles on this wiki page: https://bontegames.fandom.com/wiki/Category:Colour_Games


Permalien
❌