mirror of
https://github.com/TheBinaryNinja/tvapp2.git
synced 2026-06-05 16:25:41 -04:00
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
9eaa896b2d
|
|||
|
ed7abff25a
|
|||
|
4a8f35c0eb
|
|||
|
1debab8452
|
|||
|
53cfd4789e
|
|||
|
d9a89e143a
|
|||
|
55e998bb46
|
|||
|
bd40d20911
|
|||
|
efc5dac8f4
|
|||
|
c33a35003b
|
|||
|
a10c1bcff9
|
|||
|
2025e04b61
|
|||
|
77e2b5e7d6
|
|||
|
9b2b7682e3
|
|||
|
433abb0fec
|
|||
|
012cd0cc44
|
|||
|
f56f934514
|
|||
|
c9aaad376b
|
|||
|
3ebd2478fe
|
|||
|
b3fbaa1d97
|
|||
|
94da974373
|
|||
|
fd76d3ce59
|
|||
|
7c5420d279
|
|||
|
c2ab89457b
|
|||
|
8f87fae452
|
|||
|
d5c9c3550a
|
|||
|
b654cc3469
|
|||
|
fdb99d57d6
|
|||
|
e3e611d47b
|
|||
|
b8ef37188c
|
|||
|
f8d68789fc
|
|||
|
e0c9df41d7
|
|||
|
1363ed4f8a
|
|||
|
3e914b7a99
|
|||
|
d690256369
|
|||
|
18c37feed8
|
|||
|
d21a8721cf
|
|||
|
d0192d9a72
|
|||
|
684963bc2b
|
|||
|
220b995f28
|
8
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
8
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
@@ -14,6 +14,9 @@ body:
|
||||
4. Before creating this bug report, ensure you updated your applications to the latest versions.
|
||||
Check your configurations to ensure there are no typos or errors.
|
||||
Docker users should attempt to re-pull the TVApp2 image to ensure caching is not the cause of an issue.
|
||||
5. To get detailed logs of the issue, set the environment variable:
|
||||
`LOG_LEVEL=5`
|
||||
Restart the docker container and you should get more detailed logs.
|
||||
|
||||
<br />
|
||||
|
||||
@@ -126,9 +129,9 @@ body:
|
||||
- type: textarea
|
||||
id: docker-compose
|
||||
attributes:
|
||||
label: docker-compose.yml
|
||||
label: docker-compose.yml / Run command
|
||||
description: |
|
||||
Copy / paste your `docker-compose.yml` file here
|
||||
Copy / paste your `docker-compose.yml` file or run command here
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
@@ -137,6 +140,7 @@ body:
|
||||
description: |
|
||||
Paste your docker logs here.
|
||||
You can get your docker logs by opening terminal and running `docker logs tvapp2`
|
||||
To get detailed logs, set the environment variable `LOG_LEVEL=5` and restart the container.
|
||||
|
||||
- type: textarea
|
||||
id: screenshots
|
||||
|
||||
148
.github/workflows/deploy-docker-dockerhub.yml
vendored
148
.github/workflows/deploy-docker-dockerhub.yml
vendored
@@ -74,6 +74,21 @@ on:
|
||||
default: '1.0.0'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Registry Name
|
||||
#
|
||||
# options:
|
||||
# - github
|
||||
# - dockerhub
|
||||
# - gitea
|
||||
# #
|
||||
|
||||
IMAGE_REGISTRY:
|
||||
description: '📘 Registry Name'
|
||||
required: true
|
||||
default: 'dockerhub'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Dockerhub › Author
|
||||
#
|
||||
@@ -100,6 +115,18 @@ on:
|
||||
default: 'thebinaryninja'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Alpine Version
|
||||
#
|
||||
# specifies the alpine base docker image version
|
||||
# #
|
||||
|
||||
IMAGE_ALPINE_VERSION:
|
||||
description: '📀 Alpine Version'
|
||||
required: true
|
||||
default: '3.21'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# true no changes to the repo will be made
|
||||
# false workflow will behave normally, and push any changes detected to the files
|
||||
@@ -137,8 +164,10 @@ on:
|
||||
env:
|
||||
IMAGE_NAME: ${{ github.event.inputs.IMAGE_NAME || 'tvapp2' }}
|
||||
IMAGE_VERSION: ${{ github.event.inputs.IMAGE_VERSION || '1.0.0' }}
|
||||
IMAGE_REGISTRY: ${{ github.event.inputs.IMAGE_VERSION || 'dockerhub' }}
|
||||
IMAGE_DOCKERHUB_AUTHOR: ${{ github.event.inputs.IMAGE_DOCKERHUB_AUTHOR || 'thebinaryninja' }}
|
||||
IMAGE_DOCKERHUB_USERNAME: ${{ github.event.inputs.IMAGE_DOCKERHUB_USERNAME || 'thebinaryninja' }}
|
||||
IMAGE_ALPINE_VERSION: ${{ github.event.inputs.IMAGE_ALPINE_VERSION || '3.21' }}
|
||||
|
||||
BOT_NAME_1: EuropaServ
|
||||
BOT_NAME_2: BinaryServ
|
||||
@@ -280,6 +309,7 @@ jobs:
|
||||
echo "NOW_LONG=$(date +'%m-%d-%Y %H:%M')" >> $GITHUB_ENV # 02-25-2025 12:49
|
||||
echo "NOW_DOCKER_LABEL=$(date +'%Y%m%d')" >> $GITHUB_ENV # 20250225
|
||||
echo "NOW_DOCKER_TS=$(date -u +'%FT%T.%3NZ')" >> $GITHUB_ENV # 2025-02-25T12:50:11.569Z
|
||||
echo "GITHUB_SHA1=$(git rev-parse HEAD)" >> $GITHUB_ENV # 012cd0cc44c576c4a57b8a18d86793f244d1080a
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Install Dependencies
|
||||
@@ -412,6 +442,7 @@ jobs:
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -419,9 +450,13 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=dockerhub
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
annotations: |
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -429,8 +464,11 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=dockerhub
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Build and Push › Amd64
|
||||
@@ -441,20 +479,41 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
if: ( github.event_name == 'workflow_dispatch' && inputs.DRY_RUN == false ) || ( github.event_name == 'push' )
|
||||
with:
|
||||
allow: |
|
||||
network.host
|
||||
network: host
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: linux/amd64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_dh_meta.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=amd64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=amd64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=amd64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Export Digest › Amd64
|
||||
@@ -493,20 +552,41 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
if: ( github.event_name == 'workflow_dispatch' && inputs.DRY_RUN == false ) || ( github.event_name == 'push' )
|
||||
with:
|
||||
allow: |
|
||||
network.host
|
||||
network: host
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: linux/arm64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_dh_meta.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=arm64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=arm64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=arm64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Export Digest › Arm64
|
||||
@@ -536,22 +616,6 @@ jobs:
|
||||
if-no-files-found: error
|
||||
retention-days: 10
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Push Manifest
|
||||
# #
|
||||
|
||||
- name: '📦 Push Manifest'
|
||||
id: task_release_dh_manifest
|
||||
uses: int128/docker-manifest-create-action@v2
|
||||
with:
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
sources: |
|
||||
${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_dh_push_amd64.outputs.digest }}
|
||||
${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_dh_push_arm64.outputs.digest }}
|
||||
index-annotations: |
|
||||
${{ steps.task_release_dh_meta.outputs.labels }}
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Checkpoint › Amd64
|
||||
# #
|
||||
@@ -560,23 +624,24 @@ jobs:
|
||||
id: task_release_dh_checkpoint
|
||||
run: |
|
||||
echo ""
|
||||
echo "[ GITHUB ] ---------------------------------------------------------------------------------------------"
|
||||
echo "---- [ GITHUB ] ----------------------------------------------------------------------------------------"
|
||||
echo "github.actor.............................. ${{ github.actor }}"
|
||||
echo "github.ref ............................... ${{ github.ref }}"
|
||||
echo "github.ref_name .......................... ${{ github.ref_name }}"
|
||||
echo "github.event_name ........................ ${{ github.event_name }}"
|
||||
echo "github.repository_owner .................. ${{ github.repository_owner }}"
|
||||
echo "github.repository ........................ ${{ github.repository }}"
|
||||
echo ""
|
||||
echo "[ INPUTS ] ---------------------------------------------------------------------------------------------"
|
||||
echo "github.sha ............................... ${{ github.sha }}"
|
||||
echo -e ""
|
||||
echo "---- [ INPUTS ] ----------------------------------------------------------------------------------------"
|
||||
echo "inputs.IMAGE_NAME ........................ ${{ inputs.IMAGE_NAME }}"
|
||||
echo "inputs.IMAGE_VERSION ..................... ${{ inputs.IMAGE_VERSION }}"
|
||||
echo "inputs.IMAGE_DOCKERHUB_AUTHOR ............ ${{ inputs.IMAGE_DOCKERHUB_AUTHOR }}"
|
||||
echo "inputs.IMAGE_DOCKERHUB_USERNAME .......... ${{ inputs.IMAGE_DOCKERHUB_USERNAME }}"
|
||||
echo "inputs.DEV_RELEASE ....................... ${{ inputs.DEV_RELEASE }}"
|
||||
echo "inputs.DRY_RUN ........................... ${{ inputs.DRY_RUN }}"
|
||||
echo ""
|
||||
echo "[ ENV ] ------------------------------------------------------------------------------------------------"
|
||||
echo -e ""
|
||||
echo "---- [ ENV ] -------------------------------------------------------------------------------------------"
|
||||
echo "env.IMAGE_NAME ........................... ${{ env.IMAGE_NAME }}"
|
||||
echo "env.IMAGE_VERSION ........................ ${{ env.IMAGE_VERSION }}"
|
||||
echo "env.IMAGE_VERSION_1DIGIT ................. ${{ env.IMAGE_VERSION_1DIGIT }}"
|
||||
@@ -591,22 +656,39 @@ jobs:
|
||||
echo "env.REGISTRY_REPO_ORG_AUTHOR_LC .......... ${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}"
|
||||
echo "env.REGISTRY_REPO_AUTHOR_LC .............. ${{ env.REGISTRY_REPO_AUTHOR_LC }}"
|
||||
echo "env.DOCKER_SHA ........................... ${{ env.DOCKER_SHA }}"
|
||||
echo ""
|
||||
echo "[ DOCKER IMAGES ] --------------------------------------------------------------------------------------"
|
||||
echo "env.GITHUB_SHA1 .......................... ${{ env.GITHUB_SHA1 }}"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER IMAGES ] ---------------------------------------------------------------------------------"
|
||||
echo "registry ................................. Dockerhub"
|
||||
echo "tags ..................................... ${{ steps.task_release_dh_meta.outputs.tags }}"
|
||||
echo "labels ................................... ${{ steps.task_release_dh_meta.outputs.labels }}"
|
||||
echo "digest ................................... ${{ steps.task_release_dh_push_amd64.outputs.digest }}"
|
||||
echo ""
|
||||
echo -e ""
|
||||
echo "(release) tags ........................... ${{ steps.task_release_dh_meta.outputs.tags }}"
|
||||
echo "(release) labels ......................... ${{ steps.task_release_dh_meta.outputs.labels }}"
|
||||
echo ""
|
||||
echo "[ DOCKER DIGESTS ] -------------------------------------------------------------------------------------"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER DIGESTS ] --------------------------------------------------------------------------------"
|
||||
echo "docker image id (amd64) .................. ${{ steps.task_release_dh_push_amd64.outputs.imageid }}"
|
||||
echo "docker digest (amd64) .................... ${{ steps.task_release_dh_push_amd64.outputs.digest }}"
|
||||
echo "docker image id (arm64) .................. ${{ steps.task_release_dh_push_arm64.outputs.imageid }}"
|
||||
echo "docker digest (arm64) .................... ${{ steps.task_release_dh_push_arm64.outputs.digest }}"
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Push Manifest
|
||||
# #
|
||||
|
||||
- name: '📦 Push Manifest'
|
||||
id: task_release_dh_manifest
|
||||
uses: int128/docker-manifest-create-action@v2
|
||||
with:
|
||||
tags: |
|
||||
${{ steps.task_release_dh_meta.outputs.tags }}
|
||||
sources: |
|
||||
${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_dh_push_amd64.outputs.digest }}
|
||||
${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_dh_push_arm64.outputs.digest }}
|
||||
index-annotations: |
|
||||
${{ steps.task_release_dh_meta.outputs.labels }}
|
||||
|
||||
# #
|
||||
# Release › Dockerhub › Get Weekly Commits
|
||||
# #
|
||||
|
||||
174
.github/workflows/deploy-docker-gitea.yml
vendored
174
.github/workflows/deploy-docker-gitea.yml
vendored
@@ -74,6 +74,21 @@ on:
|
||||
default: '1.0.0'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Registry Name
|
||||
#
|
||||
# options:
|
||||
# - github
|
||||
# - dockerhub
|
||||
# - gitea
|
||||
# #
|
||||
|
||||
IMAGE_REGISTRY:
|
||||
description: '📘 Registry Name'
|
||||
required: true
|
||||
default: 'gitea'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Gitea › Author
|
||||
#
|
||||
@@ -111,6 +126,18 @@ on:
|
||||
default: 'git.binaryninja.net'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Alpine Version
|
||||
#
|
||||
# specifies the alpine base docker image version
|
||||
# #
|
||||
|
||||
IMAGE_ALPINE_VERSION:
|
||||
description: '📀 Alpine Version'
|
||||
required: true
|
||||
default: '3.21'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# true no changes to the repo will be made
|
||||
# false workflow will behave normally, and push any changes detected to the files
|
||||
@@ -148,9 +175,11 @@ on:
|
||||
env:
|
||||
IMAGE_NAME: ${{ github.event.inputs.IMAGE_NAME || 'tvapp2' }}
|
||||
IMAGE_VERSION: ${{ github.event.inputs.IMAGE_VERSION || '1.0.0' }}
|
||||
IMAGE_REGISTRY: ${{ github.event.inputs.IMAGE_VERSION || 'gitea' }}
|
||||
IMAGE_GITEA_AUTHOR: ${{ github.event.inputs.IMAGE_GITEA_AUTHOR || 'BinaryNinja' }}
|
||||
IMAGE_GITEA_USERNAME: ${{ github.event.inputs.IMAGE_GITEA_USERNAME || 'BinaryNinja' }}
|
||||
IMAGE_GITEA_WEBSITE: ${{ github.event.inputs.IMAGE_GITEA_WEBSITE || 'git.binaryninja.net' }}
|
||||
IMAGE_ALPINE_VERSION: ${{ github.event.inputs.IMAGE_ALPINE_VERSION || '3.21' }}
|
||||
|
||||
BOT_NAME_1: EuropaServ
|
||||
BOT_NAME_2: BinaryServ
|
||||
@@ -292,6 +321,7 @@ jobs:
|
||||
echo "NOW_LONG=$(date +'%m-%d-%Y %H:%M')" >> $GITHUB_ENV # 02-25-2025 12:49
|
||||
echo "NOW_DOCKER_LABEL=$(date +'%Y%m%d')" >> $GITHUB_ENV # 20250225
|
||||
echo "NOW_DOCKER_TS=$(date -u +'%FT%T.%3NZ')" >> $GITHUB_ENV # 2025-02-25T12:50:11.569Z
|
||||
echo "GITHUB_SHA1=$(git rev-parse HEAD)" >> $GITHUB_ENV # 012cd0cc44c576c4a57b8a18d86793f244d1080a
|
||||
|
||||
# #
|
||||
# Release › Gitea › Install Dependencies
|
||||
@@ -428,6 +458,7 @@ jobs:
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -435,9 +466,13 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
annotations: |
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -445,8 +480,11 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Meta › arm64
|
||||
@@ -476,6 +514,7 @@ jobs:
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -483,9 +522,13 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
annotations: |
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -493,8 +536,11 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Meta › Release
|
||||
@@ -536,6 +582,7 @@ jobs:
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -543,9 +590,13 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
annotations: |
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -553,8 +604,11 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=gitea
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Build and Push › Amd64
|
||||
@@ -565,20 +619,41 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
if: ( github.event_name == 'workflow_dispatch' && inputs.DRY_RUN == false ) || ( github.event_name == 'push' )
|
||||
with:
|
||||
allow: |
|
||||
network.host
|
||||
network: host
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: linux/amd64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_gi_meta_amd64.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_amd64.outputs.tags }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_amd64.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=amd64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=amd64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=amd64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Export Digest › Amd64
|
||||
@@ -617,20 +692,41 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
if: ( github.event_name == 'workflow_dispatch' && inputs.DRY_RUN == false ) || ( github.event_name == 'push' )
|
||||
with:
|
||||
allow: |
|
||||
network.host
|
||||
network: host
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: linux/arm64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_gi_meta_arm64.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_arm64.outputs.tags }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_arm64.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=arm64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=arm64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=arm64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Export Digest › Arm64
|
||||
@@ -660,22 +756,6 @@ jobs:
|
||||
if-no-files-found: error
|
||||
retention-days: 10
|
||||
|
||||
# #
|
||||
# Release › Gitea › Push Manifest
|
||||
# #
|
||||
|
||||
- name: '📦 Push Manifest'
|
||||
id: task_release_gi_manifest
|
||||
uses: int128/docker-manifest-create-action@v2
|
||||
with:
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_release.outputs.tags }}
|
||||
sources: |
|
||||
${{ env.IMAGE_GITEA_WEBSITE }}/${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_gi_push_amd64.outputs.digest }}
|
||||
${{ env.IMAGE_GITEA_WEBSITE }}/${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_gi_push_arm64.outputs.digest }}
|
||||
index-annotations: |
|
||||
${{ steps.task_release_gi_meta_release.outputs.labels }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Checkpoint
|
||||
# #
|
||||
@@ -684,15 +764,16 @@ jobs:
|
||||
id: task_release_gi_checkpoint
|
||||
run: |
|
||||
echo ""
|
||||
echo "[ GITHUB ] ---------------------------------------------------------------------------------------------"
|
||||
echo "---- [ GITHUB ] ----------------------------------------------------------------------------------------"
|
||||
echo "github.actor.............................. ${{ github.actor }}"
|
||||
echo "github.ref ............................... ${{ github.ref }}"
|
||||
echo "github.ref_name .......................... ${{ github.ref_name }}"
|
||||
echo "github.event_name ........................ ${{ github.event_name }}"
|
||||
echo "github.repository_owner .................. ${{ github.repository_owner }}"
|
||||
echo "github.repository ........................ ${{ github.repository }}"
|
||||
echo ""
|
||||
echo "[ INPUTS ] ---------------------------------------------------------------------------------------------"
|
||||
echo "github.sha ............................... ${{ github.sha }}"
|
||||
echo -e ""
|
||||
echo "---- [ INPUTS ] ----------------------------------------------------------------------------------------"
|
||||
echo "inputs.IMAGE_NAME ........................ ${{ inputs.IMAGE_NAME }}"
|
||||
echo "inputs.IMAGE_VERSION ..................... ${{ inputs.IMAGE_VERSION }}"
|
||||
echo "inputs.IMAGE_GITEA_USERNAME .............. ${{ inputs.IMAGE_GITEA_AUTHOR }}"
|
||||
@@ -700,8 +781,8 @@ jobs:
|
||||
echo "inputs.IMAGE_GITEA_WEBSITE ............... ${{ inputs.IMAGE_GITEA_WEBSITE }}"
|
||||
echo "inputs.DEV_RELEASE ....................... ${{ inputs.DEV_RELEASE }}"
|
||||
echo "inputs.DRY_RUN ........................... ${{ inputs.DRY_RUN }}"
|
||||
echo ""
|
||||
echo "[ ENV ] ------------------------------------------------------------------------------------------------"
|
||||
echo -e ""
|
||||
echo "---- [ ENV ] -------------------------------------------------------------------------------------------"
|
||||
echo "env.IMAGE_NAME ........................... ${{ env.IMAGE_NAME }}"
|
||||
echo "env.IMAGE_VERSION ........................ ${{ env.IMAGE_VERSION }}"
|
||||
echo "env.IMAGE_VERSION_1DIGIT ................. ${{ env.IMAGE_VERSION_1DIGIT }}"
|
||||
@@ -717,8 +798,9 @@ jobs:
|
||||
echo "env.REGISTRY_REPO_ORG_AUTHOR_LC .......... ${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}"
|
||||
echo "env.REGISTRY_REPO_AUTHOR_LC .............. ${{ env.REGISTRY_REPO_AUTHOR_LC }}"
|
||||
echo "env.DOCKER_SHA ........................... ${{ env.DOCKER_SHA }}"
|
||||
echo ""
|
||||
echo "[ DOCKER IMAGES ] --------------------------------------------------------------------------------------"
|
||||
echo "env.GITHUB_SHA1 .......................... ${{ env.GITHUB_SHA1 }}"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER IMAGES ] ---------------------------------------------------------------------------------"
|
||||
echo "registry ................................. Gitea"
|
||||
echo "(amd64) tags ............................. ${{ steps.task_release_gi_meta_amd64.outputs.tags }}"
|
||||
echo "(amd64) labels ........................... ${{ steps.task_release_gi_meta_amd64.outputs.labels }}"
|
||||
@@ -730,13 +812,29 @@ jobs:
|
||||
echo ""
|
||||
echo "(release) tags ........................... ${{ steps.task_release_gi_meta_release.outputs.tags }}"
|
||||
echo "(release) labels ......................... ${{ steps.task_release_gi_meta_release.outputs.labels }}"
|
||||
echo ""
|
||||
echo "[ DOCKER DIGESTS ] -------------------------------------------------------------------------------------"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER DIGESTS ] --------------------------------------------------------------------------------"
|
||||
echo "docker image id (amd64) .................. ${{ steps.task_release_gi_push_amd64.outputs.imageid }}"
|
||||
echo "docker digest (amd64) .................... ${{ steps.task_release_gi_push_amd64.outputs.digest }}"
|
||||
echo "docker image id (arm64) .................. ${{ steps.task_release_gi_push_arm64.outputs.imageid }}"
|
||||
echo "docker digest (arm64) .................... ${{ steps.task_release_gi_push_arm64.outputs.digest }}"
|
||||
|
||||
# #
|
||||
# Release › Gitea › Push Manifest
|
||||
# #
|
||||
|
||||
- name: '📦 Push Manifest'
|
||||
id: task_release_gi_manifest
|
||||
uses: int128/docker-manifest-create-action@v2
|
||||
with:
|
||||
tags: |
|
||||
${{ steps.task_release_gi_meta_release.outputs.tags }}
|
||||
sources: |
|
||||
${{ env.IMAGE_GITEA_WEBSITE }}/${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_gi_push_amd64.outputs.digest }}
|
||||
${{ env.IMAGE_GITEA_WEBSITE }}/${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}@${{ steps.task_release_gi_push_arm64.outputs.digest }}
|
||||
index-annotations: |
|
||||
${{ steps.task_release_gi_meta_release.outputs.labels }}
|
||||
|
||||
# #
|
||||
# Release › Gitea › Get Weekly Commits
|
||||
# #
|
||||
|
||||
205
.github/workflows/deploy-docker-github.yml
vendored
205
.github/workflows/deploy-docker-github.yml
vendored
@@ -74,6 +74,21 @@ on:
|
||||
default: '1.0.0'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Registry Name
|
||||
#
|
||||
# options:
|
||||
# - github
|
||||
# - dockerhub
|
||||
# - gitea
|
||||
# #
|
||||
|
||||
IMAGE_REGISTRY:
|
||||
description: '📘 Registry Name'
|
||||
required: true
|
||||
default: 'github'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Image Author
|
||||
#
|
||||
@@ -99,6 +114,18 @@ on:
|
||||
default: 'TheBinaryNinja'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# Alpine Version
|
||||
#
|
||||
# specifies the alpine base docker image version
|
||||
# #
|
||||
|
||||
IMAGE_ALPINE_VERSION:
|
||||
description: '📀 Alpine Version'
|
||||
required: true
|
||||
default: '3.21'
|
||||
type: string
|
||||
|
||||
# #
|
||||
# true no changes to the repo will be made
|
||||
# false workflow will behave normally, and push any changes detected to the files
|
||||
@@ -136,8 +163,10 @@ on:
|
||||
env:
|
||||
IMAGE_NAME: ${{ github.event.inputs.IMAGE_NAME || 'tvapp2' }}
|
||||
IMAGE_VERSION: ${{ github.event.inputs.IMAGE_VERSION || '1.0.0' }}
|
||||
IMAGE_REGISTRY: ${{ github.event.inputs.IMAGE_VERSION || 'github' }}
|
||||
IMAGE_GHCR_AUTHOR: ${{ github.event.inputs.IMAGE_GHCR_AUTHOR || 'BinaryNinja' }}
|
||||
IMAGE_GHCR_USERNAME: ${{ github.event.inputs.IMAGE_GHCR_USERNAME || 'BinaryNinja' }}
|
||||
IMAGE_ALPINE_VERSION: ${{ github.event.inputs.IMAGE_ALPINE_VERSION || '3.21' }}
|
||||
|
||||
BOT_NAME_1: EuropaServ
|
||||
BOT_NAME_2: BinaryServ
|
||||
@@ -277,6 +306,7 @@ jobs:
|
||||
echo "NOW_LONG=$(date +'%m-%d-%Y %H:%M')" >> $GITHUB_ENV # 02-25-2025 12:49
|
||||
echo "NOW_DOCKER_LABEL=$(date +'%Y%m%d')" >> $GITHUB_ENV # 20250225
|
||||
echo "NOW_DOCKER_TS=$(date -u +'%FT%T.%3NZ')" >> $GITHUB_ENV # 2025-02-25T12:50:11.569Z
|
||||
echo "GITHUB_SHA1=$(git rev-parse HEAD)" >> $GITHUB_ENV # 012cd0cc44c576c4a57b8a18d86793f244d1080a
|
||||
|
||||
# #
|
||||
# Release › Github › Install Dependencies
|
||||
@@ -410,6 +440,7 @@ jobs:
|
||||
flavor: |
|
||||
latest=false
|
||||
labels: |
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -417,9 +448,13 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=github
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
annotations: |
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
@@ -427,8 +462,11 @@ jobs:
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=github
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Github › Build and Push › Amd64
|
||||
@@ -447,17 +485,33 @@ jobs:
|
||||
platforms: linux/amd64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_gh_meta.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_gh_meta.outputs.tags }}
|
||||
annotations: |
|
||||
${{ steps.task_release_gh_meta.outputs.annotations }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_gh_meta.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=amd64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=amd64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=amd64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Github › Export Digest › Amd64
|
||||
@@ -504,17 +558,33 @@ jobs:
|
||||
platforms: linux/arm64
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.task_release_gh_meta.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.task_release_gh_meta.outputs.tags }}
|
||||
annotations: |
|
||||
${{ steps.task_release_gh_meta.outputs.annotations }}
|
||||
provenance: false
|
||||
sbom: false
|
||||
tags: |
|
||||
${{ steps.task_release_gh_meta.outputs.tags }}
|
||||
build-args: |-
|
||||
ARCH=arm64
|
||||
RELEASE=${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}
|
||||
VERSION=${{ env.IMAGE_VERSION }}
|
||||
BUILDDATE=${{ env.NOW_DOCKER_LABEL }}
|
||||
GIT_SHA1=${{ env.GITHUB_SHA1 }}
|
||||
ALPINE_VERSION=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
annotations: |-
|
||||
org.opencontainers.image.description=TVApp2
|
||||
org.opencontainers.image.created=${{ env.NOW_DOCKER_TS }}
|
||||
org.opencontainers.image.version=${{ env.IMAGE_VERSION }}
|
||||
org.opencontainers.image.licenses=MIT
|
||||
org.opencontainers.image.architecture=arm64
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ env.REGISTRY_REPO_AUTHOR_LC }}
|
||||
org.opencontainers.image.ref.name=${{ github.ref_name }}
|
||||
org.opencontainers.image.development=${{ inputs.DEV_RELEASE == true && 'true' || 'false' }}
|
||||
org.opencontainers.image.registry=${{ env.IMAGE_REGISTRY }}
|
||||
org.tvapp2.image.build-version="Version:- ${{ env.IMAGE_VERSION }} Date:- ${{ env.NOW_DOCKER_LABEL }}"
|
||||
org.tvapp2.image.build-version-alpine=${{ env.IMAGE_ALPINE_VERSION }}
|
||||
org.tvapp2.image.build-architecture=arm64
|
||||
org.tvapp2.image.build-release="${{ inputs.DEV_RELEASE == true && 'development' || 'stable' }}"
|
||||
org.tvapp2.image.build-sha1=${{ env.GITHUB_SHA1 }}
|
||||
|
||||
# #
|
||||
# Release › Github › Export Digest › Arm64
|
||||
@@ -544,6 +614,63 @@ jobs:
|
||||
if-no-files-found: error
|
||||
retention-days: 10
|
||||
|
||||
# #
|
||||
# Release › Github › Checkpoint
|
||||
# #
|
||||
|
||||
- name: '⚠️ Checkpoint'
|
||||
id: task_release_gh_checkpoint
|
||||
run: |
|
||||
echo ""
|
||||
echo "---- [ GITHUB ] ----------------------------------------------------------------------------------------"
|
||||
echo "github.actor.............................. ${{ github.actor }}"
|
||||
echo "github.ref ............................... ${{ github.ref }}"
|
||||
echo "github.ref_name .......................... ${{ github.ref_name }}"
|
||||
echo "github.event_name ........................ ${{ github.event_name }}"
|
||||
echo "github.repository_owner .................. ${{ github.repository_owner }}"
|
||||
echo "github.repository ........................ ${{ github.repository }}"
|
||||
echo "github.sha ............................... ${{ github.sha }}"
|
||||
echo -e ""
|
||||
echo "---- [ INPUTS ] ----------------------------------------------------------------------------------------"
|
||||
echo "inputs.IMAGE_NAME ........................ ${{ inputs.IMAGE_NAME }}"
|
||||
echo "inputs.IMAGE_VERSION ..................... ${{ inputs.IMAGE_VERSION }}"
|
||||
echo "inputs.IMAGE_GHCR_AUTHOR ................. ${{ inputs.IMAGE_GHCR_AUTHOR }}"
|
||||
echo "inputs.IMAGE_GHCR_USERNAME ............... ${{ inputs.IMAGE_GHCR_USERNAME }}"
|
||||
echo "inputs.DEV_RELEASE ....................... ${{ inputs.DEV_RELEASE }}"
|
||||
echo "inputs.DRY_RUN ........................... ${{ inputs.DRY_RUN }}"
|
||||
echo -e ""
|
||||
echo "---- [ ENV ] -------------------------------------------------------------------------------------------"
|
||||
echo "env.IMAGE_NAME ........................... ${{ env.IMAGE_NAME }}"
|
||||
echo "env.IMAGE_VERSION ........................ ${{ env.IMAGE_VERSION }}"
|
||||
echo "env.IMAGE_VERSION_1DIGIT ................. ${{ env.IMAGE_VERSION_1DIGIT }}"
|
||||
echo "env.IMAGE_VERSION_2DIGIT ................. ${{ env.IMAGE_VERSION_2DIGIT }}"
|
||||
echo "env.IMAGE_GHCR_AUTHOR .................... ${{ env.IMAGE_GHCR_AUTHOR }}"
|
||||
echo "env.IMAGE_GHCR_USERNAME .................. ${{ env.IMAGE_GHCR_USERNAME }}"
|
||||
echo "env.NOW .................................. ${{ env.NOW }}"
|
||||
echo "env.NOW_SHORT ............................ ${{ env.NOW_SHORT }}"
|
||||
echo "env.NOW_LONG ............................. ${{ env.NOW_LONG }}"
|
||||
echo "env.NOW_DOCKER_LABEL ..................... ${{ env.NOW_DOCKER_LABEL }}"
|
||||
echo "env.NOW_DOCKER_TS ........................ ${{ env.NOW_DOCKER_TS }}"
|
||||
echo "env.REGISTRY_REPO_ORG_AUTHOR_LC .......... ${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}"
|
||||
echo "env.REGISTRY_REPO_AUTHOR_LC .............. ${{ env.REGISTRY_REPO_AUTHOR_LC }}"
|
||||
echo "env.DOCKER_SHA ........................... ${{ env.DOCKER_SHA }}"
|
||||
echo "env.GITHUB_SHA1 .......................... ${{ env.GITHUB_SHA1 }}"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER IMAGES ] ---------------------------------------------------------------------------------"
|
||||
echo "registry ................................. Github GHCR"
|
||||
echo "tags ..................................... ${{ steps.task_release_gh_meta.outputs.tags }}"
|
||||
echo "labels ................................... ${{ steps.task_release_gh_meta.outputs.labels }}"
|
||||
echo "digest ................................... ${{ steps.task_release_gh_push_amd64.outputs.digest }}"
|
||||
echo -e ""
|
||||
echo "(release) tags ........................... ${{ steps.task_release_gh_meta.outputs.tags }}"
|
||||
echo "(release) labels ......................... ${{ steps.task_release_gh_meta.outputs.labels }}"
|
||||
echo -e ""
|
||||
echo "---- [ DOCKER DIGESTS ] --------------------------------------------------------------------------------"
|
||||
echo "docker image id (amd64) .................. ${{ steps.task_release_gh_push_amd64.outputs.imageid }}"
|
||||
echo "docker digest (amd64) .................... ${{ steps.task_release_gh_push_amd64.outputs.digest }}"
|
||||
echo "docker image id (arm64) .................. ${{ steps.task_release_gh_push_arm64.outputs.imageid }}"
|
||||
echo "docker digest (arm64) .................... ${{ steps.task_release_gh_push_arm64.outputs.digest }}"
|
||||
|
||||
# #
|
||||
# Release › Github › Push Manifest
|
||||
# #
|
||||
@@ -561,62 +688,6 @@ jobs:
|
||||
index-annotations: |
|
||||
${{ steps.task_release_gh_meta.outputs.labels }}
|
||||
|
||||
# #
|
||||
# Release › Github › Checkpoint
|
||||
# #
|
||||
|
||||
- name: '⚠️ Checkpoint'
|
||||
id: task_release_gh_checkpoint
|
||||
run: |
|
||||
echo ""
|
||||
echo "[ GITHUB ] ---------------------------------------------------------------------------------------------"
|
||||
echo "github.actor.............................. ${{ github.actor }}"
|
||||
echo "github.ref ............................... ${{ github.ref }}"
|
||||
echo "github.ref_name .......................... ${{ github.ref_name }}"
|
||||
echo "github.event_name ........................ ${{ github.event_name }}"
|
||||
echo "github.repository_owner .................. ${{ github.repository_owner }}"
|
||||
echo "github.repository ........................ ${{ github.repository }}"
|
||||
echo ""
|
||||
echo "[ INPUTS ] ---------------------------------------------------------------------------------------------"
|
||||
echo "inputs.IMAGE_NAME ........................ ${{ inputs.IMAGE_NAME }}"
|
||||
echo "inputs.IMAGE_VERSION ..................... ${{ inputs.IMAGE_VERSION }}"
|
||||
echo "inputs.IMAGE_GHCR_AUTHOR ................. ${{ inputs.IMAGE_GHCR_AUTHOR }}"
|
||||
echo "inputs.IMAGE_GHCR_USERNAME ............... ${{ inputs.IMAGE_GHCR_USERNAME }}"
|
||||
echo "inputs.DEV_RELEASE ....................... ${{ inputs.DEV_RELEASE }}"
|
||||
echo "inputs.DRY_RUN ........................... ${{ inputs.DRY_RUN }}"
|
||||
echo ""
|
||||
echo "[ ENV ] ------------------------------------------------------------------------------------------------"
|
||||
echo "env.IMAGE_NAME ........................... ${{ env.IMAGE_NAME }}"
|
||||
echo "env.IMAGE_VERSION ........................ ${{ env.IMAGE_VERSION }}"
|
||||
echo "env.IMAGE_VERSION_1DIGIT ................. ${{ env.IMAGE_VERSION_1DIGIT }}"
|
||||
echo "env.IMAGE_VERSION_2DIGIT ................. ${{ env.IMAGE_VERSION_2DIGIT }}"
|
||||
echo "env.IMAGE_GHCR_AUTHOR .................... ${{ env.IMAGE_GHCR_AUTHOR }}"
|
||||
echo "env.IMAGE_GHCR_USERNAME .................. ${{ env.IMAGE_GHCR_USERNAME }}"
|
||||
echo "env.NOW .................................. ${{ env.NOW }}"
|
||||
echo "env.NOW_SHORT ............................ ${{ env.NOW_SHORT }}"
|
||||
echo "env.NOW_LONG ............................. ${{ env.NOW_LONG }}"
|
||||
echo "env.NOW_DOCKER_LABEL ..................... ${{ env.NOW_DOCKER_LABEL }}"
|
||||
echo "env.NOW_DOCKER_TS ........................ ${{ env.NOW_DOCKER_TS }}"
|
||||
echo "env.DOCKER_IMAGE ......................... ${{ env.DOCKER_IMAGE }}"
|
||||
echo "env.REGISTRY_REPO_ORG_AUTHOR_LC .......... ${{ env.REGISTRY_REPO_ORG_AUTHOR_LC }}"
|
||||
echo "env.REGISTRY_REPO_AUTHOR_LC .............. ${{ env.REGISTRY_REPO_AUTHOR_LC }}"
|
||||
echo "env.DOCKER_SHA ........................... ${{ env.DOCKER_SHA }}"
|
||||
echo ""
|
||||
echo "[ DOCKER IMAGES ] --------------------------------------------------------------------------------------"
|
||||
echo "registry ................................. Github GHCR"
|
||||
echo "tags ..................................... ${{ steps.task_release_gh_meta.outputs.tags }}"
|
||||
echo "labels ................................... ${{ steps.task_release_gh_meta.outputs.labels }}"
|
||||
echo "digest ................................... ${{ steps.task_release_gh_push_amd64.outputs.digest }}"
|
||||
echo ""
|
||||
echo "(release) tags ........................... ${{ steps.task_release_gh_meta.outputs.tags }}"
|
||||
echo "(release) labels ......................... ${{ steps.task_release_gh_meta.outputs.labels }}"
|
||||
echo ""
|
||||
echo "[ DOCKER DIGESTS ] -------------------------------------------------------------------------------------"
|
||||
echo "docker image id (amd64) .................. ${{ steps.task_release_gh_push_amd64.outputs.imageid }}"
|
||||
echo "docker digest (amd64) .................... ${{ steps.task_release_gh_push_amd64.outputs.digest }}"
|
||||
echo "docker image id (arm64) .................. ${{ steps.task_release_gh_push_arm64.outputs.imageid }}"
|
||||
echo "docker digest (arm64) .................... ${{ steps.task_release_gh_push_arm64.outputs.digest }}"
|
||||
|
||||
# #
|
||||
# Release › Github › Get Weekly Commits
|
||||
# #
|
||||
|
||||
288
.github/workflows/release.yml
vendored
288
.github/workflows/release.yml
vendored
@@ -77,23 +77,23 @@ on:
|
||||
type: boolean
|
||||
|
||||
# #
|
||||
# ENABLE: released version will be marked as pre-release
|
||||
# DISABLE: release version will be marked as stable / normal release
|
||||
# true released version will be marked as a development build and will have the v1.x.x-development tag instead of -latest
|
||||
# false release version will be marked with -latest docker tag
|
||||
# #
|
||||
|
||||
PRERELEASE:
|
||||
RC_RELEASE:
|
||||
description: '🧪 Build RC (Pre-release)'
|
||||
required: true
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
# #
|
||||
# Release Candidate version number
|
||||
# this will be added to the end of your released app in the releases page.
|
||||
# e.g: tvapp2-v1.0.0-rc.1
|
||||
# only needed if env variable `RC_ONLY` = true
|
||||
# sets the version number for the release candidate
|
||||
# e.g: noxenv-v1.0.0-rc.1
|
||||
# #
|
||||
|
||||
VERSION_RC:
|
||||
RC_VERSION:
|
||||
description: '🧪 RC (Pre-release) Ver (tvapp2-rc.v1)'
|
||||
required: false
|
||||
type: string
|
||||
@@ -105,15 +105,17 @@ on:
|
||||
|
||||
env:
|
||||
PROJECT_NAME: ${{ github.event.inputs.PROJECT_NAME || 'tvapp2' }}
|
||||
CHANGELOG_MODE_COMMIT: true
|
||||
SHOW_UNCATEGORIZED: false
|
||||
PRERELEASE: false
|
||||
VERSION_RC: '1'
|
||||
CHANGELOG_MODE_COMMIT: ${{ github.event.inputs.CHANGELOG_MODE_COMMIT || true }}
|
||||
SHOW_UNCATEGORIZED: ${{ github.event.inputs.SHOW_UNCATEGORIZED || false }}
|
||||
RC_RELEASE: ${{ github.event.inputs.RC_RELEASE || false }}
|
||||
RC_VERSION: ${{ github.event.inputs.RC_VERSION || '1' }}
|
||||
ASSIGN_USER: Aetherinox
|
||||
BOT_NAME_1: EuropaServ
|
||||
BOT_NAME_2: BinaryServ
|
||||
BOT_NAME_DEPENDABOT: dependabot[bot]
|
||||
BOT_NAME_RENOVATE: renovate[bot]
|
||||
GPG_KEY_BASE64: ${{ secrets.ADMINSERV_GPG_KEY_B64 }}
|
||||
GPG_KEY_PASSPHRASE: ${{ secrets.ADMINSERV_GPG_PASSPHRASE }}
|
||||
|
||||
# #
|
||||
# Jobs
|
||||
@@ -207,6 +209,20 @@ jobs:
|
||||
packages: write
|
||||
steps:
|
||||
|
||||
# #
|
||||
# Release › Set Env Variables
|
||||
# #
|
||||
|
||||
- name: >-
|
||||
🕛 Get Timestamp
|
||||
id: task_release_label_set_timestamp
|
||||
run: |
|
||||
echo "YEAR=$(date +'%Y')" >> $GITHUB_ENV
|
||||
echo "NOW=$(date +'%m-%d-%Y %H:%M:%S')" >> $GITHUB_ENV
|
||||
echo "NOW_SHORT=$(date +'%m-%d-%Y')" >> $GITHUB_ENV
|
||||
echo "NOW_LONG=$(date +'%m-%d-%Y %H:%M')" >> $GITHUB_ENV
|
||||
echo "NOW_DOCKER_LABEL=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||
|
||||
# #
|
||||
# Release › Checkout
|
||||
# #
|
||||
@@ -218,17 +234,22 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
# #
|
||||
# Release › Set Env Variables
|
||||
# Release › Start
|
||||
# #
|
||||
|
||||
- name: >-
|
||||
🕛 Get Timestamp
|
||||
id: task_release_label_set_timestamp
|
||||
✅ Start
|
||||
id: task_release_start
|
||||
run: |
|
||||
echo "NOW=$(date +'%m-%d-%Y %H:%M:%S')" >> $GITHUB_ENV
|
||||
echo "NOW_SHORT=$(date +'%m-%d-%Y')" >> $GITHUB_ENV
|
||||
echo "NOW_LONG=$(date +'%m-%d-%Y %H:%M')" >> $GITHUB_ENV
|
||||
echo "NOW_DOCKER_LABEL=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
|
||||
echo " Starting Documentation Build script"
|
||||
echo " Runner .............. ${{ runner.name }}"
|
||||
echo " Workflow ............ ${{ github.workflow }} (#${{ github.workflow_ref }})"
|
||||
echo " Run Number .......... #${{ github.run_number }}"
|
||||
echo " Run ID .............. https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
echo " Triggered By ........ ${{ github.actor }}"
|
||||
echo " Time ................ ${{ env.NOW_LONG }}"
|
||||
echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
|
||||
|
||||
# #
|
||||
# Release › Print Version Debug
|
||||
@@ -288,15 +309,17 @@ jobs:
|
||||
# Release › Build › Stable
|
||||
# #
|
||||
|
||||
- name: '🔨 Build › Stable ( ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip )'
|
||||
- name: '🔨 Build › Stable › ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip'
|
||||
id: task_release_build_st
|
||||
if: ${{ startsWith( inputs.PRERELEASE, false ) }}
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, false ) ||
|
||||
startsWith( env.RC_RELEASE, false )
|
||||
run: |
|
||||
echo Building STABLE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip Dockerfile Dockerfile.aarch64 docker-compose.yml docker-entrypoint.sh root/ tvapp2/package.json README.md LICENSE
|
||||
|
||||
echo Building STABLE Package ${{ env.PROJECT_NAME }}-v${{ env.PACKAGE_VERSION }}-docker-compose.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-v${{ env.PACKAGE_VERSION }}-docker-compose.zip docker-compose.yml README.md LICENSE
|
||||
echo Building STABLE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-docker-compose.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-docker-compose.zip docker-compose.yml README.md LICENSE
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||
|
||||
@@ -304,15 +327,17 @@ jobs:
|
||||
# Release › Build › Release Candidate
|
||||
# #
|
||||
|
||||
- name: '🔨 Build › RC ( ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip )'
|
||||
- name: '🔨 Build › Release Candidate › ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip'
|
||||
id: task_release_build_rc
|
||||
if: ${{ startsWith( inputs.PRERELEASE, true ) }}
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, true ) ||
|
||||
startsWith( env.RC_RELEASE, true )
|
||||
run: |
|
||||
echo Building PRE-RELEASE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip Dockerfile Dockerfile.aarch64 docker-compose.yml docker-entrypoint.sh root/ tvapp2/package.json README.md LICENSE
|
||||
echo Building PRE-RELEASE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip Dockerfile Dockerfile.aarch64 docker-compose.yml docker-entrypoint.sh root/ tvapp2/package.json README.md LICENSE
|
||||
|
||||
echo Building PRE-RELEASE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}-docker-compose.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}-docker-compose.zip docker-compose.yml README.md LICENSE
|
||||
echo Building PRE-RELEASE Package ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}-docker-compose.zip
|
||||
zip -r ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}-docker-compose.zip docker-compose.yml README.md LICENSE
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||
|
||||
@@ -346,21 +371,46 @@ jobs:
|
||||
echo "Tag already present: ${{ env.TAG_EXISTS }}"
|
||||
echo "Tag already present: ${{ steps.task_release_tag_create.outputs.tag_exists }}"
|
||||
|
||||
# #
|
||||
# Release › GPG › Import Key (No Passphrase)
|
||||
#
|
||||
# requires your GPG private key, converted to base64 binary .gpg (not armored .asc)
|
||||
# #
|
||||
|
||||
- name: '🪪 GPG › Import Signing Key › W/o Passphrase'
|
||||
id: task_release_gpg_import_nopass
|
||||
if: env.GPG_KEY_BASE64 != '' && env.GPG_KEY_PASSPHRASE == ''
|
||||
run: |
|
||||
echo $GPG_KEY_BASE64 | base64 -di | gpg --import
|
||||
|
||||
# #
|
||||
# Release › GPG › Import Key (With Passphrase)
|
||||
#
|
||||
# requires your GPG private key, converted to base64 binary .gpg (not armored .asc)
|
||||
# #
|
||||
|
||||
- name: '🪪 GPG › Import Signing Key › w/ Passphrase'
|
||||
id: task_release_gpg_import_withpass
|
||||
if: env.GPG_KEY_BASE64 != '' && env.GPG_KEY_PASSPHRASE != ''
|
||||
run: |
|
||||
echo "$GPG_KEY_BASE64" | base64 -di > /tmp/signing-key.gpg
|
||||
echo "$GPG_KEY_PASSPHRASE" | gpg --pinentry-mode loopback --passphrase-fd 0 --import /tmp/signing-key.gpg
|
||||
(echo "$GPG_KEY_PASSPHRASE"; echo; echo) | gpg --command-fd 0 --pinentry-mode loopback --change-passphrase $(gpg --list-secret-keys --with-colons 2> /dev/null | grep '^sec:' | cut --delimiter ':' --fields 5 | tail -n 1)
|
||||
|
||||
# #
|
||||
# Release › Checksum › Stable
|
||||
# #
|
||||
|
||||
- name: '🆔 Checksum › Stable'
|
||||
id: task_release_checksum_st_set
|
||||
if: ${{ startsWith( inputs.PRERELEASE, false ) }}
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, false ) ||
|
||||
startsWith( env.RC_RELEASE, false )
|
||||
run: |
|
||||
filename_zip="${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip"
|
||||
|
||||
# import gpg key (base64)
|
||||
echo '${{ secrets.ADMINSERV_GPG_KEY_B64 }}' | base64 -d | gpg --import
|
||||
|
||||
# get sha1 and sha256 for .zip and .gz files
|
||||
find . -maxdepth 1 \( -name '*.zip' -o -name '*.gz' \) -printf '%P\n' | xargs -r sha1sum | gpg --digest-algo 256 --clearsign > sha1sum.txt.asc
|
||||
find . -maxdepth 1 \( -name '*.zip' -o -name '*.gz' \) -printf '%P\n' | xargs -r sha1sum | gpg --digest-algo sha256 --clearsign > sha1sum.txt.asc
|
||||
find . -maxdepth 1 \( -name '*.zip' -o -name '*.gz' \) -printf '%P\n' | xargs -r sha256sum | gpg --digest-algo sha256 --clearsign > sha256sum.txt.asc
|
||||
|
||||
# get sha1sum; assign to variable
|
||||
@@ -379,28 +429,44 @@ jobs:
|
||||
sha256sum_compose="$(shasum --algorithm 256 ${filename_compose_zip} | awk '{ print $1 }')"
|
||||
echo "FILE_COMPOSE_ZIP=${filename_compose_zip}" >> $GITHUB_ENV
|
||||
|
||||
gpg --batch --yes --quiet --armor --detach-sig --sign --output sha256sum.sig sha256sum.txt.asc
|
||||
gpg --batch --yes --quiet --armor --detach-sig --sign --output sha1sum.sig sha1sum.txt.asc
|
||||
|
||||
# #
|
||||
# Release › Checksum › Release Candidate
|
||||
# #
|
||||
|
||||
- name: '🆔 Checksum › RC'
|
||||
- name: '🆔 Checksum › Release Candidate'
|
||||
id: task_release_checksum_rc_set
|
||||
if: ${{ startsWith( inputs.PRERELEASE, true ) }}
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, true ) ||
|
||||
startsWith( env.RC_RELEASE, true )
|
||||
run: |
|
||||
# get filename
|
||||
filename_zip="${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip"
|
||||
# get sha256 checksum
|
||||
sha256="$(shasum --algorithm 256 ${filename_zip} | awk '{ print $1 }')"
|
||||
filename_zip="${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip"
|
||||
|
||||
# write sha256sum to file
|
||||
shasum --algorithm 256 ${filename_zip} > SHA256SUMS.txt
|
||||
# get sha1 and sha256 for .zip and .gz files
|
||||
find . -maxdepth 1 \( -name '*.zip' -o -name '*.gz' \) -printf '%P\n' | xargs -r sha1sum | gpg --digest-algo sha256 --clearsign > sha1sum.txt.asc
|
||||
find . -maxdepth 1 \( -name '*.zip' -o -name '*.gz' \) -printf '%P\n' | xargs -r sha256sum | gpg --digest-algo sha256 --clearsign > sha256sum.txt.asc
|
||||
|
||||
# get sha1sum; assign to variable
|
||||
sha1sum="$(shasum --algorithm 1 ${filename_zip} | awk '{ print $1 }')"
|
||||
echo "SHA1SUM=${sha1sum}" >> $GITHUB_ENV
|
||||
|
||||
# get sha256sum; assign to variable
|
||||
sha256sum="$(shasum --algorithm 256 ${filename_zip} | awk '{ print $1 }')"
|
||||
echo "SHA256SUM=${sha256sum}" >> $GITHUB_ENV
|
||||
|
||||
# no longer needed, replaced by find . command
|
||||
# shasum --algorithm 256 ${filename_zip} > SHA256SUMS.txt
|
||||
echo "FILE_ZIP=${filename_zip}" >> $GITHUB_ENV
|
||||
echo "SHA256SUM=${sha256}" >> $GITHUB_ENV
|
||||
|
||||
filename_compose_zip="${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}-docker-compose.zip"
|
||||
filename_compose_zip="${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}-docker-compose.zip"
|
||||
sha256_compose="$(shasum --algorithm 256 ${filename_compose_zip} | awk '{ print $1 }')"
|
||||
echo "FILE_COMPOSE_ZIP=${filename_compose_zip}" >> $GITHUB_ENV
|
||||
|
||||
gpg --batch --yes --quiet --armor --detach-sig --sign --output sha256sum.sig sha256sum.txt.asc
|
||||
gpg --batch --yes --quiet --armor --detach-sig --sign --output sha1sum.sig sha1sum.txt.asc
|
||||
|
||||
# #
|
||||
# Release › Checksum › Print
|
||||
# #
|
||||
@@ -423,31 +489,13 @@ jobs:
|
||||
avatarSize: 42
|
||||
|
||||
# #
|
||||
# Release › Checksum › Add (Stable)
|
||||
# #
|
||||
|
||||
- name: '📦 Zip › Add Checksum › Stable'
|
||||
id: task_release_zip_st
|
||||
if: ${{ startsWith( inputs.PRERELEASE, false ) }}
|
||||
run: |
|
||||
echo Zipping STABLE Package .zip ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
zip -jr ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip sha1sum.txt.asc sha256sum.txt.asc
|
||||
ls
|
||||
|
||||
# #
|
||||
# Release › Checksum › Add (Release Candidate)
|
||||
# #
|
||||
|
||||
- name: '📦 Zip › Add Checksum › RC'
|
||||
id: task_release_zip_rc
|
||||
if: ${{ startsWith( inputs.PRERELEASE, true ) }}
|
||||
run: |
|
||||
echo Zipping PRE-RELEASE Package .zip ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip
|
||||
zip -jr ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip sha1sum.txt.asc sha256sum.txt.asc
|
||||
ls
|
||||
|
||||
# #
|
||||
# Release › Generate Tags
|
||||
# Release › Changelog › Generate Tags
|
||||
#
|
||||
# generates a changelog from the github api. requires a PREVIOUS_TAG in order to figure
|
||||
# out the changes made between the two versions.
|
||||
#
|
||||
# outputs:
|
||||
# ${{ steps.changelog.outputs.changelog }}
|
||||
# #
|
||||
|
||||
- name: '📝 Changelog › Pre Setup (Categorized Commits)'
|
||||
@@ -562,14 +610,56 @@ jobs:
|
||||
echo "$CHANGELOG_UNCATEGORIZED"
|
||||
|
||||
# #
|
||||
# Release › List Tree
|
||||
# Release › Verbose › List Tree
|
||||
# #
|
||||
|
||||
- name: '⚙️ Debug › Tree Listing'
|
||||
id: task_release_debug_tree
|
||||
- name: '⚙️ Verbose › Tree Listing'
|
||||
id: task_release_verbose_tree
|
||||
run: |
|
||||
tree
|
||||
|
||||
# #
|
||||
# Release › Verbose › Changelog › Print Categorized
|
||||
# #
|
||||
|
||||
- name: '⚙️ Verbose › Changelog › Categorized'
|
||||
id: task_release_changelog_verbose_categorized
|
||||
if: |
|
||||
startsWith( inputs.SHOW_UNCATEGORIZED, false ) ||
|
||||
startsWith( env.SHOW_UNCATEGORIZED, false )
|
||||
env:
|
||||
CHANGELOG_CATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
CHANGELOG_UNCATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
run: |
|
||||
echo
|
||||
echo "---- CHANGELOG [ Categorized ] -----------------------------------------------"
|
||||
echo
|
||||
echo "$CHANGELOG_CATEGORIZED"
|
||||
echo
|
||||
echo "---- CHANGELOG ---------------------------------------------------------------"
|
||||
echo
|
||||
|
||||
# #
|
||||
# Release › Verbose › Changelog › Print Uncategorized
|
||||
# #
|
||||
|
||||
- name: '⚙️ Verbose › Changelog › Uncategorized'
|
||||
id: task_release_changelog_verbose_uncategorized
|
||||
if: |
|
||||
startsWith( inputs.SHOW_UNCATEGORIZED, true ) ||
|
||||
startsWith( env.SHOW_UNCATEGORIZED, true )
|
||||
env:
|
||||
CHANGELOG_CATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
CHANGELOG_UNCATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
run: |
|
||||
echo
|
||||
echo "---- CHANGELOG [ Uncategorized ] ---------------------------------------------"
|
||||
echo
|
||||
echo "$CHANGELOG_UNCATEGORIZED"
|
||||
echo
|
||||
echo "---- CHANGELOG ---------------------------------------------------------------"
|
||||
echo
|
||||
|
||||
# #
|
||||
# Release › Post Release (Stable)
|
||||
#
|
||||
@@ -582,10 +672,12 @@ jobs:
|
||||
- name: '🏳️ Post › Stable'
|
||||
id: task_release_bundle_st
|
||||
if: |
|
||||
startsWith( inputs.PRERELEASE, false ) ||
|
||||
startsWith( env.PRERELEASE, false )
|
||||
uses: softprops/action-gh-release@v2
|
||||
startsWith( inputs.RC_RELEASE, false ) ||
|
||||
startsWith( env.RC_RELEASE, false )
|
||||
uses: softprops/action-gh-release@v2.2.2
|
||||
env:
|
||||
CHANGELOG_CATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
CHANGELOG_UNCATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
GITHUB_TOKEN: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||
with:
|
||||
token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||
@@ -595,10 +687,12 @@ jobs:
|
||||
draft: false
|
||||
generate_release_notes: false
|
||||
files: |
|
||||
${{ env.PROJECT_NAME }}-v${{ env.PACKAGE_VERSION }}-docker-compose.zip
|
||||
${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-docker-compose.zip
|
||||
${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
sha1sum.txt.asc
|
||||
sha256sum.txt.asc
|
||||
sha256sum.sig
|
||||
sha1sum.sig
|
||||
prerelease: false
|
||||
body: |
|
||||
${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
@@ -613,14 +707,16 @@ jobs:
|
||||
# ${{ steps.task_release_bundle_st.outputs.id
|
||||
# #
|
||||
|
||||
- name: "🏳️ Post › Release Candidate"
|
||||
- name: '🏳️ Post › Release Candidate'
|
||||
id: task_release_bundle_rc
|
||||
if: |
|
||||
startsWith( inputs.PRERELEASE, true ) ||
|
||||
startsWith( env.PRERELEASE, true )
|
||||
uses: softprops/action-gh-release@v2
|
||||
startsWith( inputs.RC_RELEASE, true ) ||
|
||||
startsWith( env.RC_RELEASE, true )
|
||||
uses: softprops/action-gh-release@v2.2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ADMINSERV_TOKEN }}
|
||||
CHANGELOG_CATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
CHANGELOG_UNCATEGORIZED: ${{ steps.task_release_changelog_categorized.outputs.changelog }}
|
||||
GITHUB_TOKEN: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||
with:
|
||||
token: ${{ secrets.ADMINSERV_TOKEN }}
|
||||
name: v${{ env.PACKAGE_VERSION }}
|
||||
@@ -629,10 +725,12 @@ jobs:
|
||||
draft: false
|
||||
generate_release_notes: false
|
||||
files: |
|
||||
${{ env.PROJECT_NAME }}-v${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}-docker-compose.zip
|
||||
${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.VERSION_RC }}.zip
|
||||
${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}-docker-compose.zip
|
||||
${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip
|
||||
sha1sum.txt.asc
|
||||
sha256sum.txt.asc
|
||||
sha256sum.sig
|
||||
sha1sum.sig
|
||||
prerelease: false
|
||||
body: |
|
||||
> [!WARNING]
|
||||
@@ -676,19 +774,37 @@ jobs:
|
||||
echo "---- CHANGELOG ---------------------------------------------------------------"
|
||||
|
||||
# #
|
||||
# Release › Upload Artifacts › Release Files
|
||||
# Release › Upload Artifacts › Release Files › Stable
|
||||
# #
|
||||
|
||||
- name: >-
|
||||
📋 Upload Artifacts › ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
id: task_release_artifact
|
||||
📋 Upload Artifacts › Stable › ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
id: task_release_artifact_stable
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, false ) ||
|
||||
startsWith( env.RC_RELEASE, false )
|
||||
with:
|
||||
name: "${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}"
|
||||
path: ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
retention-days: 30
|
||||
|
||||
# #
|
||||
# Release › Upload Artifacts › Release Files › Release Candidate
|
||||
# #
|
||||
|
||||
- name: >-
|
||||
📋 Upload Artifacts › RC › ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}.zip
|
||||
id: task_release_artifact_rc
|
||||
uses: actions/upload-artifact@v4
|
||||
if: |
|
||||
startsWith( inputs.RC_RELEASE, true ) ||
|
||||
startsWith( env.RC_RELEASE, true )
|
||||
with:
|
||||
name: "${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}"
|
||||
path: ${{ env.PROJECT_NAME }}-${{ env.PACKAGE_VERSION }}-rc.${{ inputs.RC_VERSION }}.zip
|
||||
retention-days: 30
|
||||
|
||||
# #
|
||||
# Job › Complete
|
||||
# #
|
||||
|
||||
21
Dockerfile
21
Dockerfile
@@ -57,6 +57,8 @@ ARG ALPINE_VERSION=3.21
|
||||
ARG BUILDDATE
|
||||
ARG VERSION
|
||||
ARG RELEASE
|
||||
ARG GIT_SHA1=0000000000000000000000000000000000000000
|
||||
ARG REGISTRY=local
|
||||
|
||||
# #
|
||||
# Set Labels
|
||||
@@ -73,15 +75,16 @@ LABEL org.opencontainers.image.repo.3="https://github.com/aetherinox/docker-base
|
||||
LABEL org.opencontainers.image.documentation="https://thebinaryninja.github.io/tvapp2"
|
||||
LABEL org.opencontainers.image.url="https://github.com/thebinaryninja/tvapp2/pkgs/container/tvapp2"
|
||||
LABEL org.opencontainers.image.licenses="MIT"
|
||||
LABEL org.opencontainers.image.architecture="${ARCH}"
|
||||
LABEL org.opencontainers.image.architecture="${ARCH:-amd64}"
|
||||
LABEL org.opencontainers.image.ref.name="main"
|
||||
LABEL org.opencontainers.image.registry="local"
|
||||
LABEL org.opencontainers.image.release="${RELEASE}"
|
||||
LABEL org.opencontainers.image.registry="${REGISTRY:-local}"
|
||||
LABEL org.opencontainers.image.release="${RELEASE:-stable}"
|
||||
LABEL org.tvapp2.image.maintainers="Aetherinox, iFlip721, Optx"
|
||||
LABEL org.tvapp2.image.build-version="Version:- ${VERSION} Date:- ${BUILDDATE}"
|
||||
LABEL org.tvapp2.image.build-version-alpine="${ALPINE_VERSION}"
|
||||
LABEL org.tvapp2.image.build-architecture="${ARCH}"
|
||||
LABEL org.tvapp2.image.build-release="${RELEASE}"
|
||||
LABEL org.tvapp2.image.build-version="Version:- ${VERSION} Date:- ${BUILDDATE:-3.21}"
|
||||
LABEL org.tvapp2.image.build-version-alpine="${ALPINE_VERSION:-3.21}"
|
||||
LABEL org.tvapp2.image.build-architecture="${ARCH:-amd64}"
|
||||
LABEL org.tvapp2.image.build-release="${RELEASE:-stable}"
|
||||
LABEL org.tvapp2.image.build-sha1="${GIT_SHA1:-0000000000000000000000000000000000000000}"
|
||||
|
||||
# #
|
||||
# Set Env Var
|
||||
@@ -89,7 +92,7 @@ LABEL org.tvapp2.image.build-release="${RELEASE}"
|
||||
|
||||
ENV NODE_VERSION=22.8.0
|
||||
ENV YARN_VERSION=1.22.22
|
||||
ENV RELEASE="${RELEASE}"
|
||||
ENV RELEASE="${RELEASE:-stable}"
|
||||
ENV DIR_BUILD=/usr/src/app
|
||||
ENV DIR_RUN=/usr/bin/app
|
||||
ENV URL_REPO="https://git.binaryninja.net/binaryninja/"
|
||||
@@ -106,6 +109,7 @@ ENV HEALTH_TIMER=600000
|
||||
ENV TASK_CRON_SYNC="0 0 */3 * *"
|
||||
ENV LOG_LEVEL=4
|
||||
ENV TZ="Etc/UTC"
|
||||
ENV GIT_SHA1=${GIT_SHA1:-0000000000000000000000000000000000000000}
|
||||
|
||||
# #
|
||||
# Install
|
||||
@@ -117,6 +121,7 @@ RUN \
|
||||
curl \
|
||||
bash \
|
||||
nano \
|
||||
git \
|
||||
npm \
|
||||
openssl
|
||||
|
||||
|
||||
111
README.md
111
README.md
@@ -7,7 +7,7 @@
|
||||
|
||||
<div align="center">
|
||||
|
||||
<img src="docs/img/screenshots/01.png" height="320">
|
||||
<img src="docs/img/screenshots/01.gif" height="450">
|
||||
|
||||
<br />
|
||||
<br />
|
||||
@@ -154,13 +154,34 @@ For the [environment variables](#environment-variables), you may specify these i
|
||||
|
||||
#### Environment Variables
|
||||
|
||||
The following is a list of environment variables you can declare within your `docker-compose.yml` or docker run command:
|
||||
|
||||
<br />
|
||||
|
||||
> [!CAUTION]
|
||||
> Do **not** add `"` quotation marks to environment variables.
|
||||
>
|
||||
> ✔️ Correct
|
||||
> ```yml
|
||||
> environment:
|
||||
> - TASK_CRON_SYNC=*/60 * * * *
|
||||
> ```
|
||||
>
|
||||
> ❌ Incorrect
|
||||
> ```yml
|
||||
> environment:
|
||||
> - TASK_CRON_SYNC="*/60 * * * *"
|
||||
> ```
|
||||
|
||||
<br />
|
||||
|
||||
| Env Var | Default | Description |
|
||||
| --- | --- | --- |
|
||||
| `TZ` | `Etc/UTC` | Timezone for error / log reporting |
|
||||
| `WEB_IP` | `0.0.0.0` | IP to use for webserver |
|
||||
| `WEB_PORT` | `4124` | Port to use for webserver |
|
||||
| `WEB_FOLDER` | `www` | Internal container folder to keep TVApp2 web files in. <br /><br /> <sup>⚠️ This should not be used unless you know what you're doing</sup> |
|
||||
| `WEB_ENCODING` | `deflate, br` | Defines the HTTP `Accept-Encoding` request and response header. This value specifies what content encoding the sender can understand<br /><br />Gzip compression can be enabled by specifying `'gzip, deflate, br'` |
|
||||
| `WEB_ENCODING` | `deflate, br` | Defines the HTTP `Accept-Encoding` request and response header. This value specifies what content encoding the sender can understand<br /><br />Gzip compression can be enabled by specifying `'gzip, deflate, br'`, however, [it may break Jellyfin users](#build-error-err-27-jellyfinlivetvguideguidemanager-error-getting-programs-for-channel-xxxxxxxxxxxxxxx-source-2-systemxmlxmlexception--hexadecimal-value-0x1f-is-an-invalid-character-line-1-position-1). |
|
||||
| `WEB_PROXY_HEADER` | `x-forwarded-for` | Defines the header to look for when finding a client's IP address. Used to get a client's IP when behind a reverse proxy or Cloudflare |
|
||||
| `URL_REPO` | `https://git.binaryninja.net/BinaryNinja/` | Determines where the data files will be downloaded from. Do not change this or you will be unable to get M3U and EPG data. |
|
||||
| `FILE_URL` | `urls.txt` | Filename for `urls.txt` cache file |
|
||||
@@ -368,7 +389,7 @@ This repository offers two types of docker image; `stable` and `development`. Yo
|
||||
|
||||
| Build | Tags |
|
||||
| ------------------------- | ----------------------------------------------------------------------------- |
|
||||
| `Stable` | `🔖 tvapp2:latest` <br /> `🔖 tvapp2:1.5.0` <br /> `🔖 tvapp2:1.5` <br /> `🔖 tvapp2:1` |
|
||||
| `Stable` | `🔖 tvapp2:latest` <br /> `🔖 tvapp2:1.5.2` <br /> `🔖 tvapp2:1.5` <br /> `🔖 tvapp2:1` |
|
||||
| `Development` | `🔖 tvapp2:development` |
|
||||
|
||||
<br />
|
||||
@@ -580,18 +601,19 @@ Creates the TVApp2 `amd64` docker image:
|
||||
# Build tvapp2 amd64
|
||||
docker buildx build \
|
||||
--build-arg ARCH=amd64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=stable \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.0 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.2 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:latest \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/amd64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -609,18 +631,19 @@ Creates the TVApp2 `arm64` docker image:
|
||||
# Build tvapp2 arm64
|
||||
docker buildx build \
|
||||
--build-arg ARCH=arm64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=stable \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.0 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.2 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:latest \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/arm64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -742,8 +765,8 @@ docker run --privileged --rm tonistiigi/binfmt --install all
|
||||
|
||||
Once the emulator is installed; we will now build two images. When building these two images; we will ensure the `--tag` value is different for each one, by adding the architecture to the end. This ensures we don't overwrite one image with the newer one. We need to have two seperate docker images with two different tags.
|
||||
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64`
|
||||
|
||||
<br />
|
||||
|
||||
@@ -754,10 +777,10 @@ Once the emulator is installed; we will now build two images. When building thes
|
||||
>
|
||||
> | Registry | Tag |
|
||||
> | --- | --- |
|
||||
> | Dockerhub | `--tag thebinaryninja/tvapp2:1.5.0-amd64`<br>`--tag thebinaryninja/tvapp2:1.5.0-arm64` |
|
||||
> | Github (GHCR) | `--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64`<br>`--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64` |
|
||||
> | Registry v2 | `--tag registry.domain.lan/thebinaryninja/tvapp2:1.5.0-amd64`<br>`--tag registry.domain.lan/thebinaryninja/tvapp2:1.5.0-arm64` |
|
||||
> | Gitea | `--tag git.binaryninja.net/binaryninja/tvapp2:1.5.0-amd64`<br>`--tag git.binaryninja.net/binaryninja/tvapp2:1.5.0-arm64` |
|
||||
> | Dockerhub | `--tag thebinaryninja/tvapp2:1.5.2-amd64`<br>`--tag thebinaryninja/tvapp2:1.5.2-arm64` |
|
||||
> | Github (GHCR) | `--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64`<br>`--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64` |
|
||||
> | Registry v2 | `--tag registry.domain.lan/thebinaryninja/tvapp2:1.5.2-amd64`<br>`--tag registry.domain.lan/thebinaryninja/tvapp2:1.5.2-arm64` |
|
||||
> | Gitea | `--tag git.binaryninja.net/binaryninja/tvapp2:1.5.2-amd64`<br>`--tag git.binaryninja.net/binaryninja/tvapp2:1.5.2-arm64` |
|
||||
|
||||
<br />
|
||||
|
||||
@@ -778,15 +801,16 @@ Creates the TVApp2 **Stable** release `amd64` docker image:
|
||||
# Build Tvapp2 amd64 - (stable release)
|
||||
docker buildx build \
|
||||
--build-arg ARCH=amd64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=stable \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64 \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/amd64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -805,15 +829,16 @@ Creates the TVApp2 **Stable** release `arm64` docker image:
|
||||
# Build Tvapp2 arm64 - (stable release)
|
||||
docker buildx build \
|
||||
--build-arg ARCH=arm64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=stable \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64 \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/arm64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -832,15 +857,16 @@ Creates the TVApp2 **Development** release `amd64` docker image:
|
||||
# Build Tvapp2 amd64 - (development release)
|
||||
docker buildx build \
|
||||
--build-arg ARCH=amd64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=development \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:development-amd64 \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/amd64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -859,15 +885,16 @@ Creates the TVApp2 **Development** release `arm64` docker image:
|
||||
# Build Tvapp2 arm64 - (development release)
|
||||
docker buildx build \
|
||||
--build-arg ARCH=arm64 \
|
||||
--build-arg VERSION=1.5.0 \
|
||||
--build-arg VERSION=1.5.2 \
|
||||
--build-arg BUILDDATE=20260812 \
|
||||
--build-arg RELEASE=development \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:development-arm64 \
|
||||
--attest type=provenance,disabled=true \
|
||||
--attest type=sbom,disabled=true \
|
||||
--output type=docker \
|
||||
--builder default \
|
||||
--file Dockerfile \
|
||||
--platform linux/arm64 \
|
||||
--output type=docker \
|
||||
--allow network.host \
|
||||
--network host \
|
||||
--no-cache \
|
||||
@@ -880,8 +907,8 @@ docker buildx build \
|
||||
|
||||
After completing the `docker buildx` commands above; you should now have a few new images. Each image should have its own separate docker tags which do not conflict. If you decided to not build the **development** releases below; that is fine.
|
||||
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:development-amd64`
|
||||
- `--tag ghcr.io/thebinaryninja/tvapp2:development-arm64`
|
||||
|
||||
@@ -907,15 +934,15 @@ You can also get the hash digests by running the commands:
|
||||
<br />
|
||||
|
||||
```shell
|
||||
$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64
|
||||
$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64
|
||||
|
||||
Name: ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64
|
||||
Name: ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64
|
||||
MediaType: application/vnd.docker.distribution.manifest.v2+json
|
||||
Digest: sha256:0abe1b1c119959b3b1ccc23c56a7ee2c4c908c6aaef290d4ab2993859d807a3b
|
||||
|
||||
$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64
|
||||
$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64
|
||||
|
||||
Name: ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64
|
||||
Name: ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64
|
||||
MediaType: application/vnd.docker.distribution.manifest.v2+json
|
||||
Digest: sha256:e68b9de8669eac64d4e4d2a8343c56705e05e9a907cf0b542343f9b536d9c473
|
||||
```
|
||||
@@ -962,14 +989,14 @@ Digest: sha256:c719ccb034946e3f0625003f25026d001768794e38a1ba8aafc9146291d548
|
||||
> ```shell
|
||||
> $ docker images --all --no-trunc | grep thebinaryninja
|
||||
>
|
||||
> ghcr.io/thebinaryninja/tvapp2 1.5.0-arm64 sha256:48520ca15fed6483d2d5b79993126c311f833002345b0e12b8eceb5bf9def966 42 minutes ago 46MB
|
||||
> ghcr.io/thebinaryninja/tvapp2 1.5.2-arm64 sha256:48520ca15fed6483d2d5b79993126c311f833002345b0e12b8eceb5bf9def966 42 minutes ago 46MB
|
||||
>
|
||||
> ghcr.io/thebinaryninja/tvapp2 1.5.0-amd64 sha256:54a9b7d390199532d5667fae67120d77e2f459bd6108b27ce94e0cfec8f3c41f 43 minutes ago 45MB
|
||||
> ghcr.io/thebinaryninja/tvapp2 1.5.2-amd64 sha256:54a9b7d390199532d5667fae67120d77e2f459bd6108b27ce94e0cfec8f3c41f 43 minutes ago 45MB
|
||||
> ```
|
||||
>
|
||||
> To get the correct sha256 digest, use:
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64`
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64`
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64`
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64`
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:development-amd64`
|
||||
> - `docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:development-arm64`
|
||||
>
|
||||
@@ -989,7 +1016,7 @@ For the **stable** releases, use:
|
||||
# #
|
||||
|
||||
docker buildx imagetools create \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.0 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5.2 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1.5 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:1 \
|
||||
--tag ghcr.io/thebinaryninja/tvapp2:latest \
|
||||
@@ -998,9 +1025,9 @@ docker buildx imagetools create \
|
||||
|
||||
[+] Building 0.2s (4/4) FINISHED
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:latest 0.2s
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:1.5 0.2s
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:1 0.2s
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:1.5.0 0.2s
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:1.5 0.2s
|
||||
=> [internal] pushing ghcr.io/thebinaryninja/tvapp2:1.5.2 0.2s
|
||||
```
|
||||
|
||||
<br />
|
||||
@@ -1046,8 +1073,8 @@ In this example, we take the existing two files we created earlier, and merge th
|
||||
```shell
|
||||
# Example 1 (using tag)
|
||||
docker manifest create ghcr.io/thebinaryninja/tvapp2:latest \
|
||||
--amend ghcr.io/thebinaryninja/tvapp2:1.5.0-amd64 \
|
||||
--amend ghcr.io/thebinaryninja/tvapp2:1.5.0-arm64
|
||||
--amend ghcr.io/thebinaryninja/tvapp2:1.5.2-amd64 \
|
||||
--amend ghcr.io/thebinaryninja/tvapp2:1.5.2-arm64
|
||||
|
||||
# Example 2 (using sha256 hash)
|
||||
docker manifest create ghcr.io/thebinaryninja/tvapp2:latest \
|
||||
@@ -1088,7 +1115,7 @@ To build the project, `🗔 cd` into the project folder and run the build comman
|
||||
|
||||
```shell
|
||||
cd /home/docker/tvapp2/
|
||||
npm run docker:build:amd64 --VERSION=1.5.0 --BUILDDATE=20260812
|
||||
npm run docker:build:amd64 --VERSION=1.5.2 --BUILDDATE=20260812
|
||||
```
|
||||
|
||||
<br />
|
||||
@@ -1213,7 +1240,7 @@ This docker container contains the following env variables:
|
||||
| `WEB_IP` | `0.0.0.0` | IP to use for webserver |
|
||||
| `WEB_PORT` | `4124` | Port to use for webserver |
|
||||
| `WEB_FOLDER` | `www` | Internal container folder to keep TVApp2 web files in. <br /><br /> <sup>⚠️ This should not be used unless you know what you're doing</sup> |
|
||||
| `WEB_ENCODING` | `deflate, br` | Defines the HTTP `Accept-Encoding` request and response header. This value specifies what content encoding the sender can understand<br /><br />Gzip compression can be enabled by specifying `'gzip, deflate, br'` |
|
||||
| `WEB_ENCODING` | `deflate, br` | Defines the HTTP `Accept-Encoding` request and response header. This value specifies what content encoding the sender can understand<br /><br />Gzip compression can be enabled by specifying `'gzip, deflate, br'`, however, [it may break Jellyfin users](#build-error-err-27-jellyfinlivetvguideguidemanager-error-getting-programs-for-channel-xxxxxxxxxxxxxxx-source-2-systemxmlxmlexception--hexadecimal-value-0x1f-is-an-invalid-character-line-1-position-1). |
|
||||
| `WEB_PROXY_HEADER` | `x-forwarded-for` | Defines the header to look for when finding a client's IP address. Used to get a client's IP when behind a reverse proxy or Cloudflare |
|
||||
| `URL_REPO` | `https://git.binaryninja.net/BinaryNinja/` | Determines where the data files will be downloaded from. Do not change this or you will be unable to get M3U and EPG data. |
|
||||
| `FILE_URL` | `urls.txt` | Filename for `urls.txt` cache file |
|
||||
|
||||
BIN
docs/img/screenshots/01.gif
Normal file
BIN
docs/img/screenshots/01.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 970 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 60 KiB |
@@ -9,10 +9,80 @@
|
||||
# @repo.3 https://github.com/aetherinox/docker-base-alpine
|
||||
# #
|
||||
|
||||
# #
|
||||
# define > colors
|
||||
#
|
||||
# Use the color table at:
|
||||
# - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
|
||||
# #
|
||||
|
||||
declare -A c=(
|
||||
[end]=$'\e[0m'
|
||||
[white]=$'\e[97m'
|
||||
[bold]=$'\e[1m'
|
||||
[dim]=$'\e[2m'
|
||||
[underline]=$'\e[4m'
|
||||
[strike]=$'\e[9m'
|
||||
[blink]=$'\e[5m'
|
||||
[inverted]=$'\e[7m'
|
||||
[hidden]=$'\e[8m'
|
||||
[black]=$'\e[0;30m'
|
||||
[redl]=$'\e[0;91m'
|
||||
[redd]=$'\e[0;31m'
|
||||
[magental]=$'\e[0;95m'
|
||||
[magentad]=$'\e[0;35mm'
|
||||
[bluel]=$'\e[0;94m'
|
||||
[blued]=$'\e[0;34m'
|
||||
[cyanl]=$'\e[0;96m'
|
||||
[cyand]=$'\e[0;36m'
|
||||
[greenl]=$'\e[0;92m'
|
||||
[greend]=$'\e[0;32m'
|
||||
[yellowl]=$'\e[0;93m'
|
||||
[yellowd]=$'\e[0;33m'
|
||||
[greyl]=$'\e[0;37m'
|
||||
[greyd]=$'\e[0;90m'
|
||||
[navy]=$'\e[38;5;62m'
|
||||
[olive]=$'\e[38;5;144m'
|
||||
[peach]=$'\e[38;5;210m'
|
||||
)
|
||||
|
||||
# #
|
||||
# unicode for emojis
|
||||
# https://apps.timwhitlock.info/emoji/tables/unicode
|
||||
# #
|
||||
|
||||
declare -A icon=(
|
||||
["symbolic link"]=$'\xF0\x9F\x94\x97' # 🔗
|
||||
["regular file"]=$'\xF0\x9F\x93\x84' # 📄
|
||||
["directory"]=$'\xF0\x9F\x93\x81' # 📁
|
||||
["regular empty file"]=$'\xe2\xad\x95' # ⭕
|
||||
["log"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["1"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["2"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["3"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["4"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["5"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["pem"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["pub"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["pfx"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["p12"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["key"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["crt"]=$'\xF0\x9F\xAA\xAA ' # 🪪
|
||||
["gz"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["zip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["gzip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["deb"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["sh"]=$'\xF0\x9F\x97\x94' # 🗔
|
||||
)
|
||||
|
||||
# #
|
||||
# define > general
|
||||
# #
|
||||
|
||||
PLUGINS_PATH="/config/www/plugins"
|
||||
|
||||
# #
|
||||
# Plugins > Start
|
||||
# #
|
||||
|
||||
echo -e " Loader : Checking tvapp2-plugins"
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}Checking tvapp2-plugins${c[end]}"
|
||||
|
||||
@@ -1 +1 @@
|
||||
echo -e " Core : Completed loading container"
|
||||
echo -e " Completed loading container"
|
||||
|
||||
@@ -1,35 +1,160 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
# shellcheck shell=bash
|
||||
|
||||
# #
|
||||
# defaults
|
||||
# #
|
||||
|
||||
PUID=${PUID:-911}
|
||||
PGID=${PGID:-911}
|
||||
DIR_BUILD=${DIR_BUILD:-/usr/src/app}
|
||||
DIR_RUN=${DIR_RUN:-/usr/bin/app}
|
||||
bHasError=false
|
||||
|
||||
# #
|
||||
# define > colors
|
||||
#
|
||||
# Use the color table at:
|
||||
# - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
|
||||
# #
|
||||
|
||||
declare -A c=(
|
||||
[end]=$'\e[0m'
|
||||
[white]=$'\e[97m'
|
||||
[bold]=$'\e[1m'
|
||||
[dim]=$'\e[2m'
|
||||
[underline]=$'\e[4m'
|
||||
[strike]=$'\e[9m'
|
||||
[blink]=$'\e[5m'
|
||||
[inverted]=$'\e[7m'
|
||||
[hidden]=$'\e[8m'
|
||||
[black]=$'\e[0;30m'
|
||||
[redl]=$'\e[0;91m'
|
||||
[redd]=$'\e[0;31m'
|
||||
[magental]=$'\e[0;95m'
|
||||
[magentad]=$'\e[0;35mm'
|
||||
[bluel]=$'\e[0;94m'
|
||||
[blued]=$'\e[0;34m'
|
||||
[cyanl]=$'\e[0;96m'
|
||||
[cyand]=$'\e[0;36m'
|
||||
[greenl]=$'\e[0;92m'
|
||||
[greend]=$'\e[0;32m'
|
||||
[yellowl]=$'\e[0;93m'
|
||||
[yellowd]=$'\e[0;33m'
|
||||
[greyl]=$'\e[0;37m'
|
||||
[greyd]=$'\e[0;90m'
|
||||
[navy]=$'\e[38;5;62m'
|
||||
[olive]=$'\e[38;5;144m'
|
||||
[peach]=$'\e[38;5;210m'
|
||||
)
|
||||
|
||||
# #
|
||||
# unicode for emojis
|
||||
# https://apps.timwhitlock.info/emoji/tables/unicode
|
||||
# #
|
||||
|
||||
declare -A icon=(
|
||||
["symbolic link"]=$'\xF0\x9F\x94\x97' # 🔗
|
||||
["regular file"]=$'\xF0\x9F\x93\x84' # 📄
|
||||
["directory"]=$'\xF0\x9F\x93\x81' # 📁
|
||||
["regular empty file"]=$'\xe2\xad\x95' # ⭕
|
||||
["log"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["1"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["2"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["3"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["4"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["5"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["pem"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["pub"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["pfx"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["p12"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["key"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["crt"]=$'\xF0\x9F\xAA\xAA ' # 🪪
|
||||
["gz"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["zip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["gzip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["deb"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["sh"]=$'\xF0\x9F\x97\x94' # 🗔
|
||||
)
|
||||
|
||||
# #
|
||||
# get container ips
|
||||
# #
|
||||
|
||||
IP_GATEWAY=$(/sbin/ip route|awk '/default/ { print $3 }')
|
||||
IP_CONTAINER=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
|
||||
|
||||
# #
|
||||
# usermod
|
||||
# -o, --non-unique allow using duplicate (non-unique) UID
|
||||
# -g, --gid GROUP force use GROUP as new primary group
|
||||
# -G, --groups GROUPS new list of supplementary GROUPS
|
||||
# -u, --uid UID new UID for the user account
|
||||
# -U, --unlock unlock the user account
|
||||
#
|
||||
# groupmod
|
||||
# -g, --gid GID change the group ID to GID
|
||||
# -o, --non-unique allow to use a duplicate (non-unique) GID
|
||||
# #
|
||||
|
||||
if [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
|
||||
groupmod -o -g "$PGID" dockerx
|
||||
usermod -o -u "$PUID" dockerx
|
||||
fi
|
||||
|
||||
if { [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; } || [[ ! ${TVAPP_FIRST_PARTY} = "true" ]]; then
|
||||
cat /etc/s6-overlay/s6-rc.d/init-adduser/branding
|
||||
else
|
||||
cat /run/branding
|
||||
fi
|
||||
# #
|
||||
# s6 > branding
|
||||
# #
|
||||
|
||||
printf '%-1s\n' " ${c[greyd]}──────────────────────────────────────────────────────────────────────────────────────────${c[end]}"
|
||||
printf '%-1s\n' " ${c[greyd]} TVApp2 Docker Image${c[end]}"
|
||||
printf '%-1s\n' " ${c[greyd]}──────────────────────────────────────────────────────────────────────────────────────────${c[end]}"
|
||||
|
||||
printf '%-2s\n' " ${c[greyd]}The TvApp2 image allows you to fetch M3U playlist and EPG data for numerous IPTV ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}services online. ${c[end]}"
|
||||
echo -e
|
||||
printf '%-2s\n' " ${c[greyd]}Once the files are fetched by the image, you can visit the self-hosted webpage, copy ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}the links to the M3U and EPG files; and add them to your favorite IPTV app such as ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}Jellyfin, Plex, or Emby. ${c[end]}"
|
||||
echo -e
|
||||
printf '%-2s\n' " ${c[greyd]}For more information about this project; visit the links below. This app is served on ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}multiple repositories as backup. Use any of the repo links below: ${c[end]}"
|
||||
echo -e
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}TVApp2 Repo 1${c[end]}" "${c[end]}https://github.com/TheBinaryNinja/tvapp2 ${c[end]}"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}TVApp2 Repo 2${c[end]}" "${c[end]}https://git.binaryninja.net/BinaryNinja/tvapp2 ${c[end]}"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}Base Alpine Image${c[end]}" "${c[end]}https://github.com/Aetherinox/docker-base-alpine ${c[end]}"
|
||||
echo -e
|
||||
|
||||
printf '%-2s\n' " ${c[greyd]}If you are making this container available on a public-facing domain, please consider ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}using Traefik and Authentik to protect this container from outside access. Your M3U ${c[end]}"
|
||||
printf '%-2s\n' " ${c[greyd]}and EPG files will be available for the public to download and use. ${c[end]}"
|
||||
|
||||
# if { [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; } || [[ ! ${TVAPP_FIRST_PARTY} = "true" ]]; then
|
||||
# cat /etc/s6-overlay/s6-rc.d/init-adduser/branding
|
||||
# else
|
||||
# cat /run/branding
|
||||
# fi
|
||||
|
||||
# #
|
||||
# branding > non-root user
|
||||
# #
|
||||
|
||||
if [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
|
||||
echo ""
|
||||
echo " User:Group $(id -u dockerx):$(id -g dockerx)"
|
||||
echo -e
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}User:Group${c[end]}" "${c[end]}$(id -u dockerx):$(id -g dockerx)${c[end]}"
|
||||
else
|
||||
echo " User:Group $(stat /run -c %u):$(stat /run -c %g)"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}User:Group${c[end]}" "${c[end]}$(stat /run -c %u):$(stat /run -c %g)${c[end]}"
|
||||
fi
|
||||
echo " Port(s) $(echo $WEB_PORT)"
|
||||
echo " Gateway $(echo $IP_GATEWAY)"
|
||||
echo " Web Server $(echo $IP_CONTAINER:$WEB_PORT)"
|
||||
echo " App Folder $(echo $DIR_RUN)"
|
||||
echo ""
|
||||
echo '──────────────────────────────────────────────────────────────────────────────────────────'
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}Port(s)${c[end]}" "${c[end]}$(echo $WEB_PORT)${c[end]}"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}Gateway${c[end]}" "${c[end]}$(echo $IP_GATEWAY)${c[end]}"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}Web Server${c[end]}" "${c[end]}$(echo $IP_CONTAINER:$WEB_PORT)${c[end]}"
|
||||
printf '%-6s %-35s %-65s\n' "" " ${c[greenl]}App Folder${c[end]}" "${c[end]}$(echo $DIR_RUN)${c[end]}"
|
||||
echo -e
|
||||
printf '%-1s\n' " ${c[greyd]}──────────────────────────────────────────────────────────────────────────────────────────${c[end]}"
|
||||
|
||||
# #
|
||||
# set permissions
|
||||
# #
|
||||
|
||||
if [[ -z ${TVAPP_READ_ONLY_FS} ]] && [[ -z ${TVAPP_NON_ROOT_USER} ]]; then
|
||||
aetherxown dockerx:dockerx /app
|
||||
|
||||
@@ -1,22 +1,88 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
# shellcheck shell=bash
|
||||
|
||||
# #
|
||||
# define > colors
|
||||
#
|
||||
# Use the color table at:
|
||||
# - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
|
||||
# #
|
||||
|
||||
declare -A c=(
|
||||
[end]=$'\e[0m'
|
||||
[white]=$'\e[97m'
|
||||
[bold]=$'\e[1m'
|
||||
[dim]=$'\e[2m'
|
||||
[underline]=$'\e[4m'
|
||||
[strike]=$'\e[9m'
|
||||
[blink]=$'\e[5m'
|
||||
[inverted]=$'\e[7m'
|
||||
[hidden]=$'\e[8m'
|
||||
[black]=$'\e[0;30m'
|
||||
[redl]=$'\e[0;91m'
|
||||
[redd]=$'\e[0;31m'
|
||||
[magental]=$'\e[0;95m'
|
||||
[magentad]=$'\e[0;35mm'
|
||||
[bluel]=$'\e[0;94m'
|
||||
[blued]=$'\e[0;34m'
|
||||
[cyanl]=$'\e[0;96m'
|
||||
[cyand]=$'\e[0;36m'
|
||||
[greenl]=$'\e[0;92m'
|
||||
[greend]=$'\e[0;32m'
|
||||
[yellowl]=$'\e[0;93m'
|
||||
[yellowd]=$'\e[0;33m'
|
||||
[greyl]=$'\e[0;37m'
|
||||
[greyd]=$'\e[0;90m'
|
||||
[navy]=$'\e[38;5;62m'
|
||||
[olive]=$'\e[38;5;144m'
|
||||
[peach]=$'\e[38;5;210m'
|
||||
)
|
||||
|
||||
# #
|
||||
# unicode for emojis
|
||||
# https://apps.timwhitlock.info/emoji/tables/unicode
|
||||
# #
|
||||
|
||||
declare -A icon=(
|
||||
["symbolic link"]=$'\xF0\x9F\x94\x97' # 🔗
|
||||
["regular file"]=$'\xF0\x9F\x93\x84' # 📄
|
||||
["directory"]=$'\xF0\x9F\x93\x81' # 📁
|
||||
["regular empty file"]=$'\xe2\xad\x95' # ⭕
|
||||
["log"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["1"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["2"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["3"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["4"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["5"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["pem"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["pub"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["pfx"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["p12"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["key"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["crt"]=$'\xF0\x9F\xAA\xAA ' # 🪪
|
||||
["gz"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["zip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["gzip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["deb"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["sh"]=$'\xF0\x9F\x97\x94' # 🗔
|
||||
)
|
||||
|
||||
# Directories
|
||||
SCRIPTS_DIR="/custom-cont-init.d"
|
||||
|
||||
# Make sure custom init directory exists and has files in it
|
||||
if [[ -e "${SCRIPTS_DIR}" ]] && [[ -n "$(/bin/ls -A ${SCRIPTS_DIR} 2>/dev/null)" ]]; then
|
||||
echo -e " Loader : Plugins found, loading them ..."
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}Loading any found plugins${c[end]}"
|
||||
for SCRIPT in "${SCRIPTS_DIR}"/*; do
|
||||
NAME="$(basename "${SCRIPT}")"
|
||||
if [[ -f "${SCRIPT}" ]]; then
|
||||
echo -e " Loader : Executing ..."
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}Executing${c[end]}"
|
||||
/bin/bash "${SCRIPT}"
|
||||
echo -e " Loader : ${NAME}: Ran Successfully with code [$?]"
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}Successfully ran with code ${c[bluel]}[$?]${c[end]}"
|
||||
elif [[ ! -f "${SCRIPT}" ]]; then
|
||||
echo -e " Loader : ${NAME}: Not a valid file"
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}${c[bluel]}${NAME}${c[end]} is not a valid file${c[end]}"
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo -e " Loader : No Plugins found, skipping..."
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}Loader${c[end]}" "${c[end]}No plugins found; skipping${c[end]}"
|
||||
fi
|
||||
|
||||
@@ -1,14 +1,113 @@
|
||||
#!/usr/bin/with-contenv sh
|
||||
#!/usr/bin/with-contenv bash
|
||||
# shellcheck shell=bash
|
||||
|
||||
# #
|
||||
# Store env variables in s6
|
||||
# defaults
|
||||
# #
|
||||
|
||||
PUID=${PUID:-911}
|
||||
PGID=${PGID:-911}
|
||||
DIR_BUILD=${DIR_BUILD:-/usr/src/app}
|
||||
DIR_RUN=${DIR_RUN:-/usr/bin/app}
|
||||
bHasError=false
|
||||
|
||||
# #
|
||||
# define > colors
|
||||
#
|
||||
# Use the color table at:
|
||||
# - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
|
||||
# #
|
||||
|
||||
declare -A c=(
|
||||
[end]=$'\e[0m'
|
||||
[white]=$'\e[97m'
|
||||
[bold]=$'\e[1m'
|
||||
[dim]=$'\e[2m'
|
||||
[underline]=$'\e[4m'
|
||||
[strike]=$'\e[9m'
|
||||
[blink]=$'\e[5m'
|
||||
[inverted]=$'\e[7m'
|
||||
[hidden]=$'\e[8m'
|
||||
[black]=$'\e[0;30m'
|
||||
[redl]=$'\e[0;91m'
|
||||
[redd]=$'\e[0;31m'
|
||||
[magental]=$'\e[0;95m'
|
||||
[magentad]=$'\e[0;35mm'
|
||||
[bluel]=$'\e[0;94m'
|
||||
[blued]=$'\e[0;34m'
|
||||
[cyanl]=$'\e[0;96m'
|
||||
[cyand]=$'\e[0;36m'
|
||||
[greenl]=$'\e[0;92m'
|
||||
[greend]=$'\e[0;32m'
|
||||
[yellowl]=$'\e[0;93m'
|
||||
[yellowd]=$'\e[0;33m'
|
||||
[greyl]=$'\e[0;37m'
|
||||
[greyd]=$'\e[0;90m'
|
||||
[navy]=$'\e[38;5;62m'
|
||||
[olive]=$'\e[38;5;144m'
|
||||
[peach]=$'\e[38;5;210m'
|
||||
)
|
||||
|
||||
# #
|
||||
# unicode for emojis
|
||||
# https://apps.timwhitlock.info/emoji/tables/unicode
|
||||
# #
|
||||
|
||||
declare -A icon=(
|
||||
["symbolic link"]=$'\xF0\x9F\x94\x97' # 🔗
|
||||
["regular file"]=$'\xF0\x9F\x93\x84' # 📄
|
||||
["directory"]=$'\xF0\x9F\x93\x81' # 📁
|
||||
["regular empty file"]=$'\xe2\xad\x95' # ⭕
|
||||
["log"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["1"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["2"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["3"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["4"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["5"]=$'\xF0\x9F\x93\x9C' # 📜
|
||||
["pem"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["pub"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["pfx"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["p12"]=$'\xF0\x9F\x94\x92' # 🔑
|
||||
["key"]=$'\xF0\x9F\x94\x91' # 🔒
|
||||
["crt"]=$'\xF0\x9F\xAA\xAA ' # 🪪
|
||||
["gz"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["zip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["gzip"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["deb"]=$'\xF0\x9F\x93\xA6' # 📦
|
||||
["sh"]=$'\xF0\x9F\x97\x94' # 🗔
|
||||
)
|
||||
|
||||
# #
|
||||
# define > system
|
||||
# #
|
||||
|
||||
sys_os_ver="1.0.0"
|
||||
sys_os_name="Unknown"
|
||||
|
||||
# #
|
||||
# s6 > store env variables
|
||||
# #
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Fetching docker container and gateway addresses${c[end]}"
|
||||
|
||||
# #
|
||||
# get container ips
|
||||
# #
|
||||
|
||||
ip_gateway=$(/sbin/ip route|awk '/default/ { print $3 }')
|
||||
ip_container=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
|
||||
|
||||
printf "$ip_gateway" > /var/run/s6/container_environment/IP_GATEWAY
|
||||
printf "$ip_container" > /var/run/s6/container_environment/IP_CONTAINER
|
||||
if [ -d "/var/run/s6/container_environment/" ]; then
|
||||
printf "$ip_gateway" > /var/run/s6/container_environment/IP_GATEWAY
|
||||
printf "$ip_container" > /var/run/s6/container_environment/IP_CONTAINER
|
||||
else
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot generate s6-overlay env files; folder ${c[redl]}/var/run/s6/container_environment/${c[end]} does not exist${c[end]}"
|
||||
bHasError=true
|
||||
fi
|
||||
|
||||
# #
|
||||
# s6 > export env vars
|
||||
# #
|
||||
|
||||
export IP_GATEWAY=$ip_gateway
|
||||
export IP_GATEWAY=$ip_container
|
||||
@@ -17,8 +116,75 @@ export IP_GATEWAY=$ip_container
|
||||
# install and startup for tvapp2
|
||||
# #
|
||||
|
||||
cp -r ${DIR_BUILD}/* ${DIR_RUN}
|
||||
rm -rf ${DIR_BUILD}/*
|
||||
cd ${DIR_RUN}
|
||||
npm install --omit=dev
|
||||
npm start
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Copying ${c[bluel]}${DIR_BUILD}${c[end]} to ${c[bluel]}${DIR_RUN}${c[end]}"
|
||||
if [ -z "${DIR_BUILD}" ]; then
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot copy; env var ${c[redl]}\${DIR_BUILD}${c[end]} missing${c[end]}"
|
||||
bHasError=true
|
||||
else
|
||||
if [ -d "${DIR_BUILD}/" ]; then
|
||||
cp -r ${DIR_BUILD}/* ${DIR_RUN}
|
||||
else
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot copy folder ${c[redl]}${DIR_BUILD}${c[end]} to ${c[redl]}${DIR_RUN}${c[end]}; build folder ${c[redl]}${DIR_BUILD}${c[end]} does not exist${c[end]}"
|
||||
bHasError=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# #
|
||||
# remove build directory
|
||||
# #
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Remove ${c[bluel]}${DIR_BUILD}/${c[end]}"
|
||||
if [ -z "${DIR_BUILD}" ]; then
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot remove; env var ${c[redl]}\${DIR_BUILD}${c[end]} missing${c[end]}"
|
||||
else
|
||||
if [ -d "${DIR_BUILD}" ]; then
|
||||
rm -rf "${DIR_BUILD}/"
|
||||
else
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot remove; build folder ${c[redl]}${DIR_BUILD}${c[end]} does not exist. Restart the container to re-initialize build folder.${c[end]}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# #
|
||||
# cd to BUILD_RUN directory
|
||||
# #
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Changing to run directory ${c[bluel]}${DIR_RUN}/${c[end]}"
|
||||
if [ -z "${DIR_RUN}" ]; then
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot cd; env var ${c[redl]}\${DIR_RUN}${c[end]} missing${c[end]}"
|
||||
bHasError=true
|
||||
else
|
||||
if [ -d "${DIR_RUN}" ]; then
|
||||
cd ${DIR_RUN}
|
||||
else
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot cd; run folder ${c[redl]}${DIR_RUN}${c[end]} does not exist${c[end]}"
|
||||
bHasError=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# #
|
||||
# install tvapp2 via npm
|
||||
# #
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Running command ${c[bluel]}npm install --omit=dev${c[end]}"
|
||||
if ! command -v npm; then
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Cannot install TVApp2 with npm because package ${c[redl]}npm${c[end]} not installed${c[end]}"
|
||||
bHasError=true
|
||||
else
|
||||
npm install --omit=dev
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[bluel]}STATUS${c[end]}" "${c[end]}Running command ${c[bluel]}npm start${c[end]}"
|
||||
npm start
|
||||
fi
|
||||
|
||||
# #
|
||||
# finished run script
|
||||
# #
|
||||
|
||||
printf '%-29s %-65s\n' " ${c[greenl]}OK${c[end]}" "${c[end]}Finished initializing script${c[end]}"
|
||||
if [ "$bHasError" = true ] ; then
|
||||
printf '%-29s %-65s\n' "" ""
|
||||
printf '%-29s %-65s\n' " ${c[redl]}ERROR${c[end]}" "${c[end]}Fatal errors were detected${c[end]}"
|
||||
printf '%-29s %-65s\n' " ${c[redl]}${c[end]}" "${c[end]}The run script detected that certain steps failed. This app may not${c[end]}"
|
||||
printf '%-29s %-65s\n' " ${c[redl]}${c[end]}" "${c[end]}work properly. Try restarting the container.${c[end]}"
|
||||
printf '%-29s %-65s\n' "" ""
|
||||
fi
|
||||
|
||||
386
tvapp2/index.js
386
tvapp2/index.js
@@ -12,7 +12,12 @@ import zlib from 'zlib';
|
||||
import chalk from 'chalk';
|
||||
import ejs from 'ejs';
|
||||
import moment from 'moment';
|
||||
import TimeAgo from 'javascript-time-ago';
|
||||
import en from 'javascript-time-ago/locale/en';
|
||||
import nconf from 'nconf';
|
||||
import crypto from 'node:crypto';
|
||||
import cron, { schedule } from 'node-cron';
|
||||
import * as child from 'child_process';
|
||||
import * as crons from 'cron';
|
||||
|
||||
/*
|
||||
@@ -29,6 +34,9 @@ const cache = new Map();
|
||||
const { name, author, version, repository, discord, docs } = JSON.parse( fs.readFileSync( './package.json' ) );
|
||||
const __filename = fileURLToPath( import.meta.url ); // get resolved path to file
|
||||
const __dirname = path.dirname( __filename ); // get name of directory
|
||||
/*
|
||||
const gitHash = child.execSync( 'git rev-parse HEAD' ).toString().trim();
|
||||
*/
|
||||
|
||||
/*
|
||||
chalk.level
|
||||
@@ -46,6 +54,13 @@ const __dirname = path.dirname( __filename ); // get name of directory
|
||||
|
||||
chalk.level = 3;
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
TimeAgo.addDefaultLocale( en );
|
||||
const timeAgo = new TimeAgo( );
|
||||
|
||||
/*
|
||||
Define > General
|
||||
|
||||
@@ -83,7 +98,9 @@ const envWebEncoding = process.env.WEB_ENCODING || 'deflate, br';
|
||||
const envProxyHeader = process.env.WEB_PROXY_HEADER || 'x-forwarded-for';
|
||||
const envHealthTimer = process.env.HEALTH_TIMER || 600000;
|
||||
const envTaskCronSync = process.env.TASK_CRON_SYNC || '0 0 */3 * *';
|
||||
const envGitSHA1 = process.env.GIT_SHA1 || '0000000000000000000000000000000000000000';
|
||||
const LOG_LEVEL = process.env.LOG_LEVEL || 4;
|
||||
let TIME_STARTUP = 0;
|
||||
|
||||
/*
|
||||
Define > Externals
|
||||
@@ -110,8 +127,8 @@ const USERAGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/201
|
||||
http://127.0.0.1:4124/gz
|
||||
http://127.0.0.1:4124/playlist
|
||||
http://127.0.0.1:4124/key
|
||||
http://127.0.0.1:4124/channel
|
||||
http://127.0.0.1:4124/health
|
||||
http://127.0.0.1:4124/channel?url=https://thetvapp.to/tv/bbc-america-live-stream/
|
||||
http://127.0.0.1:4124/api/health
|
||||
*/
|
||||
|
||||
const subdomainGZP = [ 'gzip', 'gz' ];
|
||||
@@ -174,45 +191,45 @@ class Log
|
||||
static verbose( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 6 )
|
||||
console.debug( chalk.white.bgBlack.blackBright.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.gray( msg.join( ' ' ) ) );
|
||||
console.debug( chalk.white.bgBlack.blackBright.bold( ` ${ name } ` ), chalk.white( `⚙️` ), this.now(), chalk.gray( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static debug( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 7 )
|
||||
console.trace( chalk.white.bgMagenta.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.magentaBright( msg.join( ' ' ) ) );
|
||||
console.trace( chalk.white.bgMagenta.bold( ` ${ name } ` ), chalk.white( `⚙️` ), this.now(), chalk.magentaBright( msg.join( ' ' ) ) );
|
||||
else if ( LOG_LEVEL >= 5 )
|
||||
console.debug( chalk.white.bgGray.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.gray( msg.join( ' ' ) ) );
|
||||
console.debug( chalk.white.bgGray.bold( ` ${ name } ` ), chalk.white( `⚙️` ), this.now(), chalk.gray( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static info( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 4 )
|
||||
console.info( chalk.white.bgBlueBright.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.blueBright( msg.join( ' ' ) ) );
|
||||
console.info( chalk.white.bgBlueBright.bold( ` ${ name } ` ), chalk.white( `ℹ️` ), this.now(), chalk.blueBright( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static ok( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 4 )
|
||||
console.log( chalk.white.bgGreen.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.greenBright( msg.join( ' ' ) ) );
|
||||
console.log( chalk.white.bgGreen.bold( ` ${ name } ` ), chalk.white( `✅` ), this.now(), chalk.greenBright( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static notice( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 3 )
|
||||
console.log( chalk.white.bgYellow.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.yellowBright( msg.join( ' ' ) ) );
|
||||
console.log( chalk.white.bgYellow.bold( ` ${ name } ` ), chalk.white( `📌` ), this.now(), chalk.yellowBright( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static warn( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 2 )
|
||||
console.warn( chalk.white.bgYellow.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.yellowBright( msg.join( ' ' ) ) );
|
||||
console.warn( chalk.white.bgYellow.bold( ` ${ name } ` ), chalk.white( `⚠️` ), this.now(), chalk.yellowBright( msg.join( ' ' ) ) );
|
||||
}
|
||||
|
||||
static error( ...msg )
|
||||
{
|
||||
if ( LOG_LEVEL >= 1 )
|
||||
console.error( chalk.white.bgRedBright.bold( ` ${ name } ` ), chalk.white( `→` ), this.now(), chalk.redBright( msg.join( ' ' ) ) );
|
||||
console.error( chalk.white.bgRedBright.bold( ` ${ name } ` ), chalk.white( `❌` ), this.now(), chalk.redBright( msg.join( ' ' ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,7 +243,6 @@ if ( process.pkg )
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Starting server utilizing process.execPath` ) );
|
||||
|
||||
const basePath = path.dirname( process.execPath );
|
||||
|
||||
FILE_URL = path.join( basePath, envWebFolder, `${ envFileURL }` );
|
||||
FILE_M3U = path.join( basePath, envWebFolder, `${ envFileM3U }` );
|
||||
FILE_XML = path.join( basePath, envWebFolder, `${ envFileXML }` );
|
||||
@@ -244,6 +260,64 @@ else
|
||||
FILE_GZP = path.resolve( __dirname, envWebFolder, `${ envFileGZP }` );
|
||||
}
|
||||
|
||||
/*
|
||||
helper > sleep
|
||||
*/
|
||||
|
||||
function sleep( ms )
|
||||
{
|
||||
return new Promise( ( resolve ) =>
|
||||
{
|
||||
setTimeout( resolve, ms );
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
Semaphore > Declare
|
||||
|
||||
allows multiple threads to work with the same shared resources
|
||||
*/
|
||||
|
||||
class Semaphore
|
||||
{
|
||||
constructor( max )
|
||||
{
|
||||
this.max = max;
|
||||
this.queue = [];
|
||||
this.active = 0;
|
||||
}
|
||||
|
||||
async acquire()
|
||||
{
|
||||
if ( this.active < this.max )
|
||||
{
|
||||
this.active++;
|
||||
return;
|
||||
}
|
||||
|
||||
return new Promise( ( resolve ) => this.queue.push( resolve ) );
|
||||
}
|
||||
|
||||
release()
|
||||
{
|
||||
this.active--;
|
||||
if ( this.queue.length > 0 )
|
||||
{
|
||||
const resolve = this.queue.shift();
|
||||
this.active++;
|
||||
resolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Semaphore > Initialize
|
||||
|
||||
@arg int threads_max
|
||||
*/
|
||||
|
||||
const semaphore = new Semaphore( 5 );
|
||||
|
||||
/*
|
||||
Get Client IP
|
||||
|
||||
@@ -261,43 +335,6 @@ const clientIp = ( req ) =>
|
||||
req.socket?.remoteAddress ) ||
|
||||
envIpContainer );
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
Semaphore > Declare
|
||||
|
||||
allows multiple threads to work with the same shared resources
|
||||
*/
|
||||
|
||||
class Semaphore
|
||||
{
|
||||
constructor( max )
|
||||
{
|
||||
this.max = max;
|
||||
this.queue = [];
|
||||
this.active = 0;
|
||||
}
|
||||
async acquire()
|
||||
{
|
||||
if ( this.active < this.max )
|
||||
{
|
||||
this.active++;
|
||||
return;
|
||||
}
|
||||
return new Promise( ( resolve ) => this.queue.push( resolve ) );
|
||||
}
|
||||
release()
|
||||
{
|
||||
this.active--;
|
||||
if ( this.queue.length > 0 )
|
||||
{
|
||||
const resolve = this.queue.shift();
|
||||
this.active++;
|
||||
resolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Check Service Status
|
||||
|
||||
@@ -313,17 +350,17 @@ async function serviceCheck( service, uri )
|
||||
|
||||
try
|
||||
{
|
||||
const response = await fetch( uri );
|
||||
const resp = await fetch( uri );
|
||||
|
||||
/* try 1 > domain down */
|
||||
if ( response.status !== 200 )
|
||||
if ( resp.status !== 200 )
|
||||
{
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uri }` ) );
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uri }` ) );
|
||||
return;
|
||||
}
|
||||
|
||||
/* try 1 > domain up */
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uri }` ) );
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uri }` ) );
|
||||
}
|
||||
catch ( err )
|
||||
{
|
||||
@@ -338,17 +375,17 @@ async function serviceCheck( service, uri )
|
||||
|
||||
try
|
||||
{
|
||||
const response = await fetch( uriRetry );
|
||||
const resp = await fetch( uriRetry );
|
||||
|
||||
/* try 2 > http > domain down */
|
||||
if ( response.status !== 200 )
|
||||
if ( resp.status !== 200 )
|
||||
{
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
return;
|
||||
}
|
||||
|
||||
/* try 2 > http > domain up */
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
}
|
||||
catch ( err )
|
||||
{
|
||||
@@ -368,17 +405,17 @@ async function serviceCheck( service, uri )
|
||||
|
||||
try
|
||||
{
|
||||
const response = await fetch( uriRetry );
|
||||
const resp = await fetch( uriRetry );
|
||||
|
||||
/* try 2 > https > domain down */
|
||||
if ( response.status !== 200 )
|
||||
if ( resp.status !== 200 )
|
||||
{
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
Log.error( `ping`, chalk.redBright( `[response]` ), chalk.white( `❌` ), chalk.redBright( `<msg>` ), chalk.gray( `Service Offline; failed to communicate with service, possibly down` ), chalk.redBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.redBright( `<service>` ), chalk.gray( `${ service }` ), chalk.redBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
return;
|
||||
}
|
||||
|
||||
/* try 2 > https > domain up */
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ response.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
Log.ok( `ping`, chalk.yellow( `[response]` ), chalk.white( `✅` ), chalk.greenBright( `<msg>` ), chalk.gray( `Service Online` ), chalk.greenBright( `<code>` ), chalk.gray( `${ resp.status }` ), chalk.greenBright( `<service>` ), chalk.gray( `${ service }` ), chalk.greenBright( `<address>` ), chalk.gray( `${ uriRetry }` ) );
|
||||
}
|
||||
catch ( err )
|
||||
{
|
||||
@@ -389,14 +426,6 @@ async function serviceCheck( service, uri )
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Semaphore > Initialize
|
||||
|
||||
@arg int threads_max
|
||||
*/
|
||||
|
||||
const semaphore = new Semaphore( 5 );
|
||||
|
||||
/*
|
||||
Func > Download File
|
||||
|
||||
@@ -710,7 +739,7 @@ async function fetchRemote( url, req )
|
||||
{
|
||||
return new Promise( ( resolve, reject ) =>
|
||||
{
|
||||
Log.info( `remo`, chalk.yellow( `[generate]` ), chalk.white( `ℹ️` ),
|
||||
Log.info( `live`, chalk.yellow( `[generate]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Preparing to fetch remote request` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<url>` ), chalk.gray( `${ url }` ) );
|
||||
@@ -723,7 +752,7 @@ async function fetchRemote( url, req )
|
||||
}
|
||||
}, ( resp ) =>
|
||||
{
|
||||
Log.info( `remo`, chalk.yellow( `[retrieve]` ), chalk.white( `ℹ️` ),
|
||||
Log.info( `live`, chalk.yellow( `[retrieve]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Getting response from remote fetch request` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<code>` ), chalk.gray( `${ resp.statusCode }` ),
|
||||
@@ -731,7 +760,7 @@ async function fetchRemote( url, req )
|
||||
|
||||
if ( resp.statusCode !== 200 )
|
||||
{
|
||||
Log.error( `remo`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
Log.error( `live`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Remote fetch returned status code other than 200` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<code>` ), chalk.gray( `${ resp.statusCode }` ),
|
||||
@@ -754,7 +783,7 @@ async function fetchRemote( url, req )
|
||||
{
|
||||
if ( err )
|
||||
{
|
||||
Log.error( `remo`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
Log.error( `live`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Remote fetch could not complete encoding type ${ encoding }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<error>` ), chalk.gray( `${ err }` ),
|
||||
@@ -765,7 +794,7 @@ async function fetchRemote( url, req )
|
||||
return reject( err );
|
||||
}
|
||||
|
||||
Log.debug( `remo`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
Log.debug( `live`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Remote fetch detected encoding type ${ encoding }; decoding` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<encoding>` ), chalk.gray( `${ encoding }` ),
|
||||
@@ -781,7 +810,7 @@ async function fetchRemote( url, req )
|
||||
{
|
||||
if ( err )
|
||||
{
|
||||
Log.error( `remo`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
Log.error( `live`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Remote fetch could not complete encoding type ${ encoding }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<error>` ), chalk.gray( `${ err }` ),
|
||||
@@ -792,7 +821,7 @@ async function fetchRemote( url, req )
|
||||
return reject( err );
|
||||
}
|
||||
|
||||
Log.debug( `remo`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
Log.debug( `live`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Remote fetch detected encoding type ${ encoding }; decoding` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<encoding>` ), chalk.gray( `${ encoding }` ),
|
||||
@@ -808,7 +837,7 @@ async function fetchRemote( url, req )
|
||||
{
|
||||
if ( err )
|
||||
{
|
||||
Log.error( `remo`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
Log.error( `live`, chalk.redBright( `[retrieve]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Remote fetch could not complete encoding type ${ encoding } (brotli decompress)` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<error>` ), chalk.gray( `${ err }` ),
|
||||
@@ -819,7 +848,7 @@ async function fetchRemote( url, req )
|
||||
return reject( err );
|
||||
}
|
||||
|
||||
Log.debug( `remo`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
Log.debug( `live`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Remote fetch detected encoding type ${ encoding } (brotli decompress); decoding` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<encoding>` ), chalk.gray( `${ encoding }` ),
|
||||
@@ -831,7 +860,7 @@ async function fetchRemote( url, req )
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.debug( `remo`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
Log.debug( `live`, chalk.yellow( `[retrieve]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Remote fetch contains no headers to decode; resolving buffer` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<encoding>` ), chalk.gray( `${ encoding }` ),
|
||||
@@ -870,6 +899,8 @@ async function serveKey( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 400,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -925,6 +956,8 @@ async function serveKey( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1222,6 +1255,8 @@ async function serveM3UPlaylist( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 404,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1312,6 +1347,8 @@ async function serveM3UPlaylist( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1370,6 +1407,8 @@ async function serveM3UPlaylist( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1419,6 +1458,8 @@ async function serveHealthCheck( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 200,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1426,12 +1467,16 @@ async function serveHealthCheck( req, res )
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
const paramQuery = new URL( req.url, `http://${ req.headers.host }` ).searchParams.get( 'query' );
|
||||
if ( paramQuery !== 'query' )
|
||||
{
|
||||
Log.ok( `/api`, chalk.yellow( `[health]` ), chalk.white( `✅` ),
|
||||
chalk.greenBright( `<msg>` ), chalk.gray( `Response` ),
|
||||
chalk.greenBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.greenBright( `<code>` ), chalk.gray( `${ statusCheck.code }` ),
|
||||
chalk.greenBright( `<status>` ), chalk.gray( `${ statusCheck.status }` ),
|
||||
chalk.greenBright( `<uptime>` ), chalk.gray( `${ process.uptime() }` ) );
|
||||
}
|
||||
|
||||
res.end( JSON.stringify( statusCheck ) );
|
||||
return;
|
||||
@@ -1452,6 +1497,8 @@ async function serveHealthCheck( req, res )
|
||||
method: req.method || 'GET',
|
||||
code: 503,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1522,11 +1569,34 @@ async function serveM3U( res, req )
|
||||
const updatedContent = formattedContent
|
||||
.replace( /(https?:\/\/[^\s]*thetvapp[^\s]*)/g, ( fullUrl ) =>
|
||||
{
|
||||
Log.debug( `.m3u`, chalk.yellow( `[rewriter]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Rewriting url for keyword` ),
|
||||
chalk.blueBright( `<keyword>` ), chalk.gray( `*thetvapp` ),
|
||||
chalk.blueBright( `<from>` ), chalk.gray( `${ fullUrl }` ),
|
||||
chalk.blueBright( `<to>` ), chalk.gray( `${ baseUrl }/channel?url=${ encodeURIComponent( fullUrl ) }` ) );
|
||||
|
||||
return `${ baseUrl }/channel?url=${ encodeURIComponent( fullUrl ) }`;
|
||||
})
|
||||
.replace( /(https?:\/\/[^\s]*tvpass[^\s]*)/g, ( fullUrl ) =>
|
||||
{
|
||||
Log.debug( `.m3u`, chalk.yellow( `[rewriter]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Rewriting url for keyword` ),
|
||||
chalk.blueBright( `<keyword>` ), chalk.gray( `*tvpass` ),
|
||||
chalk.blueBright( `<from>` ), chalk.gray( `${ fullUrl }` ),
|
||||
chalk.blueBright( `<to>` ), chalk.gray( `${ baseUrl }/channel?url=${ encodeURIComponent( fullUrl ) }` ) );
|
||||
|
||||
return `${ baseUrl }/channel?url=${ encodeURIComponent( fullUrl ) }`;
|
||||
})
|
||||
.replace( /(https?:\/\/[^\s]*fl2.moveonjoy[^\s]*)/g, ( fullUrl ) =>
|
||||
{
|
||||
const urlRewrite = fullUrl.replace( 'fl2.moveonjoy', 'fl6.moveonjoy' );
|
||||
Log.debug( `.m3u`, chalk.yellow( `[rewriter]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Rewriting url for keyword` ),
|
||||
chalk.blueBright( `<keyword>` ), chalk.gray( `*fl2.moveonjoy` ),
|
||||
chalk.blueBright( `<from>` ), chalk.gray( `${ fullUrl }` ),
|
||||
chalk.blueBright( `<to>` ), chalk.gray( `${ urlRewrite }` ) );
|
||||
|
||||
return `${ urlRewrite }`;
|
||||
});
|
||||
|
||||
res.writeHead( 200, {
|
||||
@@ -1559,6 +1629,8 @@ async function serveM3U( res, req )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1624,6 +1696,8 @@ async function serveXML( res, req )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1689,6 +1763,8 @@ async function serveGZP( res, req )
|
||||
method: req.method || 'GET',
|
||||
code: 500,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
@@ -1876,9 +1952,10 @@ async function initialize()
|
||||
FILE_GZP_MODIFIED = getFileModified( FILE_GZP );
|
||||
|
||||
const end = performance.now();
|
||||
TIME_STARTUP = `${ end - start }`;
|
||||
Log.info( `core`, chalk.yellow( `[initiate]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `TVApp2 container is ready` ),
|
||||
chalk.blueBright( `<time>` ), chalk.gray( `took ${ end - start }ms` ),
|
||||
chalk.blueBright( `<time>` ), chalk.gray( `took ${ TIME_STARTUP }ms` ),
|
||||
chalk.blueBright( `<ip>` ), chalk.gray( `${ envIpContainer }` ),
|
||||
chalk.blueBright( `<gateway>` ), chalk.gray( `${ envIpGateway }` ),
|
||||
chalk.blueBright( `<port>` ), chalk.gray( `${ envWebPort }` ) );
|
||||
@@ -1912,7 +1989,7 @@ async function initialize()
|
||||
})
|
||||
*/
|
||||
|
||||
const server = http.createServer( ( request, response ) =>
|
||||
const server = http.createServer( ( req, resp ) =>
|
||||
{
|
||||
/*
|
||||
If request.url === '/'; load index.html as default page
|
||||
@@ -1923,8 +2000,8 @@ const server = http.createServer( ( request, response ) =>
|
||||
/www/css/tvapp2.min.css
|
||||
*/
|
||||
|
||||
const method = request.method || 'GET';
|
||||
let reqUrl = request.url;
|
||||
const method = req.method || 'GET';
|
||||
let reqUrl = req.url;
|
||||
if ( reqUrl === '/' )
|
||||
reqUrl = 'index.html';
|
||||
|
||||
@@ -1946,8 +2023,8 @@ const server = http.createServer( ( request, response ) =>
|
||||
|
||||
Log.debug( `http`, chalk.yellow( `[requests]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Request started` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<request.url>` ), chalk.gray( `${ request.url }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<request.url>` ), chalk.gray( `${ req.url }` ),
|
||||
chalk.blueBright( `<reqUrl>` ), chalk.gray( `${ reqUrl }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
@@ -1969,31 +2046,33 @@ const server = http.createServer( ( request, response ) =>
|
||||
@todo integrate real api system after express replaces node http
|
||||
*/
|
||||
|
||||
const apiKey = new URL( request.url, `http://${ request.headers.host }` ).searchParams.get( 'key' );
|
||||
const referer = request.headers.referer || null;
|
||||
const apiKey = new URL( req.url, `http://${ req.headers.host }` ).searchParams.get( 'key' );
|
||||
const referer = req.headers.referer || null;
|
||||
|
||||
if ( ( !referer && envApiKey && !apiKey ) || ( referer && !referer.includes( request.headers.host ) ) )
|
||||
if ( ( !referer && envApiKey && !apiKey ) || ( referer && !referer.includes( req.headers.host ) ) )
|
||||
{
|
||||
const statusCheck =
|
||||
{
|
||||
ip: envIpContainer, gateway: envIpGateway, client: clientIp( request ),
|
||||
message: `must specify api key: http://${ request.headers.host }/api/restart?key=XXXXXXXX`,
|
||||
status: `unauthorized`, ref: request.url, method: method || 'GET', code: 401,
|
||||
uptime: Math.round( process.uptime() ), timestamp: Date.now()
|
||||
ip: envIpContainer, gateway: envIpGateway, client: clientIp( req ),
|
||||
message: `must specify api key: http://${ req.headers.host }/api/restart?key=XXXXXXXX`,
|
||||
status: `unauthorized`, ref: req.url, method: method || 'GET', code: 401,
|
||||
uptime: Math.round( process.uptime() ), timestamp: Date.now(),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' )
|
||||
};
|
||||
|
||||
response.writeHead( statusCheck.code, {
|
||||
resp.writeHead( statusCheck.code, {
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
Log.error( `http`, chalk.yellow( `[requests]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Unauthorized (401): restart attempt did not specify api key using ?key=XXX parameter` ),
|
||||
chalk.redBright( `<type>` ), chalk.gray( `api/restart` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.redBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
response.end( JSON.stringify( statusCheck ) );
|
||||
resp.end( JSON.stringify( statusCheck ) );
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -2006,24 +2085,26 @@ const server = http.createServer( ( request, response ) =>
|
||||
{
|
||||
const statusCheck =
|
||||
{
|
||||
ip: envIpContainer, gateway: envIpGateway, client: clientIp( request ),
|
||||
message: `incorrect api key specified: http://${ request.headers.host }/api/restart?key=XXXXXXXX`,
|
||||
status: `unauthorized`, ref: request.url, method: method || 'GET', code: 401,
|
||||
uptime: Math.round( process.uptime() ), timestamp: Date.now()
|
||||
ip: envIpContainer, gateway: envIpGateway, client: clientIp( req ),
|
||||
message: `incorrect api key specified: http://${ req.headers.host }/api/restart?key=XXXXXXXX`,
|
||||
status: `unauthorized`, ref: req.url, method: method || 'GET', code: 401,
|
||||
uptime: Math.round( process.uptime() ), timestamp: Date.now(),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' )
|
||||
};
|
||||
|
||||
response.writeHead( statusCheck.code, {
|
||||
resp.writeHead( statusCheck.code, {
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
Log.error( `http`, chalk.yellow( `[requests]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `Unauthorized (401): incorrect api key specified` ),
|
||||
chalk.redBright( `<type>` ), chalk.gray( `api/restart` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.redBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
response.end( JSON.stringify( statusCheck ) );
|
||||
resp.end( JSON.stringify( statusCheck ) );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2033,28 +2114,30 @@ const server = http.createServer( ( request, response ) =>
|
||||
{
|
||||
ip: envIpContainer,
|
||||
gateway: envIpGateway,
|
||||
client: clientIp( request ),
|
||||
client: clientIp( req ),
|
||||
message: 'Restart command received',
|
||||
status: 'ok',
|
||||
ref: request.url,
|
||||
ref: req.url,
|
||||
method: method || 'GET',
|
||||
code: 200,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeShort: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
uptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'round' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
response.writeHead( statusCheck.code, {
|
||||
resp.writeHead( statusCheck.code, {
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access restart api` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `api/restart` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
response.end( JSON.stringify( statusCheck ) );
|
||||
resp.end( JSON.stringify( statusCheck ) );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2063,11 +2146,11 @@ const server = http.createServer( ( request, response ) =>
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access m3u playlist` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `m3u playlist` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
await serveM3U( response, request );
|
||||
await serveM3U( resp, req );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2076,11 +2159,11 @@ const server = http.createServer( ( request, response ) =>
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access channel` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `channel` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
await serveM3UPlaylist( request, response );
|
||||
await serveM3UPlaylist( req, resp );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2089,11 +2172,11 @@ const server = http.createServer( ( request, response ) =>
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access key` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `key` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
await serveKey( request, response );
|
||||
await serveKey( req, resp );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2102,11 +2185,11 @@ const server = http.createServer( ( request, response ) =>
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access epg (uncompressed)` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `epg (uncompressed)` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
await serveXML( response, request );
|
||||
await serveXML( resp, req );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2115,24 +2198,29 @@ const server = http.createServer( ( request, response ) =>
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access epg gzip (compressed)` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `epg (compressed)` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
await serveGZP( response, request );
|
||||
await serveGZP( resp, req );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( subdomainHealth.some( ( urlKeyword ) => loadFile.startsWith( urlKeyword ) ) && method === 'GET' )
|
||||
{
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `→` ),
|
||||
const paramQuery = new URL( req.url, `http://${ req.headers.host }` ).searchParams.get( 'query' );
|
||||
|
||||
if ( paramQuery !== 'uptime' )
|
||||
{
|
||||
Log.info( `http`, chalk.yellow( `[requests]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Requesting to access health api` ),
|
||||
chalk.blueBright( `<type>` ), chalk.gray( `api/health` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
}
|
||||
|
||||
await serveHealthCheck( request, response );
|
||||
await serveHealthCheck( req, resp );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2142,7 +2230,7 @@ const server = http.createServer( ( request, response ) =>
|
||||
|
||||
Log.debug( `http`, chalk.yellow( `[requests]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Request not captured by subdomain keyword checks; sending request to ejs` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
@@ -2169,16 +2257,21 @@ const server = http.createServer( ( request, response ) =>
|
||||
appRelease: envAppRelease,
|
||||
appName: name,
|
||||
appVersion: version,
|
||||
appUrlGithub: repository.url,
|
||||
appUrlGithub: repository.url.substr( 0, repository.url.lastIndexOf( '.' ) ),
|
||||
appUrlDiscord: discord.url,
|
||||
appUrlDocs: docs.url
|
||||
appUrlDocs: docs.url,
|
||||
appGitHashShort: envGitSHA1.substring( 0, 9 ),
|
||||
appGitHashLong: envGitSHA1,
|
||||
appUptimeShort: timeAgo.format( Date.now() - Math.round( process.uptime() ) * 1000, 'twitter' ),
|
||||
appUptimeLong: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
appStartup: Math.round( TIME_STARTUP ) / 1000
|
||||
}, ( err, data ) =>
|
||||
{
|
||||
if ( !err )
|
||||
{
|
||||
Log.debug( `http`, chalk.yellow( `[requests]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Request accepted by ejs` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
@@ -2214,21 +2307,33 @@ const server = http.createServer( ( request, response ) =>
|
||||
if ( fileMime !== 'text/html' )
|
||||
data = fs.readFileSync( `./${ envWebFolder }/${ loadFile }` );
|
||||
|
||||
response.setHeader( 'Content-type', fileMime );
|
||||
response.end( data );
|
||||
resp.setHeader( 'Content-type', fileMime );
|
||||
resp.end( data );
|
||||
|
||||
if ( fileMime === 'text/html' || fileMime === 'application/xml' || fileMime === 'application/json' )
|
||||
{
|
||||
Log.ok( `http`, chalk.yellow( `[requests]` ), chalk.white( `✅` ),
|
||||
chalk.greenBright( `<msg>` ), chalk.gray( `Request to load file` ),
|
||||
chalk.greenBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.greenBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.greenBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.greenBright( `<mime>` ), chalk.gray( `${ fileMime }` ),
|
||||
chalk.greenBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.debug( `http`, chalk.yellow( `[requests]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Request to load file` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<mime>` ), chalk.gray( `${ fileMime }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.debug( `http`, chalk.yellow( `[requests]` ), chalk.white( `⚙️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Request rejected by ejs` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.blueBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.blueBright( `<error>` ), chalk.gray( `${ err }` ),
|
||||
chalk.blueBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.blueBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
@@ -2243,35 +2348,36 @@ const server = http.createServer( ( request, response ) =>
|
||||
{
|
||||
ip: envIpContainer,
|
||||
gateway: envIpGateway,
|
||||
client: clientIp( request ),
|
||||
client: clientIp( req ),
|
||||
message: 'Page not found',
|
||||
status: 'healthy',
|
||||
ref: request.url,
|
||||
ref: req.url,
|
||||
method: method || 'GET',
|
||||
code: 404,
|
||||
uptime: Math.round( process.uptime() ),
|
||||
uptimeHuman: timeAgo.format( Date.now() - process.uptime() * 1000, 'twitter' ),
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
response.writeHead( statusCheck.code, {
|
||||
resp.writeHead( statusCheck.code, {
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
Log.error( `http`, chalk.redBright( `[requests]` ), chalk.white( `❌` ),
|
||||
chalk.redBright( `<msg>` ), chalk.gray( `${ statusCheck.message }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( request ) }` ),
|
||||
chalk.redBright( `<client>` ), chalk.gray( `${ clientIp( req ) }` ),
|
||||
chalk.redBright( `<code>` ), chalk.gray( `${ statusCheck.code }` ),
|
||||
chalk.redBright( `<error>` ), chalk.gray( `${ err }` ),
|
||||
chalk.redBright( `<file>` ), chalk.gray( `${ loadFile }` ),
|
||||
chalk.redBright( `<method>` ), chalk.gray( `${ method }` ) );
|
||||
|
||||
response.end( JSON.stringify( statusCheck ) );
|
||||
resp.end( JSON.stringify( statusCheck ) );
|
||||
}
|
||||
});
|
||||
};
|
||||
handleRequest().catch( ( err ) =>
|
||||
{
|
||||
response.writeHead( 500, {
|
||||
resp.writeHead( 500, {
|
||||
'Content-Type': 'text/plain'
|
||||
});
|
||||
|
||||
@@ -2280,7 +2386,7 @@ const server = http.createServer( ( request, response ) =>
|
||||
chalk.redBright( `<code>` ), chalk.gray( `500` ),
|
||||
chalk.redBright( `<error>` ), chalk.gray( `${ err }` ) );
|
||||
|
||||
response.end( 'Internal Server Error' );
|
||||
resp.end( 'Internal Server Error' );
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2313,7 +2419,9 @@ const server = http.createServer( ( request, response ) =>
|
||||
|
||||
serviceCheck( 'TVPass.org', 'https://tvpass.org' );
|
||||
serviceCheck( 'TheTVApp.to', 'https://thetvapp.to' );
|
||||
serviceCheck( 'MoveOnJoy.com', 'https://moveonjoy.com' );
|
||||
serviceCheck( 'MoveOnJoy.com', 'http://moveonjoy.com' );
|
||||
serviceCheck( 'Daddylive.dad', 'https://daddylive.dad' );
|
||||
serviceCheck( 'Newkso.ru', 'https://zekonew.newkso.ru/zeko' );
|
||||
|
||||
/*
|
||||
start web server
|
||||
@@ -2323,7 +2431,13 @@ const server = http.createServer( ( request, response ) =>
|
||||
{
|
||||
Log.ok( `core`, chalk.yellow( `[initiate]` ), chalk.white( `✅` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Server is now running on` ),
|
||||
chalk.blueBright( `<address>` ), chalk.whiteBright.bgBlack( ` ${ envWebIP }:${ envWebPort } ` ) );
|
||||
chalk.blueBright( `<ipPublic>` ), chalk.whiteBright.bgBlack( ` ${ envWebIP }:${ envWebPort } ` ),
|
||||
chalk.blueBright( `<ipDocker>` ), chalk.whiteBright.bgBlack( ` ${ envIpContainer }:${ envWebPort } ` ) );
|
||||
|
||||
Log.info( `core`, chalk.yellow( `[initiate]` ), chalk.white( `ℹ️` ),
|
||||
chalk.blueBright( `<msg>` ), chalk.gray( `Running TVApp2 version` ),
|
||||
chalk.blueBright( `<version>` ), chalk.gray( ` ${ version } ` ),
|
||||
chalk.blueBright( `<release>` ), chalk.gray( ` ${ envAppRelease } ` ) );
|
||||
});
|
||||
})();
|
||||
|
||||
|
||||
234
tvapp2/node_modules/.package-lock.json
generated
vendored
234
tvapp2/node_modules/.package-lock.json
generated
vendored
@@ -1,26 +1,43 @@
|
||||
{
|
||||
"name": "tvapp2",
|
||||
"version": "1.5.0",
|
||||
"version": "1.5.2",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.27.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
|
||||
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
|
||||
"node_modules/@aetherinox/noxenv": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@aetherinox/noxenv/-/noxenv-1.1.1.tgz",
|
||||
"integrity": "sha512-oSk7rEI4xzC4R1IykulJf+H2hZ6/OQIqX2ZA60IIU3yy91l5UgjkeHIDQguIdC2zVfjPeW5JqI14NMZyH4WMfw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
"cross-spawn": "^7.0.6",
|
||||
"uuid": "^11.1.0"
|
||||
},
|
||||
"bin": {
|
||||
"noxenv": "src/bin/noxenv.js",
|
||||
"noxenv-shell": "src/bin/noxenv-shell.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0",
|
||||
"npm": ">=10",
|
||||
"yarn": ">=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
|
||||
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint-community/eslint-utils": {
|
||||
"version": "4.6.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz",
|
||||
"integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==",
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
|
||||
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -60,9 +77,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array": {
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
|
||||
"integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
|
||||
"version": "0.20.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
|
||||
"integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -74,10 +91,20 @@
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-helpers": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
|
||||
"integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/core": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
|
||||
"integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
|
||||
"version": "0.14.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
|
||||
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -112,13 +139,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/js": {
|
||||
"version": "9.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
|
||||
"integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
|
||||
"version": "9.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz",
|
||||
"integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://eslint.org/donate"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/object-schema": {
|
||||
@@ -132,32 +162,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit": {
|
||||
"version": "0.2.8",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
|
||||
"integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
|
||||
"integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^0.13.0",
|
||||
"@eslint/core": "^0.14.0",
|
||||
"levn": "^0.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
|
||||
"version": "0.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
|
||||
"integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.15"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/core": {
|
||||
"version": "0.19.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
||||
@@ -211,9 +228,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/retry": {
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
|
||||
"integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
|
||||
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@@ -232,9 +249,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@stylistic/eslint-plugin-js": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.2.0.tgz",
|
||||
"integrity": "sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==",
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.4.0.tgz",
|
||||
"integrity": "sha512-UeeQNRF73zJXnNGGbvwgUgzS+vzVGQoRuQKR6RhQCRHQmaBaVHxDDQVmN9RPLCnRxVjO/v8cqq/yMDqC7DikSQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -269,6 +286,12 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/luxon": {
|
||||
"version": "3.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz",
|
||||
"integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/uuid": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
|
||||
@@ -814,6 +837,19 @@
|
||||
"node": ">=6.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cron": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cron/-/cron-4.3.1.tgz",
|
||||
"integrity": "sha512-7x7DoEOxV11t3OPWWMjj1xrL1PGkTV5RV+/54IJTZD7gStiaMploY43EkeBSkDZTLRbUwk+OISbQ0TR133oXyA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/luxon": "~3.6.0",
|
||||
"luxon": "~3.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.x"
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
@@ -884,9 +920,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
|
||||
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
|
||||
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.3"
|
||||
@@ -1065,9 +1101,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-abstract": {
|
||||
"version": "1.23.9",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
|
||||
"integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
|
||||
"version": "1.23.10",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz",
|
||||
"integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1075,18 +1111,18 @@
|
||||
"arraybuffer.prototype.slice": "^1.0.4",
|
||||
"available-typed-arrays": "^1.0.7",
|
||||
"call-bind": "^1.0.8",
|
||||
"call-bound": "^1.0.3",
|
||||
"call-bound": "^1.0.4",
|
||||
"data-view-buffer": "^1.0.2",
|
||||
"data-view-byte-length": "^1.0.2",
|
||||
"data-view-byte-offset": "^1.0.1",
|
||||
"es-define-property": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"es-object-atoms": "^1.0.0",
|
||||
"es-object-atoms": "^1.1.1",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"es-to-primitive": "^1.3.0",
|
||||
"function.prototype.name": "^1.1.8",
|
||||
"get-intrinsic": "^1.2.7",
|
||||
"get-proto": "^1.0.0",
|
||||
"get-intrinsic": "^1.3.0",
|
||||
"get-proto": "^1.0.1",
|
||||
"get-symbol-description": "^1.1.0",
|
||||
"globalthis": "^1.0.4",
|
||||
"gopd": "^1.2.0",
|
||||
@@ -1102,13 +1138,13 @@
|
||||
"is-shared-array-buffer": "^1.0.4",
|
||||
"is-string": "^1.1.1",
|
||||
"is-typed-array": "^1.1.15",
|
||||
"is-weakref": "^1.1.0",
|
||||
"is-weakref": "^1.1.1",
|
||||
"math-intrinsics": "^1.1.0",
|
||||
"object-inspect": "^1.13.3",
|
||||
"object-inspect": "^1.13.4",
|
||||
"object-keys": "^1.1.1",
|
||||
"object.assign": "^4.1.7",
|
||||
"own-keys": "^1.0.1",
|
||||
"regexp.prototype.flags": "^1.5.3",
|
||||
"regexp.prototype.flags": "^1.5.4",
|
||||
"safe-array-concat": "^1.1.3",
|
||||
"safe-push-apply": "^1.0.0",
|
||||
"safe-regex-test": "^1.1.0",
|
||||
@@ -1121,7 +1157,7 @@
|
||||
"typed-array-byte-offset": "^1.0.4",
|
||||
"typed-array-length": "^1.0.7",
|
||||
"unbox-primitive": "^1.1.0",
|
||||
"which-typed-array": "^1.1.18"
|
||||
"which-typed-array": "^1.1.19"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@@ -1227,22 +1263,23 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "9.17.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
|
||||
"integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
|
||||
"version": "9.28.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz",
|
||||
"integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.2.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
"@eslint/config-array": "^0.19.0",
|
||||
"@eslint/core": "^0.9.0",
|
||||
"@eslint/eslintrc": "^3.2.0",
|
||||
"@eslint/js": "9.17.0",
|
||||
"@eslint/plugin-kit": "^0.2.3",
|
||||
"@eslint/config-array": "^0.20.0",
|
||||
"@eslint/config-helpers": "^0.2.1",
|
||||
"@eslint/core": "^0.14.0",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"@eslint/js": "9.28.0",
|
||||
"@eslint/plugin-kit": "^0.3.1",
|
||||
"@humanfs/node": "^0.16.6",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"@humanwhocodes/retry": "^0.4.1",
|
||||
"@humanwhocodes/retry": "^0.4.2",
|
||||
"@types/estree": "^1.0.6",
|
||||
"@types/json-schema": "^7.0.15",
|
||||
"ajv": "^6.12.4",
|
||||
@@ -1250,7 +1287,7 @@
|
||||
"cross-spawn": "^7.0.6",
|
||||
"debug": "^4.3.2",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"eslint-scope": "^8.2.0",
|
||||
"eslint-scope": "^8.3.0",
|
||||
"eslint-visitor-keys": "^4.2.0",
|
||||
"espree": "^10.3.0",
|
||||
"esquery": "^1.5.0",
|
||||
@@ -1303,9 +1340,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-compat-utils/node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -1445,13 +1482,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-n": {
|
||||
"version": "17.15.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.15.0.tgz",
|
||||
"integrity": "sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==",
|
||||
"version": "17.18.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.18.0.tgz",
|
||||
"integrity": "sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.4.1",
|
||||
"@eslint-community/eslint-utils": "^4.5.0",
|
||||
"enhanced-resolve": "^5.17.1",
|
||||
"eslint-plugin-es-x": "^7.8.0",
|
||||
"get-tsconfig": "^4.8.1",
|
||||
@@ -1510,9 +1547,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-n/node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -2016,9 +2053,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-tsconfig": {
|
||||
"version": "4.10.0",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
|
||||
"integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
|
||||
"version": "4.10.1",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
|
||||
"integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2887,6 +2924,15 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/luxon": {
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
|
||||
"integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
@@ -3008,6 +3054,15 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/node-cron": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.1.0.tgz",
|
||||
"integrity": "sha512-OS+3ORu+h03/haS6Di8Qr7CrVs4YaKZZOynZwQpyPZDnR3tqRbwJmuP2gVR16JfhLgyNlloAV1VTrrWlRogCFA==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||
@@ -3336,8 +3391,6 @@
|
||||
},
|
||||
"node_modules/playwright": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz",
|
||||
"integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright-core": "1.52.0"
|
||||
@@ -3354,8 +3407,6 @@
|
||||
},
|
||||
"node_modules/playwright-core": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz",
|
||||
"integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"playwright-core": "cli.js"
|
||||
@@ -3486,13 +3537,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/regexp.prototype.flags": {
|
||||
"version": "1.5.4",
|
||||
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
|
||||
@@ -4062,9 +4106,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tapable": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
|
||||
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -4284,9 +4328,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/user-agents": {
|
||||
"version": "1.1.529",
|
||||
"resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.1.529.tgz",
|
||||
"integrity": "sha512-8/ha9jnpBjUhC7+kpdAimo+mQVUMFhTJEkGVRSUsxK6YWuVZ6il+6ErVMjWpfX7q1Ft0m/4+XpPJhGuqZesFTQ==",
|
||||
"version": "1.1.557",
|
||||
"resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.1.557.tgz",
|
||||
"integrity": "sha512-7WD00n8KYmGlQEVgV4qRvH7NkcRt9KgEd7Sc95nRPcHCK8iOa5Ke85psgQKI6R+iWmBuuQKNKl2e46m6EvUTfA==",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"lodash.clonedeep": "^4.5.0"
|
||||
|
||||
2
tvapp2/node_modules/user-agents/dist/index.js
generated
vendored
2
tvapp2/node_modules/user-agents/dist/index.js
generated
vendored
File diff suppressed because one or more lines are too long
2
tvapp2/node_modules/user-agents/dist/index.js.map
generated
vendored
2
tvapp2/node_modules/user-agents/dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
tvapp2/node_modules/user-agents/package.json
generated
vendored
2
tvapp2/node_modules/user-agents/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "user-agents",
|
||||
"version": "1.1.529",
|
||||
"version": "1.1.557",
|
||||
"description": "A JavaScript library for generating random user agents. ",
|
||||
"main": "dist/index.js",
|
||||
"repository": "git@github.com:intoli/user-agents.git",
|
||||
|
||||
BIN
tvapp2/node_modules/user-agents/src/user-agents.json.gz
generated
vendored
BIN
tvapp2/node_modules/user-agents/src/user-agents.json.gz
generated
vendored
Binary file not shown.
362
tvapp2/package-lock.json
generated
362
tvapp2/package-lock.json
generated
@@ -1,32 +1,35 @@
|
||||
{
|
||||
"name": "tvapp2",
|
||||
"version": "1.5.1",
|
||||
"version": "1.5.2",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "tvapp2",
|
||||
"version": "1.5.1",
|
||||
"version": "1.5.2",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"chalk": "^5.3.0",
|
||||
"cron": "^4.3.0",
|
||||
"chalk": "^5.4.1",
|
||||
"cron": "^4.3.1",
|
||||
"ejs": "^3.1.10",
|
||||
"express": "5.1.0",
|
||||
"javascript-time-ago": "2.5.11",
|
||||
"moment": "2.30.1",
|
||||
"node-cron": "^4.0.3",
|
||||
"nconf": "1.0.0-beta.2",
|
||||
"node-cron": "^4.1.0",
|
||||
"playwright": "^1.52.0",
|
||||
"user-agents": "^1.1.537"
|
||||
"user-agents": "^1.1.557"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@stylistic/eslint-plugin-js": "^4.2.0",
|
||||
"@aetherinox/noxenv": "^1.1.1",
|
||||
"@stylistic/eslint-plugin-js": "^4.4.0",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"all-contributors-cli": "^6.26.1",
|
||||
"env-cmd": "^10.1.0",
|
||||
"eslint": "9.17.0",
|
||||
"eslint": "9.28.0",
|
||||
"eslint-plugin-chai-friendly": "^1.0.1",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-n": "17.15.0",
|
||||
"eslint-plugin-n": "17.18.0",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
"uuid": "^11.1.0"
|
||||
},
|
||||
@@ -34,23 +37,40 @@
|
||||
"node": ">=20"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.27.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
|
||||
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
|
||||
"node_modules/@aetherinox/noxenv": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@aetherinox/noxenv/-/noxenv-1.1.1.tgz",
|
||||
"integrity": "sha512-oSk7rEI4xzC4R1IykulJf+H2hZ6/OQIqX2ZA60IIU3yy91l5UgjkeHIDQguIdC2zVfjPeW5JqI14NMZyH4WMfw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
"cross-spawn": "^7.0.6",
|
||||
"uuid": "^11.1.0"
|
||||
},
|
||||
"bin": {
|
||||
"noxenv": "src/bin/noxenv.js",
|
||||
"noxenv-shell": "src/bin/noxenv-shell.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0",
|
||||
"npm": ">=10",
|
||||
"yarn": ">=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
|
||||
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint-community/eslint-utils": {
|
||||
"version": "4.6.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz",
|
||||
"integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==",
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
|
||||
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -90,9 +110,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array": {
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
|
||||
"integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
|
||||
"version": "0.20.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
|
||||
"integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -104,10 +124,20 @@
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-helpers": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
|
||||
"integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/core": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
|
||||
"integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
|
||||
"version": "0.14.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
|
||||
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@@ -142,13 +172,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/js": {
|
||||
"version": "9.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
|
||||
"integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
|
||||
"version": "9.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz",
|
||||
"integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://eslint.org/donate"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/object-schema": {
|
||||
@@ -162,32 +195,19 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit": {
|
||||
"version": "0.2.8",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
|
||||
"integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
|
||||
"integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@eslint/core": "^0.13.0",
|
||||
"@eslint/core": "^0.14.0",
|
||||
"levn": "^0.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
|
||||
"version": "0.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
|
||||
"integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.15"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/core": {
|
||||
"version": "0.19.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
||||
@@ -241,9 +261,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/retry": {
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
|
||||
"integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
|
||||
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@@ -262,9 +282,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@stylistic/eslint-plugin-js": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.2.0.tgz",
|
||||
"integrity": "sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==",
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.4.0.tgz",
|
||||
"integrity": "sha512-UeeQNRF73zJXnNGGbvwgUgzS+vzVGQoRuQKR6RhQCRHQmaBaVHxDDQVmN9RPLCnRxVjO/v8cqq/yMDqC7DikSQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -430,7 +450,6 @@
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -851,9 +870,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cron": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/cron/-/cron-4.3.0.tgz",
|
||||
"integrity": "sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==",
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cron/-/cron-4.3.1.tgz",
|
||||
"integrity": "sha512-7x7DoEOxV11t3OPWWMjj1xrL1PGkTV5RV+/54IJTZD7gStiaMploY43EkeBSkDZTLRbUwk+OISbQ0TR133oXyA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/luxon": "~3.6.0",
|
||||
@@ -933,9 +952,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
|
||||
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
|
||||
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.3"
|
||||
@@ -1070,7 +1089,6 @@
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/encodeurl": {
|
||||
@@ -1114,9 +1132,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-abstract": {
|
||||
"version": "1.23.9",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
|
||||
"integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
|
||||
"version": "1.23.10",
|
||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz",
|
||||
"integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1124,18 +1142,18 @@
|
||||
"arraybuffer.prototype.slice": "^1.0.4",
|
||||
"available-typed-arrays": "^1.0.7",
|
||||
"call-bind": "^1.0.8",
|
||||
"call-bound": "^1.0.3",
|
||||
"call-bound": "^1.0.4",
|
||||
"data-view-buffer": "^1.0.2",
|
||||
"data-view-byte-length": "^1.0.2",
|
||||
"data-view-byte-offset": "^1.0.1",
|
||||
"es-define-property": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"es-object-atoms": "^1.0.0",
|
||||
"es-object-atoms": "^1.1.1",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"es-to-primitive": "^1.3.0",
|
||||
"function.prototype.name": "^1.1.8",
|
||||
"get-intrinsic": "^1.2.7",
|
||||
"get-proto": "^1.0.0",
|
||||
"get-intrinsic": "^1.3.0",
|
||||
"get-proto": "^1.0.1",
|
||||
"get-symbol-description": "^1.1.0",
|
||||
"globalthis": "^1.0.4",
|
||||
"gopd": "^1.2.0",
|
||||
@@ -1151,13 +1169,13 @@
|
||||
"is-shared-array-buffer": "^1.0.4",
|
||||
"is-string": "^1.1.1",
|
||||
"is-typed-array": "^1.1.15",
|
||||
"is-weakref": "^1.1.0",
|
||||
"is-weakref": "^1.1.1",
|
||||
"math-intrinsics": "^1.1.0",
|
||||
"object-inspect": "^1.13.3",
|
||||
"object-inspect": "^1.13.4",
|
||||
"object-keys": "^1.1.1",
|
||||
"object.assign": "^4.1.7",
|
||||
"own-keys": "^1.0.1",
|
||||
"regexp.prototype.flags": "^1.5.3",
|
||||
"regexp.prototype.flags": "^1.5.4",
|
||||
"safe-array-concat": "^1.1.3",
|
||||
"safe-push-apply": "^1.0.0",
|
||||
"safe-regex-test": "^1.1.0",
|
||||
@@ -1170,7 +1188,7 @@
|
||||
"typed-array-byte-offset": "^1.0.4",
|
||||
"typed-array-length": "^1.0.7",
|
||||
"unbox-primitive": "^1.1.0",
|
||||
"which-typed-array": "^1.1.18"
|
||||
"which-typed-array": "^1.1.19"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@@ -1256,6 +1274,15 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
@@ -1276,22 +1303,23 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "9.17.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
|
||||
"integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
|
||||
"version": "9.28.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz",
|
||||
"integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.2.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
"@eslint/config-array": "^0.19.0",
|
||||
"@eslint/core": "^0.9.0",
|
||||
"@eslint/eslintrc": "^3.2.0",
|
||||
"@eslint/js": "9.17.0",
|
||||
"@eslint/plugin-kit": "^0.2.3",
|
||||
"@eslint/config-array": "^0.20.0",
|
||||
"@eslint/config-helpers": "^0.2.1",
|
||||
"@eslint/core": "^0.14.0",
|
||||
"@eslint/eslintrc": "^3.3.1",
|
||||
"@eslint/js": "9.28.0",
|
||||
"@eslint/plugin-kit": "^0.3.1",
|
||||
"@humanfs/node": "^0.16.6",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"@humanwhocodes/retry": "^0.4.1",
|
||||
"@humanwhocodes/retry": "^0.4.2",
|
||||
"@types/estree": "^1.0.6",
|
||||
"@types/json-schema": "^7.0.15",
|
||||
"ajv": "^6.12.4",
|
||||
@@ -1299,7 +1327,7 @@
|
||||
"cross-spawn": "^7.0.6",
|
||||
"debug": "^4.3.2",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"eslint-scope": "^8.2.0",
|
||||
"eslint-scope": "^8.3.0",
|
||||
"eslint-visitor-keys": "^4.2.0",
|
||||
"espree": "^10.3.0",
|
||||
"esquery": "^1.5.0",
|
||||
@@ -1352,9 +1380,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-compat-utils/node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -1494,13 +1522,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-n": {
|
||||
"version": "17.15.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.15.0.tgz",
|
||||
"integrity": "sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==",
|
||||
"version": "17.18.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.18.0.tgz",
|
||||
"integrity": "sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.4.1",
|
||||
"@eslint-community/eslint-utils": "^4.5.0",
|
||||
"enhanced-resolve": "^5.17.1",
|
||||
"eslint-plugin-es-x": "^7.8.0",
|
||||
"get-tsconfig": "^4.8.1",
|
||||
@@ -1559,9 +1587,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-n/node_modules/semver": {
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"version": "7.7.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
|
||||
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -1959,20 +1987,6 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
@@ -2017,7 +2031,6 @@
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": "6.* || 8.* || >= 10.*"
|
||||
@@ -2079,9 +2092,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-tsconfig": {
|
||||
"version": "4.10.0",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
|
||||
"integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
|
||||
"version": "4.10.1",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
|
||||
"integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2315,6 +2328,15 @@
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ini": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
|
||||
"integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/inquirer": {
|
||||
"version": "7.3.3",
|
||||
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
|
||||
@@ -2546,7 +2568,6 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -2813,6 +2834,15 @@
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/javascript-time-ago": {
|
||||
"version": "2.5.11",
|
||||
"resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.11.tgz",
|
||||
"integrity": "sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"relative-time-format": "^1.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/js-yaml": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||
@@ -3071,6 +3101,86 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nconf": {
|
||||
"version": "1.0.0-beta.2",
|
||||
"resolved": "https://registry.npmjs.org/nconf/-/nconf-1.0.0-beta.2.tgz",
|
||||
"integrity": "sha512-1AsulxjcXgTHRZ1ZCKj4AzdPJI1MlbFkdrd9Pzd3s+K9XiDZfJRO0351dIGuT3wcaSTRd5s3sPoFHR6Kk9W6lA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ini": "^2.0.0",
|
||||
"yargs": "^17.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/nconf/node_modules/cliui": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"string-width": "^4.2.0",
|
||||
"strip-ansi": "^6.0.1",
|
||||
"wrap-ansi": "^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/nconf/node_modules/wrap-ansi": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.0.0",
|
||||
"string-width": "^4.1.0",
|
||||
"strip-ansi": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/nconf/node_modules/y18n": {
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/nconf/node_modules/yargs": {
|
||||
"version": "17.7.2",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
||||
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cliui": "^8.0.1",
|
||||
"escalade": "^3.1.1",
|
||||
"get-caller-file": "^2.0.5",
|
||||
"require-directory": "^2.1.1",
|
||||
"string-width": "^4.2.3",
|
||||
"y18n": "^5.0.5",
|
||||
"yargs-parser": "^21.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/nconf/node_modules/yargs-parser": {
|
||||
"version": "21.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
||||
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/negotiator": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
|
||||
@@ -3081,9 +3191,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/node-cron": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.0.3.tgz",
|
||||
"integrity": "sha512-YPEUlbYGgpfN44OtCm4KkK4TXjeIB4arERbDWP7kJgM+QHFK9AdM6/3bp4M3oB1QBrL5INyTRLAPei87j49foA==",
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.1.0.tgz",
|
||||
"integrity": "sha512-OS+3ORu+h03/haS6Di8Qr7CrVs4YaKZZOynZwQpyPZDnR3tqRbwJmuP2gVR16JfhLgyNlloAV1VTrrWlRogCFA==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
@@ -3417,8 +3527,6 @@
|
||||
},
|
||||
"node_modules/playwright": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz",
|
||||
"integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright-core": "1.52.0"
|
||||
@@ -3435,8 +3543,6 @@
|
||||
},
|
||||
"node_modules/playwright-core": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz",
|
||||
"integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"playwright-core": "cli.js"
|
||||
@@ -3567,13 +3673,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/regexp.prototype.flags": {
|
||||
"version": "1.5.4",
|
||||
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
|
||||
@@ -3595,11 +3694,16 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/relative-time-format": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.6.tgz",
|
||||
"integrity": "sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/require-directory": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
@@ -4011,7 +4115,6 @@
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"emoji-regex": "^8.0.0",
|
||||
@@ -4085,7 +4188,6 @@
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
@@ -4143,9 +4245,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tapable": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
|
||||
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -4365,9 +4467,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/user-agents": {
|
||||
"version": "1.1.537",
|
||||
"resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.1.537.tgz",
|
||||
"integrity": "sha512-D3t8f1G3Kd3Ak0t9Md9oNsK59Ms1hs9FhdwkMafkaNpwpMcq/FHuHHT/ky64Dy8aKJkMFcEBeVN0zQmtoTKCKg==",
|
||||
"version": "1.1.557",
|
||||
"resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.1.557.tgz",
|
||||
"integrity": "sha512-7WD00n8KYmGlQEVgV4qRvH7NkcRt9KgEd7Sc95nRPcHCK8iOa5Ke85psgQKI6R+iWmBuuQKNKl2e46m6EvUTfA==",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"lodash.clonedeep": "^4.5.0"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tvapp2",
|
||||
"version": "1.5.1",
|
||||
"version": "1.5.3",
|
||||
"description": "This package allows you to generate M3U playlists and EPG guides from various online IPTV services.",
|
||||
"author": "BinaryNinja",
|
||||
"license": "MIT",
|
||||
@@ -72,26 +72,29 @@
|
||||
"iptv"
|
||||
],
|
||||
"dependencies": {
|
||||
"cron": "^4.3.0",
|
||||
"node-cron": "^4.0.3",
|
||||
"cron": "^4.3.1",
|
||||
"node-cron": "^4.1.0",
|
||||
"playwright": "^1.52.0",
|
||||
"user-agents": "^1.1.537",
|
||||
"chalk": "^5.3.0",
|
||||
"user-agents": "^1.1.557",
|
||||
"chalk": "^5.4.1",
|
||||
"ejs": "^3.1.10",
|
||||
"moment": "2.30.1",
|
||||
"express": "5.1.0"
|
||||
"express": "5.1.0",
|
||||
"nconf": "1.0.0-beta.2",
|
||||
"javascript-time-ago": "2.5.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@aetherinox/noxenv": "^1.1.1",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"all-contributors-cli": "^6.26.1",
|
||||
"uuid": "^11.1.0",
|
||||
"env-cmd": "^10.1.0",
|
||||
"eslint": "9.17.0",
|
||||
"eslint": "9.28.0",
|
||||
"eslint-plugin-chai-friendly": "^1.0.1",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-n": "17.15.0",
|
||||
"eslint-plugin-n": "17.18.0",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
"@stylistic/eslint-plugin-js": "^4.2.0"
|
||||
"@stylistic/eslint-plugin-js": "^4.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
|
||||
@@ -18,14 +18,14 @@
|
||||
<nav class="navbar sticky-top container">
|
||||
<div class="navbar-brand">
|
||||
<i data-bs-toggle="tooltip" title="v<%= appVersion %>" class="logo fa-sharp-duotone fa-regular fa-tv" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i>
|
||||
<a class="header-name" href="<%= appUrlGithub %>">TVApp2 for Docker</a>
|
||||
<a target="_blank" data-bs-toggle="tooltip" title="View Github Repository" class="header-name" href="<%= appUrlGithub %>">TVApp2 for Docker</a>
|
||||
</div>
|
||||
<div class="navbar-social">
|
||||
<a href=""><i id="action-health" data-bs-toggle="tooltip" title="Health" class="heart logo health fa-duotone fa-solid fa-heart" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<i id="action-health" data-bs-toggle="tooltip" title="Health" class="heart logo health fa-duotone fa-solid fa-heart" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i>
|
||||
<a href="javascript:runResync();"><i id="action-resync" data-bs-toggle="tooltip" title="Resync" class="restart fa-solid fa-rotate" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a href="<%= appUrlDocs %>"><i data-bs-toggle="tooltip" title="Documentation" class="logo fa-duotone fa-solid fa-book-open-cover" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a href="<%= appUrlGithub %>"><i data-bs-toggle="tooltip" title="Github" class="logo fa-logos fa-github" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a href="<%= appUrlDiscord %>"><i data-bs-toggle="tooltip" title="Discord" class="logo fa-logos fa-discord" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a target="_blank" href="<%= appUrlDocs %>"><i data-bs-toggle="tooltip" title="Documentation" class="logo fa-duotone fa-solid fa-book-open-cover" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a target="_blank" href="<%= appUrlGithub %>"><i data-bs-toggle="tooltip" title="Github" class="logo fa-logos fa-github" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
<a target="_blank" href="<%= appUrlDiscord %>"><i data-bs-toggle="tooltip" title="Discord" class="logo fa-logos fa-discord" style="--fa-primary-color: rgb(255, 255, 255); --fa-secondary-color: rgb(255, 255, 255);" aria-hidden="true"></i></a>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
@@ -124,8 +124,8 @@
|
||||
<div class="footer-inner">
|
||||
<div class="container">
|
||||
<div class="col text-center text-muted text-small text-nowrap">
|
||||
<small>Developed by BinaryNinja - <a data-bs-toggle="tooltip" title="<%= appRelease %> build" href="<%= appUrlGithub %>"><%= appName %> (<%= appRelease %>)</a> - v<%= appVersion %></small><br />
|
||||
<small>This utility is for educational purposes only</small>
|
||||
<small>Developed by BinaryNinja - <a data-bs-toggle="tooltip" title="v<%= appVersion %> <%= appRelease %> (<%= appGitHashShort %>)" href="<%= appUrlGithub %>"><%= appName %> (<%= appRelease %>)</a> v<%= appVersion %> <a target="_blank" data-bs-toggle="tooltip" title="View Github commit" href="<%= appUrlGithub %>/commit/<%= appGitHashLong %>"><%= appGitHashShort %></a></small><br />
|
||||
<small>Uptime <a id="uptime" href="" data-bs-toggle="tooltip" title="<%= appUptimeLong %>"> <%= appUptimeShort %> </a> | Startup <a id="startup" href=""><%= appStartup %>s</a></small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -299,6 +299,7 @@
|
||||
let timerDelayMS = 10000;
|
||||
let timerStartMS = Date.now(); // returns milliseconds
|
||||
const timerHealthRun = '<%= healthTimer %>'; // time in milliseconds until health check ran AFTER initial run
|
||||
const timerUptime = 1000;
|
||||
|
||||
/*
|
||||
Action > Healthcheck
|
||||
@@ -317,7 +318,7 @@
|
||||
url: 'api/health',
|
||||
type: 'GET',
|
||||
data: {
|
||||
internal: 1
|
||||
query: 'healthcheck'
|
||||
},
|
||||
beforeSend: function( data )
|
||||
{
|
||||
@@ -362,6 +363,54 @@
|
||||
}).responseText;
|
||||
}
|
||||
|
||||
function runUptime()
|
||||
{
|
||||
const toastTypeClass = [];
|
||||
toastTypeClass[ 'DEFAULT' ] = 'text-bg-primary';
|
||||
toastTypeClass[ 'UNHEALTHY' ] = 'text-bg-warning';
|
||||
toastTypeClass[ 'HEALTHY' ] = 'text-bg-success';
|
||||
toastTypeClass[ 'ERROR' ] = 'text-bg-danger';
|
||||
|
||||
$.ajax(
|
||||
{
|
||||
url: 'api/health',
|
||||
type: 'GET',
|
||||
data: {
|
||||
query: 'uptime'
|
||||
},
|
||||
success: function( data )
|
||||
{
|
||||
const status = data.message;
|
||||
const code = data.code;
|
||||
const uptimeShort = data.uptimeShort;
|
||||
const uptimeLong = data.uptimeLong;
|
||||
if ( status )
|
||||
{
|
||||
$('a#uptime').text(`${ uptimeShort }`);
|
||||
|
||||
const tooltip = bootstrap.Tooltip.getInstance('#uptime') // Returns a Bootstrap tooltip instance
|
||||
tooltip.setContent( { '.tooltip-inner': `App started ${ uptimeLong }` } )
|
||||
}
|
||||
},
|
||||
error: function( data )
|
||||
{
|
||||
const toastClass = toastTypeClass['ERROR'];
|
||||
const toastElm = document.getElementById('tvapp2Toast');
|
||||
toastElm.classList.add(toastClass);
|
||||
|
||||
$('.toast #toast-title').html(`Could not get uptime from api`);
|
||||
$('.toast #toast-message').html(`Failed to communicate with the api. Try restarting the docker container to restore connection.`);
|
||||
$('#tvapp2Toast').toast('show');
|
||||
}
|
||||
}).always(function()
|
||||
{
|
||||
setTimeout(function()
|
||||
{
|
||||
runUptime();
|
||||
}, parseInt(timerUptime));
|
||||
}).responseText;
|
||||
}
|
||||
|
||||
/*
|
||||
Action > Do Resync
|
||||
*/
|
||||
@@ -373,7 +422,7 @@
|
||||
url: 'api/restart',
|
||||
type: 'GET',
|
||||
data: {
|
||||
internal: 1
|
||||
query: 'sync'
|
||||
},
|
||||
beforeSend: function( data )
|
||||
{
|
||||
@@ -458,11 +507,8 @@
|
||||
|
||||
jQuery(function($)
|
||||
{
|
||||
$(document.body).tooltip({ selector: "[title]" });
|
||||
$('#action-health')
|
||||
.attr('data-original-title', `Health check in ${ timeLeft }`)
|
||||
.attr('aria-label', `Health check in ${ timeLeft }`)
|
||||
.attr('data-bs-original-title', `Health check in ${ timeLeft }`)
|
||||
const tooltip = bootstrap.Tooltip.getInstance('#action-health') // Returns a Bootstrap tooltip instance
|
||||
tooltip.setContent({ '.tooltip-inner': `Health check in ${ timeLeft }` })
|
||||
});
|
||||
|
||||
const Heart = document.getElementsByClassName('fa-heart');
|
||||
@@ -495,6 +541,7 @@
|
||||
*/
|
||||
|
||||
setTimeout( function() { runHealthCheck(); }, timerDelayMS );
|
||||
setTimeout( function() { runUptime(); }, 1000 );
|
||||
|
||||
/*
|
||||
Action > Tooltip Resync Timers
|
||||
|
||||
Reference in New Issue
Block a user