Skip to content

Commit

Permalink
393 maintenance bump to version 188 (#394)
Browse files Browse the repository at this point in the history
* Incorporate changes for Tidal hi-res

* Subsonic: advance subsonic-connector to 0.3.2

* Subsonic: add support for SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST

* Update change history for version 1.8.10
  • Loading branch information
GioF71 authored Apr 24, 2024
1 parent 6263186 commit 01ddbe6
Show file tree
Hide file tree
Showing 11 changed files with 197 additions and 31 deletions.
9 changes: 9 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"python.analysis.extraPaths": [
"${workspaceFolder}/src/mediaserver/cdplugins/pycommon"
],
"flake8.args": [
"--max-line-length=120",
"--ignore=E203,E128,E251,E701,E704,W503,W504"
]
}
19 changes: 15 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ ENV SUBSONIC_LEGACYAUTH ""
ENV SUBSONIC_ITEMS_PER_PAGE ""
ENV SUBSONIC_APPEND_YEAR_TO_ALBUM ""
ENV SUBSONIC_APPEND_CODECS_TO_ALBUM ""
ENV SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST ""
ENV SUBSONIC_WHITELIST_CODECS ""
ENV SUBSONIC_DOWNLOAD_PLUGIN ""
ENV SUBSONIC_PLUGIN_BRANCH ""
Expand All @@ -163,14 +164,21 @@ ENV SUBSONIC_TRANSCODE_MAX_BITRATE ""
ENV SUBSONIC_ENABLE_INTERNET_RADIOS ""

ENV TIDAL_ENABLE ""
ENV TIDAL_TOKEN_TYPE ""
ENV TIDAL_ACCESS_TOKEN ""
ENV TIDAL_REFRESH_TOKEN ""
ENV TIDAL_EXPIRY_TIME ""
ENV TIDAL_AUTH_CHALLENGE_TYPE ""
ENV TIDAL_AUDIO_QUALITY ""
ENV TIDAL_PREPEND_NUMBER_IN_ITEM_LIST ""
ENV TIDAL_DOWNLOAD_PLUGIN ""
ENV TIDAL_PLUGIN_BRANCH ""
# TIDAL Simple Oauth2 Authentication
ENV TIDAL_TOKEN_TYPE ""
ENV TIDAL_ACCESS_TOKEN ""
ENV TIDAL_REFRESH_TOKEN ""
ENV TIDAL_EXPIRY_TIME ""
# TIDAL PKCE Authentication
ENV TIDAL_PKCE_TOKEN_TYPE ""
ENV TIDAL_PKCE_ACCESS_TOKEN ""
ENV TIDAL_PKCE_REFRESH_TOKEN ""
ENV TIDAL_PKCE_SESSION_ID ""

ENV RADIO_PARADISE_ENABLE ""
ENV RADIO_PARADISE_DOWNLOAD_PLUGIN ""
Expand Down Expand Up @@ -220,6 +228,9 @@ RUN chmod +x /app/bin/*.sh
COPY app/bin/get-tidal-credentials.py /app/bin/
RUN chmod +x /app/bin/get-tidal-credentials.py

COPY app/bin/get-tidal-credentials-pkce.py /app/bin/
RUN chmod u+x /app/bin/get-tidal-credentials-pkce.py

COPY README.md /app/doc

WORKDIR /app/bin
Expand Down
35 changes: 25 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ A few screenshots for the subsonic plugin on [Kazoo](https://github.com/GioF71/u
First and foremost, the reference to the awesome project:

[An UPnP Audio Media Renderer based on MPD](https://www.lesbonscomptes.com/upmpdcli/).
Current version is `1.8.8`.
Current version is `1.8.10`.

## News

### Support for HiRes Tidal in Preview
### Support for HiRes Tidal

Good news, Tidal HiRes is coming, even if with a limitation: only the mpd/upmpdcli combination works as a renderer AFAIK.
See how to install it in preview [here](https://github.com/GioF71/audio-tools/blob/main/media-servers/tidal-hires/README.md).
Good news, Tidal HiRes is now available.
You need to consider that there is a limitation: only the mpd/upmpdcli combination, as well as gmrender-resurrect, works as a renderer with the Tidal plugin in pkce mode, AFAIK.
A simple installation guide for a mediaserver upmpdcli instance for Tidal Hires is [here](https://github.com/GioF71/audio-tools/blob/main/media-servers/tidal-hires/README.md).

### Subsonic Plugin compatibility

Expand Down Expand Up @@ -225,6 +226,7 @@ SUBSONIC_SERVER_SIDE_SCROBBLING|Subsonic server side scrobbling, set to `yes` if
SUBSONIC_ITEMS_PER_PAGE|Number of items per page, defaults to `100`
SUBSONIC_APPEND_YEAR_TO_ALBUM|If set to `yes` (default), the album year is appended to the album
SUBSONIC_APPEND_CODECS_TO_ALBUM|If set to `yes` (default), the codecs for the album are appended to the album unless all codecs are in the white list
SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST|If set to `yes`, the album in albums list will be numbered, mostly for Kodi, defaults to `no`
SUBSONIC_WHITELIST_CODECS|List of comma-separated whitelist (ideally lossless) codecs. Defaults to `alac,wav,flac,dsf`
SUBSONIC_ENABLE_INTERNET_RADIOS|Set to `yes` to enable internet radios, disabled by default (requires plugin version >= 0.3.4)
SUBSONIC_DOWNLOAD_PLUGIN|If set to `yes`, the updated plugin is downloaded from the upstream repo
Expand All @@ -243,11 +245,16 @@ PLG_MICRO_HTTP_PORT|Port for the qobuz local HTTP service.
PLG_PROXY_METHOD|Proxy method, valid values are `proxy` and `redirect`, defaults to `redirect`
MEDIA_SERVER_FRIENDLY_NAME|Friendly name for the Media Server
TIDAL_ENABLE|Set to `YES` to enable Tidal support, defaults to `no`
TIDAL_TOKEN_TYPE|Tidal token type
TIDAL_ACCESS_TOKEN|Tidal access token
TIDAL_REFRESH_TOKEN|Tidal refresh token
TIDAL_EXPIRY_TIME|Tidal expiry time
TIDAL_QUALITY|Possible values are `LOW` (mp3@96k), `HIGH` (mp3@320k), `LOSSLESS` ([email protected]), `HI_RES` (I believe it's MQA), `HI_RES_LOSSLESS` (flac@hires), defaults to `LOSSLESS`
TIDAL_AUTH_CHALLENGE_TYPE|Default login challenge type, `OAUTH2` (default) or `PKCE`
TIDAL_QUALITY|Possible values are `LOW` (mp3@96k), `HIGH` (mp3@320k), `LOSSLESS` (flac 44.1kHz), `HI_RES` (I believe it's MQA), `HI_RES_LOSSLESS` (flac@hires), defaults to `LOSSLESS`
TIDAL_TOKEN_TYPE|Tidal oauth2 token type
TIDAL_ACCESS_TOKEN|Tidal oauth2 access token
TIDAL_REFRESH_TOKEN|Tidal oauth2 refresh token
TIDAL_EXPIRY_TIME|Tidal oauth2 expiry time
TIDAL_PKCE_TOKEN_TYPE|Tidal pkce token type
TIDAL_PKCE_ACCESS_TOKEN|Tidal pkce access token
TIDAL_PKCE_REFRESH_TOKEN|Tidal pkce refresh token
TIDAL_PKCE_SESSION_ID|Tidal pkce session id
TIDAL_PREPEND_NUMBER_IN_ITEM_LIST|Set to `yes` to create item numbers in lists (`[01] Item` instead of `Item`), mostly for kodi, disabled by default
TIDAL_DOWNLOAD_PLUGIN|If set to `YES`, the updated plugin is downloaded from the upstream repo
TIDAL_PLUGIN_BRANCH|If `TIDAL_DOWNLOAD_PLUGIN`, the branch indicated by this variable will be used. Must be specified if enabling `TIDAL_DOWNLOAD_PLUGIN`. Suggested branch name is `latest-tidal`
Expand Down Expand Up @@ -289,7 +296,7 @@ Volume|Description

It is possible to customize the server icon by mounting a local png file to the container file `/usr/share/upmpdcli/icon.png`. Just put a suitable png file in the same directory of the compose file, then, assuming the icon is called `my-icon.png`, you would want to add an entry to the volumes section, similar to this:

```
```text
volumes:
- ./my-icon.png:/usr/share/upmpdcli/icon.png:ro
```
Expand Down Expand Up @@ -317,6 +324,8 @@ Refer to the file [radiolist.conf](https://github.com/GioF71/upmpdcli-docker/blo

### Obtain Tidal credentials

#### OAUTH2 Mode

In order to obtain your set of tidal credentials, execute the following command:

```text
Expand Down Expand Up @@ -346,6 +355,12 @@ Never share the tokens on the internet (and also on public git repositories).
Remember that currently, the Tidal Plugin actually starts when the first control point (e.g. BubbleUPnP, mConnect) contacts upmpdcli asking for the contents from the Tidal Plugin.
So, you will not see the prompt until you try to use the plugin itself.

#### PKCE Mode

Getting credentials for PKCE mode is slightly different from OAUTH2 mode.
The `challenge` mode, available during while the plugin is running, does not work for pkce mode, because a user input is required, and there is currently no way to make the plugin accept that user input, AFAIK.
So the suggested strategy is described [here](https://github.com/GioF71/audio-tools/blob/main/media-servers/tidal-hires/README.md).

## Usage examples

A few usage examples are available [here](https://github.com/GioF71/upmpdcli-docker/blob/main/doc/example-configurations.md).
Expand Down
60 changes: 60 additions & 0 deletions app/bin/get-tidal-credentials-pkce.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/python3

# Copyright (C) 2024 Giovanni Fulco
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import tidalapi
import json
import os
from pathlib import Path

tidal_plugin_name : str = "tidal"


def print_setting(name : str, value : str):
print(f"{name}={value}")


tmp_directory : str = "generated"
file_path : str = os.path.join("/tmp", tmp_directory)
if not os.path.exists(file_path):
os.makedirs(file_path)

file_name = f"{file_path}/pkce.credentials.json"

session = tidalapi.Session()
session_file1 = Path(file_name)
# Will run until you complete the login process
session.login_session_file(session_file1, do_pkce=True)

token_type = session.token_type
session_id = session.session_id
access_token = session.access_token
refresh_token = session.refresh_token

print("Alternative 1: pkce credentials file, store as /cache/tidal/pkce.credentials.json")
cred_file = open(file_name, "r")
cred_dict = json.load(cred_file)
print(json.dumps(cred_dict, indent=4, sort_keys=True))

print("=============")
print("=============")
print("=============")

print("Alternative 2: Environment variables:")
print_setting("TIDAL_PKCE_TOKEN_TYPE", token_type)
print_setting("TIDAL_PKCE_SESSION_ID", session_id)
print_setting("TIDAL_PKCE_ACCESS_TOKEN", access_token)
print_setting("TIDAL_PKCE_REFRESH_TOKEN", refresh_token)
5 changes: 3 additions & 2 deletions app/bin/get-tidal-credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,18 @@

tidal_plugin_name : str = "tidal"


def print_setting(name : str, value : str):
print(f"{name}={value}")


session = tidalapi.Session()
# Will run until you visit the printed url and link your account
session.login_oauth_simple()

token_type = session.token_type
access_token = session.access_token
refresh_token = session.refresh_token # Not needed if you don't care about refreshing
refresh_token = session.refresh_token
expiry_time = session.expiry_time

storable_expiry_time = datetime.timestamp(expiry_time)
Expand All @@ -39,4 +41,3 @@ def print_setting(name : str, value : str):
print_setting("TIDAL_ACCESS_TOKEN", access_token)
print_setting("TIDAL_REFRESH_TOKEN", refresh_token)
print_setting("TIDAL_EXPIRY_TIME", storable_expiry_time)

85 changes: 72 additions & 13 deletions app/bin/run-upmpdcli.sh
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,17 @@ if [ "${SUBSONIC_ENABLE^^}" == "YES" ]; then
fi
sed -i 's/SUBSONIC_APPEND_CODECS_TO_ALBUM/'"$append_year"'/g' $CONFIG_FILE
fi
if [[ -n "${SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST}" ]]; then
sed -i 's/\#subsonicprependnumberinalbumlist/subsonicprependnumberinalbumlist/g' $CONFIG_FILE
prepend_number=1
if [[ "${SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST^^}" == "NO" ]]; then
prepend_number=0
elif [[ ! "${SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST^^}" == "YES" ]]; then
echo "Invalid SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST [${SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST}]"
exit 2
fi
sed -i 's/SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST/'"$prepend_number"'/g' $CONFIG_FILE
fi
if [[ -n "${SUBSONIC_WHITELIST_CODECS}" ]]; then
sed -i 's/\#subsonicwhitelistcodecs/subsonicwhitelistcodecs/g' $CONFIG_FILE
sed -i 's/SUBSONIC_WHITELIST_CODECS/'"$SUBSONIC_WHITELIST_CODECS"'/g' $CONFIG_FILE
Expand Down Expand Up @@ -533,18 +544,51 @@ if [ "${TIDAL_ENABLE^^}" == "YES" ]; then
sed -i 's/\#tidalautostart/tidalautostart/g' $CONFIG_FILE;
set_parameter $CONFIG_FILE TIDAL_AUTOSTART "$TIDAL_AUTOSTART" tidalautostart
fi
echo "Setting Token Type [$TIDAL_TOKEN_TYPE]"
sed -i 's/\#tidaltokentype/tidaltokentype/g' $CONFIG_FILE
sed -i 's,TIDAL_TOKEN_TYPE,'"$TIDAL_TOKEN_TYPE"',g' $CONFIG_FILE
echo "Setting Access Token [$TIDAL_ACCESS_TOKEN]"
sed -i 's/\#tidalaccesstoken/tidalaccesstoken/g' $CONFIG_FILE
sed -i 's,TIDAL_ACCESS_TOKEN,'"$TIDAL_ACCESS_TOKEN"',g' $CONFIG_FILE
echo "Setting Access Token [$TIDAL_REFRESH_TOKEN]"
sed -i 's/\#tidalrefreshtoken/tidalrefreshtoken/g' $CONFIG_FILE
sed -i 's,TIDAL_REFRESH_TOKEN,'"$TIDAL_REFRESH_TOKEN"',g' $CONFIG_FILE
echo "Setting Token Expiry Time [$TIDAL_EXPIRY_TIME]"
sed -i 's/\#tidalexpirytime/tidalexpirytime/g' $CONFIG_FILE
sed -i 's,TIDAL_EXPIRY_TIME,'"$TIDAL_EXPIRY_TIME"',g' $CONFIG_FILE
if [[ -n "${TIDAL_AUTH_CHALLENGE_TYPE}" ]]; then
echo "Setting Token Type [$TIDAL_AUTH_CHALLENGE_TYPE]"
sed -i 's/\#tidalauthchallengetype/tidalauthchallengetype/g' $CONFIG_FILE
sed -i 's,TIDAL_AUTH_CHALLENGE_TYPE,'"$TIDAL_AUTH_CHALLENGE_TYPE"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_TOKEN_TYPE}" ]]; then
echo "Setting Token Type [$TIDAL_TOKEN_TYPE]"
sed -i 's/\#tidaltokentype/tidaltokentype/g' $CONFIG_FILE
sed -i 's,TIDAL_TOKEN_TYPE,'"$TIDAL_TOKEN_TYPE"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_ACCESS_TOKEN}" ]]; then
echo "Setting Access Token [$TIDAL_ACCESS_TOKEN]"
sed -i 's/\#tidalaccesstoken/tidalaccesstoken/g' $CONFIG_FILE
sed -i 's,TIDAL_ACCESS_TOKEN,'"$TIDAL_ACCESS_TOKEN"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_REFRESH_TOKEN}" ]]; then
echo "Setting Refresh Token [$TIDAL_REFRESH_TOKEN]"
sed -i 's/\#tidalrefreshtoken/tidalrefreshtoken/g' $CONFIG_FILE
sed -i 's,TIDAL_REFRESH_TOKEN,'"$TIDAL_REFRESH_TOKEN"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_EXPIRY_TIME}" ]]; then
echo "Setting Token Expiry Time [$TIDAL_EXPIRY_TIME]"
sed -i 's/\#tidalexpirytime/tidalexpirytime/g' $CONFIG_FILE
sed -i 's,TIDAL_EXPIRY_TIME,'"$TIDAL_EXPIRY_TIME"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_PKCE_TOKEN_TYPE}" ]]; then
echo "Setting PKCE Token Type [$TIDAL_PKCE_TOKEN_TYPE]"
sed -i 's/\#tidalpkcetokentype/tidalpkcetokentype/g' $CONFIG_FILE
sed -i 's,TIDAL_PKCE_TOKEN_TYPE,'"$TIDAL_PKCE_TOKEN_TYPE"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_PKCE_ACCESS_TOKEN}" ]]; then
echo "Setting PKCE Access Token [$TIDAL_PKCE_ACCESS_TOKEN]"
sed -i 's/\#tidalpkceaccesstoken/tidalpkceaccesstoken/g' $CONFIG_FILE
sed -i 's,TIDAL_PKCE_ACCESS_TOKEN,'"$TIDAL_PKCE_ACCESS_TOKEN"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_PKCE_REFRESH_TOKEN}" ]]; then
echo "Setting PKCE Refresh Token [$TIDAL_PKCE_REFRESH_TOKEN]"
sed -i 's/\#tidalpkcerefreshtoken/tidalpkcerefreshtoken/g' $CONFIG_FILE
sed -i 's,TIDAL_PKCE_REFRESH_TOKEN,'"$TIDAL_PKCE_REFRESH_TOKEN"',g' $CONFIG_FILE
fi
if [[ -n "${TIDAL_PKCE_SESSION_ID}" ]]; then
echo "Setting PKCE Session Id [$TIDAL_PKCE_SESSION_ID]"
sed -i 's/\#tidalpkcesessionid/tidalpkcesessionid/g' $CONFIG_FILE
sed -i 's,TIDAL_PKCE_SESSION_ID,'"$TIDAL_PKCE_SESSION_ID"',g' $CONFIG_FILE
fi
if [[ -z "$TIDAL_AUDIO_QUALITY" ]]; then
TIDAL_AUDIO_QUALITY="LOSSLESS"
fi
Expand Down Expand Up @@ -678,8 +722,8 @@ fi
cache_directory=/cache
if [ ! -w "$cache_directory" ]; then
echo "Cache directory [${cache_directory}] is not writable"
mkdir -p /tmp/cache
cache_directory="/tmp/cache"
mkdir -p /tmp/cache
else
echo "Cache directory [${cache_directory}] is writable"
fi
Expand All @@ -699,6 +743,14 @@ sed -i 's\LOG_DIRECTORY\'"$log_directory"'\g' $CONFIG_FILE
cat $CONFIG_FILE

if [[ $current_user_id == 0 ]]; then

# create directory as we are root
if [[ -n "${WEBSERVER_DOCUMENT_ROOT}" ]]; then
echo "Creating directory [${WEBSERVER_DOCUMENT_ROOT}] ..."
mkdir -p $WEBSERVER_DOCUMENT_ROOT
echo "Created directory [${WEBSERVER_DOCUMENT_ROOT}]."
fi

DEFAULT_UID=1000
DEFAULT_GID=1000

Expand Down Expand Up @@ -782,6 +834,13 @@ if [[ $current_user_id == 0 ]]; then
chown -R $USER_NAME:$GROUP_NAME /user/config
chown -R $USER_NAME:$GROUP_NAME /log
echo ". done."

# Correct permissions for WEBSERVER_DOCUMENT_ROOT if set
if [[ -n "${WEBSERVER_DOCUMENT_ROOT}" ]]; then
echo "Setting permissions for directory [${WEBSERVER_DOCUMENT_ROOT}] ..."
chown -R $USER_NAME:$GROUP_NAME $WEBSERVER_DOCUMENT_ROOT
echo ". done."
fi
fi

build_mode=`cat /app/conf/build_mode.txt`
Expand Down
6 changes: 6 additions & 0 deletions app/conf/upmpdcli.conf
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,23 @@ upradiostitle = Upmpdcli Radio List
#subsonicitemsperpage = SUBSONIC_ITEMS_PER_PAGE
#subsonicappendyeartoalbum = SUBSONIC_APPEND_YEAR_TO_ALBUM
#subsonicappendcodecstoalbum = SUBSONIC_APPEND_CODECS_TO_ALBUM
#subsonicprependnumberinalbumlist = SUBSONIC_PREPEND_NUMBER_IN_ALBUM_LIST
#subsonicwhitelistcodecs = SUBSONIC_WHITELIST_CODECS
#subsonictranscodecodec = SUBSONIC_TRANSCODE_CODEC
#subsonictranscodemaxbitrate = SUBSONIC_TRANSCODE_MAX_BITRATE
#subsonicserversidescrobbling = SUBSONIC_SERVER_SIDE_SCROBBLING
#subsonictaginitialpageenabledir = SUBSONIC_ENABLE_INTERNET_RADIOS
#tidaluser = tidal
#tidalautostart = TIDAL_AUTOSTART
#tidalauthchallengetype = TIDAL_AUTH_CHALLENGE_TYPE
#tidaltokentype = TIDAL_TOKEN_TYPE
#tidalaccesstoken = TIDAL_ACCESS_TOKEN
#tidalrefreshtoken = TIDAL_REFRESH_TOKEN
#tidalexpirytime = TIDAL_EXPIRY_TIME
#tidalpkcetokentype = TIDAL_PKCE_TOKEN_TYPE
#tidalpkceaccesstoken = TIDAL_PKCE_ACCESS_TOKEN
#tidalpkcerefreshtoken = TIDAL_PKCE_REFRESH_TOKEN
#tidalpkcesessionid = TIDAL_PKCE_SESSION_ID
#tidalaudioquality = TIDAL_AUDIO_QUALITY
#tidalprependnumberinitemlist = TIDAL_PREPEND_NUMBER_IN_ITEM_LIST
# Radio Paradise
Expand Down
2 changes: 1 addition & 1 deletion app/install/setup-debian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ DEBIAN_VERSION=$(echo $IMAGE_FULL_NAME | cut -d "-" -f 1)
echo "DEBIAN_VERSION=[$DEBIAN_VERSION]"

apt-get update
apt-get install -y wget
apt-get install -y wget git

GPG_KEY_FILE="/usr/share/keyrings/lesbonscomptes.gpg"

Expand Down
1 change: 1 addition & 0 deletions app/install/setup-ubuntu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ set -ex
echo $USE_PPA > /app/conf/ppa.txt

apt-get update
apt-get install -y git
apt-get install -y software-properties-common
add-apt-repository ppa:jean-francois-dockes/${USE_PPA}
apt-get update
Expand Down
Loading

0 comments on commit 01ddbe6

Please sign in to comment.