make: revamp

* rewrite it in a single, more standard makefile
* forward most commands to npm
* support parallel use
* get rid of load-time auth check and trust user
* rework targets
  * `prep_commit` -> `format`, `lint`
  * `dev`, `beta`, `release` -> `build-dev`, `build-prod`, `build-tests`
  * `prep_staging`, `package`: rm
* update devguide accordingly

Fixes: #1401
This commit is contained in:
tharvik 2023-10-04 16:25:12 +02:00
parent 92dc3b8acb
commit 377827c8d9
No known key found for this signature in database
GPG Key ID: D78C9E1C5909A25B
3 changed files with 121 additions and 243 deletions

132
Makefile
View File

@ -1,28 +1,120 @@
##########################################################################
######################################################################### # Need curl and npm in your $PATH
# Makefile Usage: # If you want to get_images, you'll also need convert from ImageMagick
#
# 1) Make sure that you have the curl command line executable in your path
# 2) Set the variable ROKU_DEV_TARGET in your environment to the IP
# address of your Roku box. (e.g. export ROKU_DEV_TARGET=192.168.1.1.
# Set in your this variable in your shell startup (e.g. .bashrc)
# 3) and set up the ROKU_DEV_PASSWORD environment variable, too
########################################################################## ##########################################################################
APPNAME = Jellyfin_Roku VERSION := 1.6.6
VERSION = 1.6.6
ZIP_EXCLUDE= -x xml/* -x artwork/* -x \*.pkg -x storeassets\* -x keys\* -x \*/.\* -x *.git* -x *.DS* -x *.pkg* -x dist/**\* -x out/**\* ## usage
include app.mk .PHONY: help
help:
@echo "targets"
@echo " build-dev build development package"
@echo " build-prod build production package"
@echo " build-tests build tests package"
@echo " format format brighscripts"
@echo " lint lint code and documentation"
@echo " get_images update official jellyfin images"
@echo "targets needing ROKU_DEV_TARGET"
@echo " home press the home button on device"
@echo " launch launch installed"
@echo "targets needing ROKU_DEV_TARGET and ROKU_DEV_PASSWORD"
@echo " install install on device"
@echo " remove remove installed from device"
@echo " screenshot take a screenshot"
@echo " deploy lint, remove, install"
@echo "environment"
@echo " ROKU_DEV_TARGET with device's IP"
@echo " ROKU_DEV_PASSWORD with device's password"
dev: ## development
$(MAKE) BUILD='dev' package
beta: BUILT_PKG := out/$(notdir $(CURDIR)).zip
$(MAKE) BUILD='beta' package
release: node_modules/: package-lock.json; npm ci
$(MAKE) BUILD='release' package
deploy: prep_staging remove install .PHONY: build-dev build-prod build-tests
.NOTPARALLEL: build-dev build-prod build-tests # output to the same file
build-dev: node_modules/; npm run build
build-prod: node_modules/; npm run build-prod
build-tests: node_modules/; npm run build-tests
# default to build-dev if file doesn't exist
$(BUILT_PKG):; $(MAKE) build-dev
.PHONY: format
format: node_modules/; npm run format
.PHONY: lint
lint: node_modules/
npm run check-formatting
npm run lint
npm run lint-json
npm run lint-markdown
npm run lint-spelling
npm run validate
## roku box
CURL_CMD ?= curl --show-error
ifdef ROKU_DEV_TARGET
.PHONY: home launch
home:
$(CURL_CMD) -XPOST http://$(ROKU_DEV_TARGET):8060/keypress/home
sleep 2 # wait for device reaction
launch:
$(CURL_CMD) -XPOST http://$(ROKU_DEV_TARGET):8060/launch/dev
ifdef ROKU_DEV_PASSWORD
CURL_LOGGED_CMD := $(CURL_CMD) --user rokudev:$(ROKU_DEV_PASSWORD) --digest
EXTRACT_ERROR_CMD := grep "<font color" | sed "s/<font color=\"red\">//" | sed "s[</font>[["
.PHONY: install remove
install: $(BUILT_PKG) home
$(CURL_LOGGED_CMD) -F "mysubmit=Install" -F "archive=@$<" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | $(EXTRACT_ERROR_CMD)
$(MAKE) launch
remove:
$(CURL_LOGGED_CMD) -F "mysubmit=Delete" -F "archive=" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | $(EXTRACT_ERROR_CMD)
.PHONY: screenshot
screenshot:
$(CURL_LOGGED_CMD) -o screenshot.jpg "http://$(ROKU_DEV_TARGET)/pkgs/dev.jpg"
.PHONY: deploy
.NOTPARALLEL: deploy
deploy: lint remove install
endif # ROKU_DEV_PASSWORD
endif # ROKU_DEV_TARGET
## sync branding
CONVERT_CMD ?= convert -gravity center
CONVERT_BLUEBG_CMD := $(CONVERT_CMD) -background "\#000b25"
BANNER := images/banner-dark.svg
ICON := images/icon-transparent.svg
images/:; mkdir $@
.PHONY: redo # force rerun
$(BANNER) $(ICON): images/ redo
$(CURL_CMD) https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/$(@F) > $@
images/logo.png: $(BANNER); $(CONVERT_CMD) -background none -scale 1000x48 -extent 180x48 $< $@
images/channel-poster_fhd.png: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 535x400 -extent 540x405 $< $@
images/channel-poster_hd.png: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 275x205 -extent 336x210 $< $@
images/channel-poster_sd.png: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 182x135 -extent 246x140 $< $@
images/splash-screen_fhd.jpg: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 540x540 -extent 1920x1080 $< $@
images/splash-screen_hd.jpg: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 360x360 -extent 1280x720 $< $@
images/splash-screen_sd.jpg: $(BANNER); $(CONVERT_BLUEBG_CMD) -scale 240x240 -extent 720x480 $< $@
.PHONY: get_images
get_images: $(ICON)
get_images: images/logo.png
get_images: images/channel-poster_fhd.png images/channel-poster_hd.png images/channel-poster_sd.png
get_images: images/splash-screen_fhd.jpg images/splash-screen_hd.jpg images/splash-screen_sd.jpg

215
app.mk
View File

@ -1,215 +0,0 @@
#########################################################################
# common include file for application Makefiles
#
# Makefile Common Usage:
# > make
# > make install
# > make remove
#
# By default, ZIP_EXCLUDE will exclude -x \*.pkg -x storeassets\* -x keys\* -x .\*
# If you define ZIP_EXCLUDE in your Makefile, it will override the default setting.
#
# To exclude different files from being added to the zipfile during packaging
# include a line like this:ZIP_EXCLUDE= -x keys\*
# that will exclude any file who's name begins with 'keys'
# to exclude using more than one pattern use additional '-x <pattern>' arguments
# ZIP_EXCLUDE= -x \*.pkg -x storeassets\*
#
# Important Notes:
# To use the "install" and "remove" targets to install your
# application directly from the shell, you must do the following:
#
# 1) Make sure that you have the curl command line executable in your path
# 2) Set the variable ROKU_DEV_TARGET in your environment to the IP
# address of your Roku box. (e.g. export ROKU_DEV_TARGET=192.168.1.1.
# Set in your this variable in your shell startup (e.g. .bashrc)
# 3) Set the variable ROKU_DEV_PASSWORD in your environment for the password
# associated with the rokudev account.
##########################################################################
BUILD = dev
DISTREL = $(shell pwd)/out
COMMONREL ?= $(shell pwd)/common
SOURCEREL = $(shell pwd)
ZIPREL = $(DISTREL)/apps
STAGINGREL = $(DISTREL)/staging
PKGREL = $(DISTREL)/packages
APPSOURCEDIR = source
IMPORTFILES = $(foreach f,$(IMPORTS),$(COMMONREL)/$f.brs)
IMPORTCLEANUP = $(foreach f,$(IMPORTS),$(APPSOURCEDIR)/$f.brs)
GITCOMMIT = $(shell git rev-parse --short HEAD)
BUILDDATE = $(shell date -u | awk '{ print $$2,$$3,$$6,$$4 }')
BRANDING_ROOT = https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG
ICON_SOURCE = icon-transparent.svg
BANNER_SOURCE = banner-dark.svg
OUTPUT_DIR = ./images
# Locales supported by Roku
SUPPORTED_LOCALES = en_US en_GB fr_CA es_ES de_DE it_IT pt_BR
ifdef ROKU_DEV_PASSWORD
USERPASS = rokudev:$(ROKU_DEV_PASSWORD)
else
USERPASS = rokudev
endif
ifndef ZIP_EXCLUDE
ZIP_EXCLUDE= -x \*.pkg -x storeassets\* -x keys\* -x \*/.\*
endif
HTTPSTATUS = $(shell curl --silent --write-out "\n%{http_code}\n" $(ROKU_DEV_TARGET))
ifeq "$(HTTPSTATUS)" " 401"
CURLCMD = curl -S --tcp-fastopen --connect-timeout 2 --max-time 30 --retry 5
else
CURLCMD = curl -S --tcp-fastopen --connect-timeout 2 --max-time 30 --retry 5 --user $(USERPASS) --digest
endif
home:
@echo "Forcing roku to main menu screen $(ROKU_DEV_TARGET)..."
curl -s -S -d '' http://$(ROKU_DEV_TARGET):8060/keypress/home
sleep 2
prep_staging:
@echo "*** Preparing Staging Area ***"
@echo " >> removing old application zip $(ZIPREL)/$(APPNAME).zip"
@if [ -e "$(ZIPREL)/$(APPNAME).zip" ]; \
then \
rm $(ZIPREL)/$(APPNAME).zip; \
fi
@echo " >> creating destination directory $(ZIPREL)"
@if [ ! -d $(ZIPREL) ]; \
then \
mkdir -p $(ZIPREL); \
fi
@echo " >> setting directory permissions for $(ZIPREL)"
@if [ ! -w $(ZIPREL) ]; \
then \
chmod 755 $(ZIPREL); \
fi
@echo " >> creating destination directory $(STAGINGREL)"
@if [ -d $(STAGINGREL) ]; \
then \
find $(STAGINGREL) -delete; \
fi; \
mkdir -p $(STAGINGREL); \
chmod -R 755 $(STAGINGREL); \
echo " >> moving application to $(STAGINGREL)"
cp $(SOURCEREL)/manifest $(STAGINGREL)/manifest
cp -r $(SOURCEREL)/source $(STAGINGREL)
cp -r $(SOURCEREL)/components $(STAGINGREL)
cp -r $(SOURCEREL)/images $(STAGINGREL)
cp -r $(SOURCEREL)/settings $(STAGINGREL)
# Copy only supported languages over to staging
mkdir $(STAGINGREL)/locale
cp -r $(foreach f,$(SUPPORTED_LOCALES),$(SOURCEREL)/locale/$f) $(STAGINGREL)/locale
ifneq ($(BUILD), dev)
echo "COPYING $(BUILD)"
cp $(SOURCEREL)/resources/branding/$(BUILD)/* $(STAGINGREL)/images
endif
package: prep_staging
@echo "*** Creating $(APPNAME).zip ***"
@echo " >> copying imports"
@if [ "$(IMPORTFILES)" ]; \
then \
mkdir $(APPSOURCEDIR)/common; \
cp -f -p -v $(IMPORTFILES) $(APPSOURCEDIR)/common/; \
fi \
@echo " >> generating build info file"
mkdir -p $(STAGINGREL)/$(APPSOURCEDIR)
@if [ -e "$(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs" ]; \
then \
rm $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs; \
fi
echo " >> generating build info file";\
echo "Function BuildDate()" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
echo " return \"${BUILDDATE}\"" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
echo "End Function" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
echo "Function BuildCommit()" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
echo " return \"${GITCOMMIT}\"" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
echo "End Function" >> $(STAGINGREL)/$(APPSOURCEDIR)/buildinfo.brs
# zip .png files without compression
# do not zip up any files ending with '~'
@echo " >> creating application zip $(STAGINGREL)/../apps/$(APPNAME)-$(BUILD).zip"
@if [ -d $(STAGINGREL) ]; \
then \
cd $(STAGINGREL); \
(zip -0 -r "../apps/$(APPNAME)-$(BUILD).zip" . -i \*.png $(ZIP_EXCLUDE)); \
(zip -9 -r "../apps/$(APPNAME)-$(BUILD).zip" . -x \*~ -x \*.png $(ZIP_EXCLUDE)); \
cd $(SOURCEREL);\
else \
echo "Source for $(APPNAME) not found at $(STAGINGREL)"; \
fi
@if [ "$(IMPORTCLEANUP)" ]; \
then \
echo " >> deleting imports";\
rm -r -f $(APPSOURCEDIR)/common; \
fi \
@echo "*** packaging $(APPNAME)-$(BUILD) complete ***"
prep_commit:
npm run format
npm ci
npm run validate
npm run check-formatting
install: prep_staging package home
@echo "Installing $(APPNAME)-$(BUILD) to host $(ROKU_DEV_TARGET)"
@$(CURLCMD) --user $(USERPASS) --digest -F "mysubmit=Install" -F "archive=@$(ZIPREL)/$(APPNAME)-$(BUILD).zip" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | grep "<font color" | sed "s/<font color=\"red\">//" | sed "s[</font>[["
remove:
@echo "Removing $(APPNAME) from host $(ROKU_DEV_TARGET)"
@if [ "$(HTTPSTATUS)" == " 401" ]; \
then \
$(CURLCMD) --user $(USERPASS) --digest -F "mysubmit=Delete" -F "archive=" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | grep "<font color" | sed "s/<font color=\"red\">//" | sed "s[</font>[[" ; \
else \
curl -s -S -F "mysubmit=Delete" -F "archive=" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | grep "<font color" | sed "s/<font color=\"red\">//" | sed "s[</font>[[" ; \
fi
get_images:
@if [ ! -d $(OUTPUT_DIR) ]; \
then \
mkdir -p $(OUTPUT_DIR); \
echo "Creating images folder"; \
fi
echo "Downloading SVG source files from $(BRANDING_ROOT)"
@wget $(BRANDING_ROOT)/$(ICON_SOURCE) > /dev/null
@wget $(BRANDING_ROOT)/$(BANNER_SOURCE) > /dev/null
echo "Finished downloading SVG files"
echo "Creating image files"
@convert -background "#000b25" -gravity center -scale 535x400 -extent 540x405 $(BANNER_SOURCE) $(OUTPUT_DIR)/channel-poster_fhd.png
@convert -background "#000b25" -gravity center -scale 275x205 -extent 336x210 $(BANNER_SOURCE) $(OUTPUT_DIR)/channel-poster_hd.png
@convert -background "#000b25" -gravity center -scale 182x135 -extent 246x140 $(BANNER_SOURCE) $(OUTPUT_DIR)/channel-poster_sd.png
@convert -background none -gravity center -scale 1000x48 -extent 180x48 $(BANNER_SOURCE) $(OUTPUT_DIR)/logo.png
@convert -background "#000b25" -gravity center -scale 540x540 -extent 1920x1080 $(BANNER_SOURCE) $(OUTPUT_DIR)/splash-screen_fhd.jpg
@convert -background "#000b25" -gravity center -scale 360x360 -extent 1280x720 $(BANNER_SOURCE) $(OUTPUT_DIR)/splash-screen_hd.jpg
@convert -background "#000b25" -gravity center -scale 240x240 -extent 720x480 $(BANNER_SOURCE) $(OUTPUT_DIR)/splash-screen_sd.jpg
echo "Finished creating image files"
screenshot:
SCREENSHOT_TIME=`date "+%s"`; \
curl -m 1 -o screenshot.jpg --user $(USERPASS) --digest "http://$(ROKU_DEV_TARGET)/pkgs/dev.jpg?time=$$SCREENSHOT_TIME" -H 'Accept: image/png,image/*;q=0.8,*/*;q=0.5' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate'

View File

@ -46,6 +46,7 @@ cd jellyfin-roku
Install Dependencies: Install Dependencies:
```bash ```bash
sudo apt-get install npm
npm install npm install
``` ```
@ -86,16 +87,16 @@ Example:
Install Necessary Packages Install Necessary Packages
```bash ```bash
sudo apt-get install wget make zip sudo apt-get install make
``` ```
Build the package Build the package
```bash ```bash
make dev make build-dev
``` ```
This will create a zip in `out/apps/Jellyfin_Roku-dev.zip`. Login to your Roku's device in your browser and upload the zip file then run install. This will create a zip in `out/jellyfin-roku.zip`. Login to your Roku's device in your browser and upload the zip file then run install.
## Method 3: Direct load to Roku Device ## Method 3: Direct load to Roku Device
@ -113,7 +114,7 @@ Normally you would have to open up your browser and upload a .zip file containin
### Install Necessary Packages ### Install Necessary Packages
```bash ```bash
sudo apt-get install wget make zip sudo apt-get install make curl
``` ```
### Deploy ### Deploy
@ -121,7 +122,7 @@ sudo apt-get install wget make zip
Package up the application, send it to your Roku, and launch the channel: Package up the application, send it to your Roku, and launch the channel:
```bash ```bash
make install make build-dev install
``` ```
Note: You only have to run this command once if you are not a developer. The Jellyfin channel will still be installed after rebooting your Roku device. Note: You only have to run this command once if you are not a developer. The Jellyfin channel will still be installed after rebooting your Roku device.
@ -147,7 +148,7 @@ git pull
Deploy the app: Deploy the app:
```bash ```bash
make install make build-dev install
``` ```
## Command Line Workflow ## Command Line Workflow
@ -167,7 +168,7 @@ sudo apt-get install nodejs npm
Before committing your code, please run: Before committing your code, please run:
```bash ```bash
make prep_commit make format lint
``` ```
This will format your code and run the CI checks locally to ensure you will pass the CI tests. This will format your code and run the CI checks locally to ensure you will pass the CI tests.
@ -179,7 +180,7 @@ This repo already contains all necessary images for the app. This script only ne
Install necessary packages: Install necessary packages:
```bash ```bash
sudo apt-get install imagemagick sudo apt-get install curl imagemagick
``` ```
Download and convert images: Download and convert images: