From cc4164dabffe2a4559b61d05507323a32a02d33d Mon Sep 17 00:00:00 2001 From: brothergomez <38558969+brothergomez@users.noreply.github.com> Date: Sun, 20 Feb 2022 14:34:49 +0000 Subject: [PATCH] feat(auto-music-downloader) Add auto-music-downloader (#1902) * initial commit * Enums and add icon * Add some docs * Fix values * Remove licence, correct questions.yaml. * Update docs/manual/default-ports.md Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/amd-automatic-music-downloader/values.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/amd-automatic-music-downloader/values.yaml Thanks Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/amd-automatic-music-downloader/values.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/amd-automatic-music-downloader/Chart.yaml * Update charts/incubator/amd-automatic-music-downloader/Chart.yaml * Update charts/incubator/amd-automatic-music-downloader/questions.yaml * Update charts/incubator/amd-automatic-music-downloader/values.yaml * Update charts/incubator/amd-automatic-music-downloader/questions.yaml * Update charts/incubator/amd-automatic-music-downloader/Chart.yaml * rename folder * Remove *.md files, helmignore. Rename app. * use digest-pinning * Update charts/incubator/automatic-music-downloader/questions.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Fix version to 1.0.0. Fix over long enum descriptions, multiline some descriptions. * Reset auto gen appVersion. Set version to 0.0.1. * Update image tag * Update charts/incubator/automatic-music-downloader/values.yaml Co-authored-by: Matt Haddock Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Co-authored-by: Kjeld Schouten-Lebbing --- .../automatic-music-downloader/Chart.yaml | 31 ++ .../automatic-music-downloader/questions.yaml | 493 ++++++++++++++++++ .../templates/common.yaml | 1 + .../automatic-music-downloader/values.yaml | 35 ++ .../automatic-music-downloader-icon.png | Bin 0 -> 28457 bytes docs/apps/app-requests.md | 1 + 6 files changed, 561 insertions(+) create mode 100644 charts/incubator/automatic-music-downloader/Chart.yaml create mode 100644 charts/incubator/automatic-music-downloader/questions.yaml create mode 100644 charts/incubator/automatic-music-downloader/templates/common.yaml create mode 100644 charts/incubator/automatic-music-downloader/values.yaml create mode 100644 docs/_static/img/appicons/automatic-music-downloader-icon.png diff --git a/charts/incubator/automatic-music-downloader/Chart.yaml b/charts/incubator/automatic-music-downloader/Chart.yaml new file mode 100644 index 00000000000..dfcb57ccf4c --- /dev/null +++ b/charts/incubator/automatic-music-downloader/Chart.yaml @@ -0,0 +1,31 @@ +apiVersion: v2 +appVersion: "latest" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.15.4 +deprecated: false +description: A Lidarr companion script to automatically download music for Lidarr. +home: https://github.com/truecharts/apps/tree/master/charts/incubator/automatic-music-downloader +icon: https://truecharts.org/_static/img/appicons/automatic-music-downloader-icon.png +keywords: +- automatic +- music +- downloader +- deemix +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: automatic-music-downloader +sources: +- https://github.com/RandomNinjaAtk/docker-amd +- https://hub.docker.com/r/randomninjaatk/amd +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/automatic-music-downloader/questions.yaml b/charts/incubator/automatic-music-downloader/questions.yaml new file mode 100644 index 00000000000..d451a978e99 --- /dev/null +++ b/charts/incubator/automatic-music-downloader/questions.yaml @@ -0,0 +1,493 @@ +# Include{groups} +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: true + # Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" + # Include{controllerExpert} + + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + # Include{fixedEnv} + - variable: PUID + label: "PUID" + description: "Sets the PUID env var for LinuxServer.io (compatible) containers" + schema: + type: int + default: 568 + - variable: AUTOSTART + label: "Auto Start" + description: "true = Enabled :: Runs script automatically on startup" + schema: + type: boolean + default: true + - variable: SCRIPTINTERVAL + label: "Script Interval" + description: "#s or #m or #h or #d :: s = seconds, m = minutes, h = hours, d = days :: Amount of time between each script run, when AUTOSTART is enabled" + schema: + type: string + default: "1h" + - variable: DOWNLOADMODE + label: "Download Mode" + description: > + "`wanted` or `artist` :: wanted mode only download missing/cutoff :: + artist mode downloads all albums by an artist (requires lidarr volume mapping root media folders for import)" + schema: + type: string + default: "wanted" + enum: + - value: "wanted" + description: "Only missing/cutoff" + - value: "artist" + description: "All albums" + - variable: FALLBACKSEARCH + label: "Fallback Search" + description: "True or False :: True = enabled :: Allows DL client to search for missing songs when they are not available" + schema: + type: boolean + default: true + - variable: LIST + label: "LIST" + description: "Both or missing or cutoff :: both = missing + cutoff :: missng = lidarr missing list :: cutoff = lidarr cutoff list" + schema: + type: string + default: "both" + enum: + - value: "both" + description: "missing + cutoff" + - value: "missing" + description: "lidarr missing list" + - value: "cutoff" + description: "lidarr cutoff list" + - variable: SearchType + label: "Search Type" + description: | + both or artist or fuzzy + both = artist + fuzzy searching + artist = only artist searching + fuzzy = only fuzzy searching (Various Artist is always fuzzy searched, regardless of setting) + schema: + type: string + default: "both" + enum: + - value: "both" + description: "Artist + fuzzy searching." + - value: "artist" + description: "Only artist searching." + - value: "fuzzy" + description: "Only fuzzy searching." + - variable: Concurrency + label: "Concurrency" + description: "Number of concurrent downloads" + schema: + type: int + default: 1 + - variable: EMBEDDED_COVER_QUALITY + label: "Embedded Cover Quality" + description: "Controls the quality of the cover image compression in percentage, 100 = no compression" + schema: + type: int + default: 80 + - variable: FORMAT + label: "Format" + description: | + FLAC or MP3 or OPUS or AAC or ALAC. + FLAC is an audio coding format for lossless compression of digital audio. + MP3 (or mp3) as a file format commonly designates files containing an elementary stream of MPEG-1 Audio or MPEG-2 Audio encoded data. + Opus is a lossy audio coding format developed by the Xiph.Org Foundation and standardized by the Internet Engineering Task Force. + Advanced Audio Coding (AAC) is an audio coding standard for lossy digital audio compression. + schema: + type: string + default: "FLAC" + enum: + - value: "FLAC" + description: "FLAC" + - value: "MP3" + description: "MP3" + - value: "OPUS" + description: "OPUS" + - value: "AAC" + description: "AAC" + - value: "ALAC" + description: "ALAC" + - variable: BITRATE + label: "Bit Rate" + description: "FLAC -> OPUS/AAC/MP3 will be converted using this bitrate (MP3 320/128 is native, not converted)" + schema: + type: int + default: 320 + - variable: ENABLEPOSTPROCESSING + label: "Enable Postprocessing" + description: "true = enabled :: enables or disables post processing processes as much as possible" + schema: + type: boolean + default: true + - variable: FORCECONVERT + label: "Force Convert" + description: "true = enabled :: This will convert lossy MP3 to desired target format (exluding FLAC/ALAC, ALAC will convert to AAC)" + schema: + type: boolean + default: true + - variable: requirequality + label: "Require Quality" + description: "true = enabled :: Requires all downloaded files match target file extension (mp3 or flac) when enabled" + schema: + type: boolean + default: true + - variable: MatchDistance + label: "Match Distance" + description: > + "Set as an integer, the higher the number, the more lenient it is. + Example: A match score of 0 is a perfect match :: For more information, + this score is produced using this function: Algorithm Implementation/Strings/Levenshtein distance" + schema: + type: int + default: 10 + - variable: replaygain + label: "Replay Gain" + description: "true = enabled :: Scans and analyzes files to add replaygain tags to song metadata" + schema: + type: boolean + default: true + - variable: FolderPermissions + label: "Folder Permissions" + description: "Based on chmod linux permissions" + schema: + type: int + default: 766 + - variable: FilePermissions + label: "File Permissions" + description: "Based on chmod linux permissions" + schema: + type: int + default: 666 + - variable: MBRAINZMIRROR + label: "Mbrainz Mirror" + description: "OPTIONAL :: Only change if using a different mirror" + schema: + type: string + default: "https://musicbrainz.org" + - variable: MBRATELIMIT + label: "Mb Rate Limit" + description: "OPTIONAL: musicbrainz rate limit, musicbrainz allows only 1 connection per second, max setting is 10 :: Set to 101 to disable limit" + schema: + type: int + default: 1 + - variable: LidarrUrl + label: "Lidarr Url" + description: "Set domain or IP to your Lidarr instance including port. If using reverse proxy, do not use a trailing slash. Ensure you specify http/s." + schema: + type: string + default: "http://x.x.x.x:8686" + - variable: LidarrAPIkey + label: "Lidarr Api Key" + description: "Lidarr API key." + schema: + type: string + default: "LIDARRAPI" + - variable: ARL_TOKEN + label: "ARL Token" + description: "Deezer ARL Cookie" + schema: + type: string + default: "ARLTOKEN" + - variable: NOTIFYPLEX + label: "Notify PLEX" + description: "true = enabled :: ONLY APPLIES ARTIST MODE :: Plex must have a music library added and be configured to use the exact same mount point as Lidarr's root folder" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: PLEXLIBRARYNAME + label: "PLEX Library Name" + description: "This must exactly match the name of the Plex Library that contains the Lidarr Media Folder data" + schema: + type: string + default: "Music" + - variable: PLEXURL + label: "PLEX URL" + description: "Path to PLEX." + schema: + type: string + default: "http://x.x.x.x:32400" + - variable: PLEXTOKEN + label: "PLEX Token" + description: "PLEX API token." + schema: + type: string + default: "plextoken" + - variable: ALBUM_TYPE_FILTER + label: "Album Type Filter" + description: 'Filter Types: COMPILE, SINGLE, ALBUM, EP (this is a ", " separated list of Album Types to skip) (Applicable to artist mode only)' + schema: + type: string + default: "COMPILE" + - variable: POSTPROCESSTHREADS + label: "Post Process Threads" + description: "Controls number of threads used for Format conversion and replay gain tagging" + schema: + type: int + default: 1 + # Include{containerConfig} + + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + + # Include{serviceExpert} + + # Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: config + label: "App Config Storage" + description: "Stores the Application Configuration." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" + # Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" + # Include{persistenceAdvanced} + - variable: data + label: "App Data Storage" + description: "Stores the Application Data." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" + # Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" + # Include{persistenceAdvanced} + # Include{persistenceList} + + + # Include{ingressList} + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: false + # Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/automatic-music-downloader/templates/common.yaml b/charts/incubator/automatic-music-downloader/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/automatic-music-downloader/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/automatic-music-downloader/values.yaml b/charts/incubator/automatic-music-downloader/values.yaml new file mode 100644 index 00000000000..3267f2f3ba3 --- /dev/null +++ b/charts/incubator/automatic-music-downloader/values.yaml @@ -0,0 +1,35 @@ +image: + repository: tccr.io/truecharts/automatic-music-downloader + pullPolicy: IfNotPresent + tag: latest@sha256:7a1b9f4b3f0cc3341be14792259ed5bedd6c64d0e732bde644b32fcefd6e94b1 + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +service: + main: + enabled: false + ports: + main: + enabled: false + +probes: + liveness: + enabled: false + readiness: + enabled: false + startup: + enabled: false + +persistence: + config: + enabled: true + mountPath: "/config" + data: + enabled: true + mountPath: "/downloads-amd" diff --git a/docs/_static/img/appicons/automatic-music-downloader-icon.png b/docs/_static/img/appicons/automatic-music-downloader-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5acf7a731e444dabfa0a2a14157f1f05aa597a93 GIT binary patch literal 28457 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