--- apiVersion: batch/v1 kind: CronJob metadata: name: lidarr-empty-folders namespace: plex spec: schedule: "*/30 * * * *" successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 concurrencyPolicy: Forbid jobTemplate: spec: template: metadata: labels: app: lidarr-empty-folders annotations: backup.velero.io/backup-volumes-excludes: media spec: securityContext: runAsUser: 1000 runAsGroup: 1000 restartPolicy: OnFailure containers: - name: lidarr-empty-folders image: jibby0/server-python3-requests:3.11-alpine command: - /bin/sh - -c - python3 /script/lidarr_empty_folders.py $LIDARR_HOST $LIDARR_API_KEY $LIDARR_MUSIC_PATH env: - name: LIDARR_HOST value: https://lidarr.lan.jibby.org - name: LIDARR_API_KEY valueFrom: secretKeyRef: name: lidarr-empty-folders key: api-key - name: LIDARR_MUSIC_PATH value: /media/Music/ volumeMounts: - mountPath: "/media" name: media - mountPath: /script name: lidarr-empty-folders volumes: - name: media persistentVolumeClaim: claimName: plex-pvc - name: lidarr-empty-folders configMap: name: lidarr-empty-folders items: - key: lidarr_empty_folders.py path: lidarr_empty_folders.py --- apiVersion: v1 kind: ConfigMap metadata: name: lidarr-empty-folders namespace: plex data: lidarr_empty_folders.py: | import requests from requests.adapters import HTTPAdapter, Retry import os import sys if len(sys.argv) != 4: print("One or more args are undefined") sys.exit(1) lidarr_server, lidarr_api_key, music_folder = sys.argv[1:4] retries = Retry(total=10, backoff_factor=1, status_forcelist=[ 500, 502, 503, 504 ]) s = requests.Session() s.mount('http://', HTTPAdapter(max_retries=retries)) resp = s.get( f"{lidarr_server}/api/v1/artist", headers={"Authorization": f"Bearer {lidarr_api_key}"} ) artists = resp.json() for artist in artists: artist_name = artist.get("artistName") artist_path = music_folder + artist_name if ('/' not in artist_name) and (not os.path.exists(artist_path)): print("Creating ", artist_path) os.mkdir(artist_path)