From 4375a4bb671455057cfd0db9acc15fec62d28390 Mon Sep 17 00:00:00 2001 From: MReenen Date: Wed, 16 Mar 2022 12:35:10 +0100 Subject: [PATCH] stupid submodules --- mopidy | 1 - mopidy-addon/.mdlrc | 1 + mopidy-addon/.yamllint | 66 +++++++ mopidy-addon/DOCS.md | 161 ++++++++++++++++++ mopidy-addon/Dockerfile | 106 ++++++++++++ mopidy-addon/LICENSE.md | 21 +++ mopidy-addon/README.md | 100 +++++++++++ mopidy-addon/build.yaml | 3 + mopidy-addon/config.yaml | 40 +++++ mopidy-addon/icon.png | Bin 0 -> 5016 bytes mopidy-addon/images/screenshot.png | Bin 0 -> 63165 bytes mopidy-addon/logo.png | Bin 0 -> 4440 bytes mopidy-addon/requirements.txt | 10 ++ .../rootfs/etc/cont-init.d/folders.sh | 10 ++ mopidy-addon/rootfs/etc/cont-init.d/nginx.sh | 27 +++ .../rootfs/etc/cont-init.d/packages.sh | 22 +++ mopidy-addon/rootfs/etc/mopidy/mopidy.conf | 43 +++++ .../rootfs/etc/nginx/includes/mime.types | 96 +++++++++++ .../etc/nginx/includes/proxy_params.conf | 15 ++ .../etc/nginx/includes/server_params.conf | 6 + .../rootfs/etc/nginx/includes/ssl_params.conf | 8 + .../rootfs/etc/nginx/includes/upstream.conf | 3 + mopidy-addon/rootfs/etc/nginx/nginx.conf | 47 +++++ .../rootfs/etc/nginx/servers/.gitkeep | 1 + .../rootfs/etc/nginx/templates/direct.gtpl | 36 ++++ .../rootfs/etc/nginx/templates/ingress.gtpl | 19 +++ .../rootfs/etc/services.d/mopidy/finish | 9 + mopidy-addon/rootfs/etc/services.d/mopidy/run | 19 +++ .../rootfs/etc/services.d/nginx/finish | 10 ++ mopidy-addon/rootfs/etc/services.d/nginx/run | 12 ++ 30 files changed, 891 insertions(+), 1 deletion(-) delete mode 160000 mopidy create mode 100644 mopidy-addon/.mdlrc create mode 100644 mopidy-addon/.yamllint create mode 100644 mopidy-addon/DOCS.md create mode 100755 mopidy-addon/Dockerfile create mode 100644 mopidy-addon/LICENSE.md create mode 100644 mopidy-addon/README.md create mode 100644 mopidy-addon/build.yaml create mode 100644 mopidy-addon/config.yaml create mode 100644 mopidy-addon/icon.png create mode 100644 mopidy-addon/images/screenshot.png create mode 100644 mopidy-addon/logo.png create mode 100644 mopidy-addon/requirements.txt create mode 100644 mopidy-addon/rootfs/etc/cont-init.d/folders.sh create mode 100644 mopidy-addon/rootfs/etc/cont-init.d/nginx.sh create mode 100644 mopidy-addon/rootfs/etc/cont-init.d/packages.sh create mode 100644 mopidy-addon/rootfs/etc/mopidy/mopidy.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/includes/mime.types create mode 100644 mopidy-addon/rootfs/etc/nginx/includes/proxy_params.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/includes/server_params.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/includes/ssl_params.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/includes/upstream.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/nginx.conf create mode 100644 mopidy-addon/rootfs/etc/nginx/servers/.gitkeep create mode 100644 mopidy-addon/rootfs/etc/nginx/templates/direct.gtpl create mode 100644 mopidy-addon/rootfs/etc/nginx/templates/ingress.gtpl create mode 100644 mopidy-addon/rootfs/etc/services.d/mopidy/finish create mode 100644 mopidy-addon/rootfs/etc/services.d/mopidy/run create mode 100644 mopidy-addon/rootfs/etc/services.d/nginx/finish create mode 100644 mopidy-addon/rootfs/etc/services.d/nginx/run diff --git a/mopidy b/mopidy deleted file mode 160000 index b39bd04..0000000 --- a/mopidy +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b39bd04ae7b36fa0a8cf209bb7e927f0227db8e4 diff --git a/mopidy-addon/.mdlrc b/mopidy-addon/.mdlrc new file mode 100644 index 0000000..2b0128d --- /dev/null +++ b/mopidy-addon/.mdlrc @@ -0,0 +1 @@ +rules "~MD024" \ No newline at end of file diff --git a/mopidy-addon/.yamllint b/mopidy-addon/.yamllint new file mode 100644 index 0000000..f4bc5a4 --- /dev/null +++ b/mopidy-addon/.yamllint @@ -0,0 +1,66 @@ +--- +rules: + braces: + level: error + min-spaces-inside: 0 + max-spaces-inside: 1 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + brackets: + level: error + min-spaces-inside: 0 + max-spaces-inside: 0 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: -1 + colons: + level: error + max-spaces-before: 0 + max-spaces-after: 1 + commas: + level: error + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + comments: + level: error + require-starting-space: true + min-spaces-from-content: 2 + comments-indentation: + level: error + document-end: + level: error + present: false + document-start: + level: error + present: true + empty-lines: + level: error + max: 1 + max-start: 0 + max-end: 1 + hyphens: + level: error + max-spaces-after: 1 + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: false + key-duplicates: + level: error + line-length: + ignore: | + .github/support.yml + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: + level: error + new-lines: + level: error + type: unix + trailing-spaces: + level: error + truthy: + level: error diff --git a/mopidy-addon/DOCS.md b/mopidy-addon/DOCS.md new file mode 100644 index 0000000..df32d50 --- /dev/null +++ b/mopidy-addon/DOCS.md @@ -0,0 +1,161 @@ +# Home Assistant Community Add-on: Mopidy + +Mopidy plays music from local disk, Youtube, Spotify, SoundCloud, Google Play Music, +and more. You edit the playlist from any phone, tablet, or computer using a +range of MPD and web clients. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Search for the "Mopidy" add-on in the Home Assistant add-on store + and install it. +1. Install the "Mopidy" add-on. +1. Start the "Mopidy" add-on. +1. Check the logs of the "Mopidy" add-on to see if everything went well. + +## Configuration + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +settings: + - name: soundcloud/auth_token + value: 1-1111-1111-11eeaswdf23 + - name: spotify/username + value: your@email.com + - name: spotify/password + value: thesupersecretpassword + - name: spotify/client_id + value: spotify-client-id + - name: spotify/client_secret + value: spotify-client-secret= + - name: gmusic/username + value: username + - name: gmusic/password + value: thesupersecretpassword + - name: gmusic/deviceid + value: yodeviceid + - name: youtube/enabled + value: "true" + - name: file/enabled + value: "true" + - name: file/media_dirs + value: /share/mopidy/media +system_packages: [] +python_packages: [] +``` + +### Option: `settings` + +This option allows you to tweak every aspect of Mopidy by setting +configuration options. See the example at the start of this chapter +to get an idea of how the configuration looks. + +For more information about using these settings, see the official Mopidy +documentation: + + + +**Note**: _This option support secrets, e.g., `!secret spotify_password`._ + +### Option: `system_packages` + +Allows you to specify additional [Debian packages][debian-packages] to +be installed in your shell environment (e.g., Python, PHP, Go). + +**Note**: _Adding many packages will result in a longer start-up +time for the add-on._ + +### Option: `python_packages` + +Allows you to specify additional [Python packages][python-packages] to be +installed to your Mopidy setup (e.g., `PyMySQL`. `Requests`, `Pillow`). + +**Note**: _Adding many packages will result in a longer start-up time +for the add-on._ + +### Option: `leave_front_door_open` + +Adding this option to the add-on configuration allows you to disable +authentication on the Mopidy by setting it to `true`. + +**Note**: _We STRONGLY suggest, not to use this, even if this add-on is +only exposed to your internal network. USE AT YOUR OWN RISK!_ + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Bram Mittendorff][brammittendorff], +[Franck Nijhof][frenck] and [Robbert Müller][mjrider]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2019-2022 Bram Mittendorff, Franck Nijhof, Robbert Müller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[brammittendorff]: https://github.com/brammittendorff +[contributors]: https://github.com/hassio-addons/addon-mopidy/graphs/contributors +[debian-packages]: https://packages.debian.org +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[forum]: https://community.home-assistant.io/?u=frenck +[frenck]: https://github.com/frenck +[issue]: https://github.com/hassio-addons/addon-mopidy/issues +[mjrider]: https://github.com/mjrider +[python-packages]: https://pypi.org +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-mopidy/releases +[semver]: http://semver.org/spec/v2.0.0 diff --git a/mopidy-addon/Dockerfile b/mopidy-addon/Dockerfile new file mode 100755 index 0000000..a5c50a9 --- /dev/null +++ b/mopidy-addon/Dockerfile @@ -0,0 +1,106 @@ +ARG BUILD_FROM=ghcr.io/hassio-addons/debian-base/amd64:4.2.2 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Set shell +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Copy Python requirements file +COPY requirements.txt /tmp/ + +# Setup base +RUN \ + apt-get update \ + \ + && apt-get install -y --no-install-recommends \ + dirmngr=2.2.12-1+deb10u1 \ + gpg-agent=2.2.12-1+deb10u1 \ + gpg=2.2.12-1+deb10u1 \ + nginx=1.14.2-2+deb10u4 \ + git=1:2.20.1-2+deb10u3 \ + \ + && curl -L https://apt.mopidy.com/mopidy.gpg | apt-key add - \ + && curl -L https://apt.mopidy.com/mopidy.list -o /etc/apt/sources.list.d/mopidy.list \ + \ + && apt-get update \ + \ + && apt-get install -y --no-install-recommends \ + libffi-dev=3.2.1-9 \ + libxml2-dev=2.9.4+dfsg1-7+deb10u2 \ + libxslt1-dev=1.1.32-2.2~deb10u1 \ + libasound2-dev=1.1.8-1 \ + libspotify12=12.1.51-1 \ + libspotify-dev=12.1.51-1 \ + zlib1g-dev=1:1.2.11.dfsg-1 \ + build-essential=12.6 \ + python3-dev=3.7.3-1 \ + python3-gi=3.30.4-1 \ + python3-gst-1.0=1.14.4-1+b1 \ + gstreamer1.0-alsa=1.14.4-2+deb10u1 \ + gstreamer1.0-plugins-bad=1.14.4-1+deb10u2 \ + gstreamer1.0-plugins-good=1.14.4-1+deb10u1 \ + gstreamer1.0-plugins-ugly=1.14.4-1+deb10u1 \ + gstreamer1.0-pulseaudio=1.14.4-1+deb10u1 \ + \ + && curl https://bootstrap.pypa.io/get-pip.py | python3 \ + && pip3 install --no-cache-dir -r /tmp/requirements.txt \ + \ + && find /usr/local/lib/python3.7/ -type d -name tests -depth -exec rm -rf {} \; \ + && find /usr/local/lib/python3.7/ -type d -name test -depth -exec rm -rf {} \; \ + && find /usr/local/lib/python3.7/ -name __pycache__ -depth -exec rm -rf {} \; \ + && find /usr/local/lib/python3.7/ -name "*.pyc" -depth -exec rm -f {} \; \ + \ + && apt-get purge -y --auto-remove \ + dirmngr \ + gpg-agent \ + gpg \ + git \ + libffi-dev \ + libxml2-dev \ + libxslt1-dev \ + zlib1g-dev \ + build-essential \ + gcc \ + python-dev \ + dpkg-dev \ + gcc-7 \ + && rm -fr \ + /var/{cache,log}/* \ + /var/lib/apt/lists/* \ + /root/.cache \ + && find /tmp/ -mindepth 1 -delete + +# Move access.log to stdout and error.log to stderr +RUN mkdir -p /var/log/nginx && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log + +# Copy root filesystem +COPY rootfs / + +# Build arguments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Bram Mittendorff, Franck Nijhof, Robbert Müller" \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Community Add-ons" \ + org.opencontainers.image.authors="Bram Mittendorff, Franck Nijhof, Robbert Müller" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://addons.community" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/mopidy-addon/LICENSE.md b/mopidy-addon/LICENSE.md new file mode 100644 index 0000000..69ca3b3 --- /dev/null +++ b/mopidy-addon/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2019-2022 Bram Mittendorff, Franck Nijhof, Robbert Müller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mopidy-addon/README.md b/mopidy-addon/README.md new file mode 100644 index 0000000..646cf92 --- /dev/null +++ b/mopidy-addon/README.md @@ -0,0 +1,100 @@ +# Home Assistant Community Add-on: Mopidy + +[![GitHub Release][releases-shield]][releases] +![Project Stage][project-stage-shield] +[![License][license-shield]](LICENSE.md) + +[![Github Actions][github-actions-shield]][github-actions] +![Project Maintenance][maintenance-shield] +[![GitHub Activity][commits-shield]][commits] + +[![Discord][discord-shield]][discord] +[![Community Forum][forum-shield]][forum] + +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] + +[![Support Frenck on Patreon][patreon-shield]][patreon] + +![HADashboard screenshot](images/screenshot.png) + +Mopidy is an extensible music server. + +## About + +Mopidy plays music from local disk, Youtube, Spotify, SoundCloud, Google Play Music, +and more. You edit the playlist from any phone, tablet, or computer using a +range of MPD and web clients. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Bram Mittendorff][brammittendorff], +[Franck Nijhof][frenck] and [Robbert Müller][mjrider]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2019-2022 Bram Mittendorff, Franck Nijhof, Robbert Müller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[brammittendorff]: https://github.com/brammittendorff +[commits-shield]: https://img.shields.io/github/commit-activity/y/hassio-addons/addon-mopidy.svg +[commits]: https://github.com/hassio-addons/addon-mopidy/commits/main +[contributors]: https://github.com/hassio-addons/addon-mopidy/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[docs]: https://github.com/hassio-addons/addon-mopidy/blob/main/mopidy/DOCS.md +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io/?u=frenck +[frenck]: https://github.com/frenck +[github-actions-shield]: https://github.com/hassio-addons/addon-mopidy/workflows/CI/badge.svg +[github-actions]: https://github.com/hassio-addons/addon-mopidy/actions +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[issue]: https://github.com/hassio-addons/addon-mopidy/issues +[license-shield]: https://img.shields.io/github/license/hassio-addons/addon-mopidy.svg +[maintenance-shield]: https://img.shields.io/maintenance/yes/2022.svg +[mjrider]: https://github.com/mjrider +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-experimental-yellow.svg +[reddit]: https://reddit.com/r/homeassistant +[releases-shield]: https://img.shields.io/github/release/hassio-addons/addon-mopidy.svg +[releases]: https://github.com/hassio-addons/addon-mopidy/releases +[repository]: https://github.com/hassio-addons/repository diff --git a/mopidy-addon/build.yaml b/mopidy-addon/build.yaml new file mode 100644 index 0000000..dcbf9f9 --- /dev/null +++ b/mopidy-addon/build.yaml @@ -0,0 +1,3 @@ +--- +build_from: + amd64: ghcr.io/hassio-addons/debian-base/amd64:4.2.2 diff --git a/mopidy-addon/config.yaml b/mopidy-addon/config.yaml new file mode 100644 index 0000000..d1fa5b5 --- /dev/null +++ b/mopidy-addon/config.yaml @@ -0,0 +1,40 @@ +--- +name: Mopidy +version: dev +slug: mopidy +panel_icon: mdi:music-circle +description: Mopidy is an extensible music server +url: https://github.com/hassio-addons/addon-mopidy +ingress: true +ingress_entry: iris/ +ingress_stream: true +arch: + - amd64 +auth_api: true +audio: true +ports: + 6600/tcp: 6600 + 5555/udp: 5555 + 80/tcp: null +ports_description: + 6600/tcp: Mopidy + 5555/udp: Autoaudiosink + 80/tcp: Web interface (Not required for Ingress) +map: + - config + - share:rw + - ssl +options: + system_packages: [] + python_packages: [] + settings: [] +schema: + log_level: list(trace|debug|info|notice|warning|error|fatal)? + system_packages: + - str + python_packages: + - str + settings: + - name: str + value: str + leave_front_door_open: bool? diff --git a/mopidy-addon/icon.png b/mopidy-addon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e5378220fb8142af556b3b68dcd9bef9b8b1d3e GIT binary patch literal 5016 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 literal 0 HcmV?d00001 diff --git a/mopidy-addon/images/screenshot.png b/mopidy-addon/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..74664093390ac197f6b5902bf3db546a57a135f9 GIT binary patch literal 63165 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�ncS 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 literal 0 HcmV?d00001 diff --git a/mopidy-addon/requirements.txt b/mopidy-addon/requirements.txt new file mode 100644 index 0000000..005f875 --- /dev/null +++ b/mopidy-addon/requirements.txt @@ -0,0 +1,10 @@ +Mopidy==3.2.0 +Pykka==3.0.2 +Mopidy-Local==3.2.1 +Mopidy-AlsaMixer==2.0.1 +Mopidy-Spotify==4.1.1 +Mopidy-Iris==3.62.0 +Mopidy-SoundCloud==3.0.1 +Mopidy-GMusic==4.0.1 +Mopidy-Youtube==3.5 +Mopidy-MPD==3.2.0 \ No newline at end of file diff --git a/mopidy-addon/rootfs/etc/cont-init.d/folders.sh b/mopidy-addon/rootfs/etc/cont-init.d/folders.sh new file mode 100644 index 0000000..be5d6f8 --- /dev/null +++ b/mopidy-addon/rootfs/etc/cont-init.d/folders.sh @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Ensures needed folder exists. +# ============================================================================== +readonly MEDIA_DIR="/share/mopidy/media" + +if ! bashio::fs.directory_exists "${MEDIA_DIR}"; then + mkdir -p "${MEDIA_DIR}" || bashio::exit.nok "Could not create media folder: ${MEDIA_DIR}" +fi diff --git a/mopidy-addon/rootfs/etc/cont-init.d/nginx.sh b/mopidy-addon/rootfs/etc/cont-init.d/nginx.sh new file mode 100644 index 0000000..363dff7 --- /dev/null +++ b/mopidy-addon/rootfs/etc/cont-init.d/nginx.sh @@ -0,0 +1,27 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Configures NGINX +# ============================================================================== + +# Generate Ingress configuration +bashio::var.json \ + interface "$(bashio::addon.ip_address)" \ + entry "$(bashio::addon.ingress_entry)" \ + | tempio \ + -template /etc/nginx/templates/ingress.gtpl \ + -out /etc/nginx/servers/ingress.conf + +# Generate direct access configuration, if enabled. +if bashio::var.has_value "$(bashio::addon.port 80)"; then + bashio::config.require.ssl + bashio::var.json \ + certfile "$(bashio::config 'certfile')" \ + keyfile "$(bashio::config 'keyfile')" \ + leave_front_door_open "^$(bashio::config 'leave_front_door_open')" \ + port "^$(bashio::addon.port 80)" \ + ssl "^$(bashio::config 'ssl')" \ + | tempio \ + -template /etc/nginx/templates/direct.gtpl \ + -out /etc/nginx/servers/direct.conf +fi diff --git a/mopidy-addon/rootfs/etc/cont-init.d/packages.sh b/mopidy-addon/rootfs/etc/cont-init.d/packages.sh new file mode 100644 index 0000000..b8aa53f --- /dev/null +++ b/mopidy-addon/rootfs/etc/cont-init.d/packages.sh @@ -0,0 +1,22 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Install user configured/requested packages +# ============================================================================== + +if bashio::config.has_value 'system_packages'; then + apt update \ + || bashio::exit.nok 'Failed updating Ubuntu packages repository indexes' + + for package in $(bashio::config 'system_packages'); do + apt install -y "$package" \ + || bashio::exit.nok "Failed installing package ${package}" + done +fi + +if bashio::config.has_value 'python_packages'; then + for package in $(bashio::config 'python_packages'); do + pip install "$package" \ + || bashio::exit.nok "Failed installing package ${package}" + done +fi diff --git a/mopidy-addon/rootfs/etc/mopidy/mopidy.conf b/mopidy-addon/rootfs/etc/mopidy/mopidy.conf new file mode 100644 index 0000000..92fe655 --- /dev/null +++ b/mopidy-addon/rootfs/etc/mopidy/mopidy.conf @@ -0,0 +1,43 @@ +[core] +cache_dir = /data/cache +config_dir = /etc/mopidy +data_dir = /data/mopidy +max_tracklist_length = 10000 +restore_state = false + +[logging] +color = true +console_format = %(levelname)-8s %(message)s +debug_format = %(levelname)-8s %(asctime)s [%(process)d:%(threadName)s] %(name)s\n %(message)s +debug_file = /proc/1/fd/1 +config_file = + +[audio] +mixer = software +mixer_volume = +output = autoaudiosink +buffer_time = + +[http] +hostname = 127.0.0.1 +port = 4478 + +[mpd] +hostname = 0.0.0.0 + +[local] +media_dir = /share/mopidy/media +library = sqlite +scan_flush_threshold = 100 + +[stream] +enabled = true +protocols = + http + https + mms + rtmp + rtmps + rtsp +timeout = 5000 +metadata_blacklist = diff --git a/mopidy-addon/rootfs/etc/nginx/includes/mime.types b/mopidy-addon/rootfs/etc/nginx/includes/mime.types new file mode 100644 index 0000000..c230212 --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/includes/mime.types @@ -0,0 +1,96 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} \ No newline at end of file diff --git a/mopidy-addon/rootfs/etc/nginx/includes/proxy_params.conf b/mopidy-addon/rootfs/etc/nginx/includes/proxy_params.conf new file mode 100644 index 0000000..7aa6969 --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/includes/proxy_params.conf @@ -0,0 +1,15 @@ +proxy_http_version 1.1; +proxy_ignore_client_abort off; +proxy_read_timeout 86400s; +proxy_redirect off; +proxy_send_timeout 86400s; +proxy_max_temp_file_size 0; + +proxy_set_header Accept-Encoding ""; +proxy_set_header Connection $connection_upgrade; +proxy_set_header Host $http_host; +proxy_set_header Upgrade $http_upgrade; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header X-NginX-Proxy true; +proxy_set_header X-Real-IP $remote_addr; \ No newline at end of file diff --git a/mopidy-addon/rootfs/etc/nginx/includes/server_params.conf b/mopidy-addon/rootfs/etc/nginx/includes/server_params.conf new file mode 100644 index 0000000..09c0654 --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/includes/server_params.conf @@ -0,0 +1,6 @@ +root /dev/null; +server_name $hostname; + +add_header X-Content-Type-Options nosniff; +add_header X-XSS-Protection "1; mode=block"; +add_header X-Robots-Tag none; diff --git a/mopidy-addon/rootfs/etc/nginx/includes/ssl_params.conf b/mopidy-addon/rootfs/etc/nginx/includes/ssl_params.conf new file mode 100644 index 0000000..e6789cb --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/includes/ssl_params.conf @@ -0,0 +1,8 @@ +ssl_protocols TLSv1.2 TLSv1.3; +ssl_prefer_server_ciphers off; +ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; +ssl_session_timeout 10m; +ssl_session_cache shared:SSL:10m; +ssl_session_tickets off; +ssl_stapling on; +ssl_stapling_verify on; diff --git a/mopidy-addon/rootfs/etc/nginx/includes/upstream.conf b/mopidy-addon/rootfs/etc/nginx/includes/upstream.conf new file mode 100644 index 0000000..f980d8e --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/includes/upstream.conf @@ -0,0 +1,3 @@ +upstream backend { + server 127.0.0.1:4478; +} diff --git a/mopidy-addon/rootfs/etc/nginx/nginx.conf b/mopidy-addon/rootfs/etc/nginx/nginx.conf new file mode 100644 index 0000000..1769ab5 --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,47 @@ +# Run nginx in foreground. +daemon off; + +# This is run inside Docker. +user root; + +# Pid storage location. +pid /var/run/nginx.pid; + +# Set number of worker processes. +worker_processes 1; + +# Enables the use of JIT for regular expressions to speed-up their processing. +pcre_jit on; + +# Write error log to the add-on log. +error_log /proc/1/fd/1 error; + +# Load allowed environment vars +env SUPERVISOR_TOKEN; + +# Max num of simultaneous connections by a worker process. +events { + worker_connections 512; +} + +http { + include /etc/nginx/includes/mime.types; + + access_log off; + client_max_body_size 4G; + default_type application/octet-stream; + gzip on; + keepalive_timeout 65; + sendfile on; + server_tokens off; + tcp_nodelay on; + tcp_nopush on; + + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + include /etc/nginx/includes/upstream.conf; + include /etc/nginx/servers/*.conf; +} diff --git a/mopidy-addon/rootfs/etc/nginx/servers/.gitkeep b/mopidy-addon/rootfs/etc/nginx/servers/.gitkeep new file mode 100644 index 0000000..85ad51b --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/servers/.gitkeep @@ -0,0 +1 @@ +Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley) diff --git a/mopidy-addon/rootfs/etc/nginx/templates/direct.gtpl b/mopidy-addon/rootfs/etc/nginx/templates/direct.gtpl new file mode 100644 index 0000000..5705cb1 --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/templates/direct.gtpl @@ -0,0 +1,36 @@ +server { + {{ if not .ssl }} + listen {{ .port }} default_server; + {{ else }} + listen {{ .port }} default_server ssl http2; + {{ end }} + + include /etc/nginx/includes/server_params.conf; + include /etc/nginx/includes/proxy_params.conf; + + {{ if .ssl }} + include /etc/nginx/includes/ssl_params.conf; + + ssl_certificate /ssl/{{ .certfile }}; + ssl_certificate_key /ssl/{{ .keyfile }}; + {{ end }} + + {{ if not .leave_front_door_open }} + location = /authentication { + internal; + proxy_pass http://supervisor/auth; + proxy_pass_request_body off; + proxy_set_header Content-Length ""; + proxy_set_header X-Supervisor-Token "{{ env "SUPERVISOR_TOKEN" }}"; + } + {{ end }} + + location / { + {{ if not .leave_front_door_open }} + auth_request /authentication; + auth_request_set $auth_status $upstream_status; + {{ end }} + + proxy_pass http://backend; + } +} diff --git a/mopidy-addon/rootfs/etc/nginx/templates/ingress.gtpl b/mopidy-addon/rootfs/etc/nginx/templates/ingress.gtpl new file mode 100644 index 0000000..6f5c24e --- /dev/null +++ b/mopidy-addon/rootfs/etc/nginx/templates/ingress.gtpl @@ -0,0 +1,19 @@ +server { + listen {{ .interface }}:8099 default_server; + + include /etc/nginx/includes/server_params.conf; + include /etc/nginx/includes/proxy_params.conf; + + location / { + allow 172.30.32.2; + deny all; + + proxy_pass http://backend/; + sub_filter_once off; + sub_filter_types *; + sub_filter '/iris/' '{{ .entry }}/iris/'; + sub_filter '/mopidy/ws' '{{ .entry }}/mopidy/ws'; + sub_filter 'href="manifest.json">' 'href="manifest.json" crossorigin="use-credentials">'; + sub_filter 'document.body.appendChild(js);' 'document.body.appendChild(js); (function() { var wait=function(){let t=document.querySelector(".sidebar__menu__item");t?t.click():setTimeout(function(){wait()},100)};wait(); })();'; + } +} \ No newline at end of file diff --git a/mopidy-addon/rootfs/etc/services.d/mopidy/finish b/mopidy-addon/rootfs/etc/services.d/mopidy/finish new file mode 100644 index 0000000..2da28c9 --- /dev/null +++ b/mopidy-addon/rootfs/etc/services.d/mopidy/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Take down the S6 supervision tree when Mopidy fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/mopidy-addon/rootfs/etc/services.d/mopidy/run b/mopidy-addon/rootfs/etc/services.d/mopidy/run new file mode 100644 index 0000000..973b728 --- /dev/null +++ b/mopidy-addon/rootfs/etc/services.d/mopidy/run @@ -0,0 +1,19 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Runs the Mopidy +# ============================================================================== +declare -a options + +bashio::log.info "Starting Mopidy..." + +for var in $(bashio::config 'settings|keys'); do + name=$(bashio::config "settings[${var}].name") + value=$(bashio::config "settings[${var}].value") + bashio::log.info "Setting ${name} to ${value}" + + options+=(-o "${name}=${value}") +done + +# Run Mopidy +exec mopidy --config /etc/mopidy/mopidy.conf "${options[@]}" diff --git a/mopidy-addon/rootfs/etc/services.d/nginx/finish b/mopidy-addon/rootfs/etc/services.d/nginx/finish new file mode 100644 index 0000000..15f7bc2 --- /dev/null +++ b/mopidy-addon/rootfs/etc/services.d/nginx/finish @@ -0,0 +1,10 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Take down the S6 supervision tree when Nginx fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services + diff --git a/mopidy-addon/rootfs/etc/services.d/nginx/run b/mopidy-addon/rootfs/etc/services.d/nginx/run new file mode 100644 index 0000000..181ad16 --- /dev/null +++ b/mopidy-addon/rootfs/etc/services.d/nginx/run @@ -0,0 +1,12 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Mopidy +# Runs the Nginx daemon +# ============================================================================== +declare -a options + +# Wait for Mopidy to become available +bashio::net.wait_for 4478 + +bashio::log.info "Starting NGinx..." +exec nginx "${options[@]}"