` argument is what determines what registry your image will be pushed to. You can change this to any registry:
+>
+> | Registry | Tag |
+> | --- | --- |
+> | Dockerhub | `--tag thebinaryninja/tvapp2:1.1.0-amd64`
`--tag thebinaryninja/tvapp2:1.1.0-arm64` |
+> | Github (GHCR) | `--tag ghcr.io/thebinaryninja/tvapp2:1.1.0-amd64`
`--tag ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64` |
+> | Registry v2 | `--tag registry.domain.lan/thebinaryninja/tvapp2:1.1.0-amd64`
`--tag registry.domain.lan/thebinaryninja/tvapp2:1.1.0-arm64` |
+> | Gitea | `--tag gitea.domain.lan/thebinaryninja/tvapp2:1.1.0-amd64`
`--tag gitea.domain.lan/thebinaryninja/tvapp2:1.1.0-arm64` |
+
+
+
+After we built these two images and push them to a registry online, we will merge them into a single docker image which contains both arcitectures.
+
+
+
+> ![WARNING]
+> In order to merge the two architecture images into one; you **MUST** `--push` each of the two docker images to a registry first. You cannot modify the manifests locally.
+
+
+
+##### Stable - amd64
+
+Creates the TVApp2 **Stable** release `amd64` docker image:
+
+```shell
+# Build Tvapp2 amd64 - (stable release)
+docker buildx build \
+ --build-arg ARCH=amd64 \
+ --build-arg VERSION=1.1.0 \
+ --build-arg BUILDDATE=20250325 \
+ --tag ghcr.io/thebinaryninja/tvapp2:1.1.0-amd64 \
+ --attest type=provenance,disabled=true \
+ --attest type=sbom,disabled=true \
+ --file Dockerfile \
+ --platform linux/amd64 \
+ --output type=docker \
+ --allow network.host \
+ --network host \
+ --no-cache \
+ --pull \
+ --push \
+ .
+```
+
+
+
+##### Stable - arm64
+
+Creates the TVApp2 **Stable** release `arm64` docker image:
+
+```shell
+# Build Tvapp2 arm64 - (stable release)
+docker buildx build \
+ --build-arg ARCH=arm64 \
+ --build-arg VERSION=1.1.0 \
+ --build-arg BUILDDATE=20250325 \
+ --tag ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64 \
+ --attest type=provenance,disabled=true \
+ --attest type=sbom,disabled=true \
+ --file Dockerfile \
+ --platform linux/arm64 \
+ --output type=docker \
+ --allow network.host \
+ --network host \
+ --no-cache \
+ --pull \
+ --push \
+ .
+```
+
+
+
+##### Development - amd64
+
+Creates the TVApp2 **Development** release `amd64` docker image:
+
+```shell
+# Build Tvapp2 amd64 - (development release)
+docker buildx build \
+ --build-arg ARCH=amd64 \
+ --build-arg VERSION=1.1.0 \
+ --build-arg BUILDDATE=20250325 \
+ --tag ghcr.io/thebinaryninja/tvapp2:development-amd64 \
+ --attest type=provenance,disabled=true \
+ --attest type=sbom,disabled=true \
+ --file Dockerfile \
+ --platform linux/amd64 \
+ --output type=docker \
+ --allow network.host \
+ --network host \
+ --no-cache \
+ --pull \
+ --push \
+ .
+```
+
+
+
+##### Development - arm64
+
+Creates the TVApp2 **Development** release `arm64` docker image:
+
+```shell
+# Build Tvapp2 arm64 - (development release)
+docker buildx build \
+ --build-arg ARCH=arm64 \
+ --build-arg VERSION=1.1.0 \
+ --build-arg BUILDDATE=20250325 \
+ --tag ghcr.io/thebinaryninja/tvapp2:development-arm64 \
+ --attest type=provenance,disabled=true \
+ --attest type=sbom,disabled=true \
+ --file Dockerfile \
+ --platform linux/arm64 \
+ --output type=docker \
+ --allow network.host \
+ --network host \
+ --no-cache \
+ --pull \
+ --push \
+ .
+```
+
+
+
+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.1.0-amd64`
+- `--tag ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64`
+- `--tag ghcr.io/thebinaryninja/tvapp2:development-amd64`
+- `--tag ghcr.io/thebinaryninja/tvapp2:development-arm64`
+
+
+
+Next, we need to take these two images, and merge them into one so that both architectures are available without having to push separate images. You need to obtain the SHA256 hash digest for the `amd64` and `arm64` images. You can go to the registry where you uploaded the images and then copy them. Or you can run the following commands:
+
+```shell
+$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.1.0-amd64
+
+Name: ghcr.io/thebinaryninja/tvapp2:1.1.0-amd64
+MediaType: application/vnd.docker.distribution.manifest.v2+json
+Digest: sha256:657fd74ebfa6577c069d1d74fec291b8b5309f762e7ad2d0d14b51de64a841b8
+
+$ docker buildx imagetools inspect ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64
+
+Name: ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64
+MediaType: application/vnd.docker.distribution.manifest.v2+json
+Digest: sha256:2750bb927d8e4434d21c9f9941632310b98bbb2729389af236888ebbc4d75dda
```
-#### Option 3: Using `package.json`
+> [!WARNING]
+> **Wrong Digest Hashes**
+>
+> Be warned that when you push docker images to your docker registry; the `SHA256` hash digest will be different than what you have locally. If you use the following command; these digests will be **incorrect**:
+>
+> ```shell
+> $ docker images --all --no-trunc | grep thebinaryninja
+>
+> ghcr.io/thebinaryninja/tvapp2 1.1.0-arm64 sha256:bb425429e98ab467fd91474701da2e5c0a7cb4a5f218a710d950eb0ff595486c 3 minutes ago 38.8MB
+>
+> ghcr.io/thebinaryninja/tvapp2 1.1.0-amd64 sha256:dea4cb91379dba289d8d3e8842d4fb7b7857faa7f3d02d5b9a043a1ee58e61d7 4 minutes ago 27.3MB
+> ```
+
+
+
+
+Once you have the correct `SHA256` hash digests; paste them into the command below. This command is where you can specify the real `--tag` that the public image will have. The previous tags were simply placeholders and no longer matter.
+
+```shell
+# #
+# Image > Stable
+# #
+
+docker buildx imagetools create \
+ --tag ghcr.io/thebinaryninja/tvapp2:1.1.0 \
+ --tag ghcr.io/thebinaryninja/tvapp2:1.1 \
+ --tag ghcr.io/thebinaryninja/tvapp2:1 \
+ --tag ghcr.io/thebinaryninja/tvapp2:latest \
+ sha256:2750bb927d8e4434d21c9f9941632310b98bbb2729389af236888ebbc4d75dda \
+ sha256:657fd74ebfa6577c069d1d74fec291b8b5309f762e7ad2d0d14b51de64a841b8
+```
+
+
+
+For the **development** release, use:
+
+```shell
+# #
+# Image > Development
+# #
+
+docker buildx imagetools create \
+ --tag ghcr.io/thebinaryninja/tvapp2:development \
+ sha256:2750bb927d8e4434d21c9f9941632310b98bbb2729389af236888ebbc4d75dda \
+ sha256:657fd74ebfa6577c069d1d74fec291b8b5309f762e7ad2d0d14b51de64a841b8
+```
+
+
+
+
+Alternatively, you could use the `manifest create` command; as an example, you can merge multiple architecture images together into a single image. The top line with `thebinaryninja/tvapp2:latest` can be any name. However, all images after `--amend` MUST be already existing images uploaded to the registry.
+
+```shell
+docker manifest create ghcr.io/thebinaryninja/tvapp2:latest \
+ --amend ghcr.io/thebinaryninja/tvapp2:latest-amd64 \
+ --amend ghcr.io/thebinaryninja/tvapp2:latest-arm32v7 \
+ --amend ghcr.io/thebinaryninja/tvapp2:latest-arm64v8
+
+docker manifest push ghcr.io/thebinaryninja/tvapp2:latest
+```
+
+
+
+In this example, we take the existing two files we created earlier, and merge them into one. You can either specify the image by `SHA256 digest`, or tag:
+
+```shell
+# Example 1 (using tag)
+docker manifest create ghcr.io/thebinaryninja/tvapp2:latest \
+ --amend ghcr.io/thebinaryninja/tvapp2:1.1.0-amd64 \
+ --amend ghcr.io/thebinaryninja/tvapp2:1.1.0-arm64
+
+# Example 2 (using sha256 hash)
+docker manifest create ghcr.io/thebinaryninja/tvapp2:latest \
+ --amend ghcr.io/thebinaryninja/tvapp2@sha256:2750bb927d8e4434d21c9f9941632310b98bbb2729389af236888ebbc4d75dda \
+ --amend ghcr.io/thebinaryninja/tvapp2@sha256:657fd74ebfa6577c069d1d74fec291b8b5309f762e7ad2d0d14b51de64a841b8
+
+# Push manifest changes to registry
+docker manifest push ghcr.io/thebinaryninja/tvapp2:latest
+```
+
+
+
+If you go back to your registry; you should now see multiple new entries, all with different tags. Two of the images are your old `amd64` and `arm64` images, and then you should have your official one with the four tags specified above. You can delete the two original images if you do not want them.
+
+
+
+
Registry v2: Newly created amd64 and arm64 images, and merged containers with both architectures
+
+
+
+
+#### Build Using `package.json`
This node project includes build commands. In order to use them you must install node on your machine.
-```shell ignore
+```shell
sudo apt-get install node
```
@@ -640,10 +982,9 @@ sudo apt-get install node
To build the project, `cd` into the project folder and run the build command:
-```shell ignore
+```shell
cd /home/docker/tvapp2/
-
-npm run docker:build:amd64 --VERSION=1.0.1 --BUILDDATE=20250220
+npm run docker:build:amd64 --VERSION=1.1.0 --BUILDDATE=20250325
```
@@ -668,7 +1009,7 @@ The run command above has several variables you must specify:
| Variable | Description |
| --- | --- |
| `--VERSION=1.X.X` | The version to assign to the docker image |
-| `--BUILDDATE=20250220` | The date to assign to the docker image.
Date format: `YYYYMMDD` |
+| `--BUILDDATE=20250325` | The date to assign to the docker image.
Date format: `YYYYMMDD` |
| `--ARCH=amd64` | Architecture for image
Options: `amd64`, `arm64` |
@@ -770,7 +1111,7 @@ This docker container contains the following env variables:
| `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_PLAYLIST` | `playlist.m3u8` | Filename for M3U playlist file |
| `FILE_EPG` | `xmltv.xml` | Filename for XML guide data file |
-| `FILE_TAR` | `xmltv.xml.gz` | Filename for XML compressed as gzip .gz |
+| `FILE_GZIP` | `xmltv.xml.gz` | Filename for XML compressed as gzip .gz |
| `STREAM_QUALITY` | `hd` | Stream quality
Can be either `hd` or `sd` |
| `DIR_BUILD` | `/usr/src/app` | Path inside container where TVApp2 will be built.
⚠️ This should not be used unless you know what you're doing |
| `DIR_RUN` | `/usr/bin/app` | Path inside container where TVApp2 will be placed after it is built
⚠️ This should not be used unless you know what you're doing |