Skip to content

Releases: Zibbp/ganymede

v4.0.2

12 Jan 16:24
Compare
Choose a tag to compare

Caution

If you have not updated to v4.0.0 you must do that before continuing. Read the v4.0.0 release notes for more information.

Important

If you are running the :dev container image now is a good time to switch back to :latest or the semver version.

Features

Sprite Thumbnails

Sprite thumbnails are now generated by default after a video is archived. This is run after the video is completely archived and is only visible in the Tasks/River UI. As noted in the 4.0.0 release notes, this process is not CPU intensive so users with little available resources should not be concerned. This feature can be disabled at Admin > Settings. By default there are 2 thumbnail generation workers. This can be configured using the new MAX_VIDEO_SPRITE_THUMBNAIL_EXECUTIONS environment variable.

What's Changed

  • fix(frontend): make env vars available in browser by @Zibbp in #574
  • fix(frontend): axios base url by @Zibbp in #582
  • feat: automate generate sprite thumbnails by @Zibbp in #583
  • feat: better tests by @Zibbp in #575
    • Start writing better tests. Currently the full authentication flow and archive process is tested.
  • build(deps): bump golang.org/x/oauth2 from 0.24.0 to 0.25.0 by @dependabot in #578
  • build(deps): bump github.com/riverqueue/river from 0.14.3 to 0.15.0 by @dependabot in #571
  • build(deps): bump github.com/coreos/go-oidc/v3 from 3.11.0 to 3.12.0 by @dependabot in #577
  • 4.0.2 misc fixes by @Zibbp in #584

Full Changelog: v4.0.1...v4.0.2

v4.0.1

29 Dec 21:33
Compare
Choose a tag to compare

Caution

If you have not updated to v4.0.0 you must do that before continuing. Read the v4.0.0 release notes for more information.

Important

If you are running the :dev container image now is a good time to switch back to :latest or the semver version.

What's Changed

  • fix: max video age for watched channels by @Zibbp in #555
    • Fix for the video max age not saving in the Web UI.
  • fix: use a local copy of the Inter font instead of relying on Google fonts by @Zibbp in #556
  • docs: update README.md by @eltociear in #557
  • feat(live/clip): allow ignoring last checked time by @Zibbp in #565
    • Add an option to ignore the "last checked" database row when channel clips are checked. By default channel clips are not checked until the number of interval days have passed. This option bypasses that.
    • Allow more than 100 clips.
    • Better wording of what the feature does in the UI.
  • build(deps): bump nanoid from 3.3.7 to 3.3.8 in /frontend by @dependabot in #553
  • feat(http): enable gzip for api routes by @Zibbp in #566
  • feat(frontend): add locked video indicator by @Zibbp in #568
    • 399183412-6e2e8c9a-d9e9-4129-93d1-22c2e4cdd30c

New Contributors

Full Changelog: v4.0.0...v4.0.1

v4.0.0

24 Dec 01:43
9edf442
Compare
Choose a tag to compare

v4.0.0. Release 🎅🎄

Warning

Contains changes to the compose file providing a simpler way to run Ganymede

Reduce The Number of Containers

Running Ganymede now only requires two containers! 🎉 The Ganymede container and a PostgreSQL database. The frontend, nginx, and River UI containers have been removed or bundled into the main image. This decreases the barrier of entry to running Ganymede and will hopefully remove confusion between the containers. This requires changes to your compose file, specifically:

  • Removing the Frontend service (if using)
    • Move the non-*_URL environment variables to the Ganymede service. Remove the *_URL env vars entirely.
  • Removing the Nginx service (if using)
  • Removing the River UI service (if using)

See the below diff or the docker-compose.yml in the repository for more information.

 services:
-  ganymede-api:
-    container_name: ganymede-api
+  ganymede:
+    container_name: ganymede
     image: ghcr.io/zibbp/ganymede:latest
     restart: unless-stopped
     depends_on:
       - ganymede-db
     environment:
       - DEBUG=false
       - TZ=America/Chicago # Set to your timezone
       # Data paths in container; update the mounted volume paths as well
       - VIDEOS_DIR=/data/videos
       - TEMP_DIR=/data/temp
       - LOGS_DIR=/data/logs
       - CONFIG_DIR=/data/config
       # Database settings
       - DB_HOST=ganymede-db
       - DB_PORT=5432
       - DB_USER=ganymede
       - DB_PASS=PASSWORD
       - DB_NAME=ganymede-prd
       - DB_SSL=disable
-      #- DB_SSL_ROOT_CERT= # path to cert in the container if DB_SSL is not disabled
-      - JWT_SECRET=SECRET # set as a random string
-      - JWT_REFRESH_SECRET=SECRET # set as a random string
+      # - DB_SSL_ROOT_CERT= # path to cert in the container if DB_SSL is not disabled
       - TWITCH_CLIENT_ID= # from your twitch application
       - TWITCH_CLIENT_SECRET= # from your twitch application
-      - FRONTEND_HOST=http://IP:PORT # URL to the frontend service. Needs to be the 'public' url that you visit.
-      #- COOKIE_DOMAIN= # Optional domain that the cookies will be set to. Should be the top level domain with a reverse proxy (e.g. `domain.com`).
       # Worker settings. Max number of tasks to run in parallel per type.
       - MAX_CHAT_DOWNLOAD_EXECUTIONS=3
       - MAX_CHAT_RENDER_EXECUTIONS=2
       - MAX_VIDEO_DOWNLOAD_EXECUTIONS=2
       - MAX_VIDEO_CONVERT_EXECUTIONS=3
       # Optional OAuth settings
       # - OAUTH_ENABLED=false
       # - OAUTH_PROVIDER_URL=
       # - OAUTH_CLIENT_ID=
       # - OAUTH_CLIENT_SECRET=
       # - OAUTH_REDIRECT_URL=http://IP:PORT/api/v1/auth/oauth/callback # Points to the API service
+      # Optional Frontend settings
+      - SHOW_SSO_LOGIN_BUTTON=true
+      - FORCE_SSO_AUTH=false
+      - REQUIRE_LOGIN=false
     volumes:
       - /path/to/vod/storage:/data/videos # update VIDEOS_DIR env var
       - ./temp:/data/temp # update TEMP_DIR env var
       - ./logs:/data/logs # queue logs
       - ./config:/data/config # config and other miscellaneous files
     ports:
       - 4800:4000
-  ganymede-frontend:
-    container_name: ganymede-frontend
-    image: ghcr.io/zibbp/ganymede-frontend:latest
-    restart: unless-stopped
-    environment:
-      - API_URL=http://IP:PORT # Points to the API service; the container must be able to access this URL internally
-      - CDN_URL=http://IP:PORT # Can point to your nginx service, or set same as API_URL if nginx is not used
-      - SHOW_SSO_LOGIN_BUTTON=true # show/hide SSO login button on login page
-      - FORCE_SSO_AUTH=false # force SSO auth for all users (bypasses login page and redirects to SSO)
-      - REQUIRE_LOGIN=false # require login to view videos
-    ports:
-      - 4801:3000
+    healthcheck:
+      test: curl --fail http://localhost:4000/health || exit 1
+      interval: 60s
+      retries: 5
+      start_period: 60s
+      timeout: 10s
   ganymede-db:
     container_name: ganymede-db
     image: postgres:14
     volumes:
       - ./ganymede-db:/var/lib/postgresql/data
     environment:
       - POSTGRES_PASSWORD=PASSWORD
       - POSTGRES_USER=ganymede
       - POSTGRES_DB=ganymede-prd
     ports:
-      - 4803:5432
-  # Nginx is not really required, it provides nice-to-have caching. The API container will serve the VIDEO_DIR env var path if you want to use that instead (e.g. VIDEOS_DIR=/data/videos would be served at IP:4800/data/videos/channel/channel.jpg).
-  ganymede-nginx:
-    container_name: ganymede-nginx
-    image: nginx
-    volumes:
-      - /path/to/nginx.conf:/etc/nginx/nginx.conf:ro
-      - /pah/to/vod/stoage:/data/videos
-    ports:
-      - 4802:8080
-  # River UI is a frontend for the task system that Ganymede uses. This provides a more in-depth look at the task queue.
-  ganymede-river-ui:
-    image: ghcr.io/riverqueue/riverui:0.3
-    environment:
-      - DATABASE_URL=postgres://ganymede:DB_PASSWORD@ganymede-db:5432/ganymede-prd # update with env settings from the ganymede-db container. If you're using the default database settings then just update the DB_PASSWORD env var.
-    ports:
-      - 4804:8080
+      - 4801:5432
+    restart: unless-stopped
+    healthcheck:
+      test: ["CMD-SHELL", "pg_isready", "-d", "{{ ganymede_db_name }}"]
+      interval: 30s
+      timeout: 60s
+      retries: 5
+      start_period: 60s

The Frontend is no longer available to run standalone. If this is something you would still like to do, open an issue. Additionally I no longer recommend using Nginx. If you still would like to, add the CDN_URL to the Ganymede service environment variables.

This will hopefully be the final "breaking" change to the compose file as I don't plan on adding any additional logic that cannot run in the Ganymede container.

Clip Archiving

The first iteration of clip archiving is here. This can be configured for a watched channel allowing archiving the top number of clips the past interval days.

ganymede_watched_clips

Additionally this means you can archive clips by providing the clip URL or ID on the archive page.

When watching a clip and if the video is also archived, a button will appear that takes you to the clip's position in the video.

ganymede_go_to_clip

If a video has clips related to it they will appear under the video player.

ganymede_below_player

Frontend Rewrite

The frontend has been entirely rewritten. The UI is mostly the same still, mainly cleaning up the code. The video chat player has been entirely removed. The performance of the "real time" chat player should be much better in v4.

readme_landing

Ganymede.Demo.V4.mp4

Video Thumbnail Sprites

Archived Twitch VODs will now download the "sprite thumbnails" if the VOD as them available. This provides a quick glance at any given position in a video.

ganymede_sprite_thumbnails

An EXPERIMENTAL feature is also available to generate the "sprite thumbnails" for live stream, clips, or VODs that do not have sprite thumbnails from Twitch. To generate the sprites click the button in the video menu.

image

Generating sprites will take a few minutes for longer videos. This is not CPU intensive. During this experimental phase only one of these tasks is allowed to run at once. Vising the new "tasks" tab in the Frontend for more information.

An Admin task also exists to generate "sprite thumbnails" for all videos.

image

There isn't any automation for this yet as it is still experimental. Once I am happy with this feature it will be automated and run after every video archive.

Chat Histogram

Below the video player a chat histogram is available. This provides a way to quickly pinpoint exciting parts of streams (assuming comment count is related to that). This can be optionally disabled in your user settings.

chat_histogram

Other Miscellaneous Change s

  • Replace JWT for Session based authentication
    • You can safely remove the JWT* environment variables from the Ganymede server
  • Normalize API responses. API responses will now look like the following.
{
  "success": false, // boolean of operation status
  "data": null, // the data of the request, usually an object or array
  "message": "updated video" // brief message of the request/operation
}

What's Changed

  • add environment variable to enable/disable path migration at startup by @Entrivax in #537
  • feat: v4 by @Zibbp in #548

Full Changelog: v3.1.0...v4.0.0

v3.1.0

11 Nov 01:29
528562b
Compare
Choose a tag to compare

What's Changed

Features

Multistream

Huge thanks to @Entrivax for contributing this feature. See a full demonstration here: https://www.youtube.com/watch?v=aKQGbw2gb70.

Videos added to the same playlist can be viewed together in a "multistream" layout allowing you to see each stream's perspective, synced up. Non-livestreams use the streamed_at field while livestreams use the created_at field to determine the initial timing in the timeline.

Multistream.Demo.mp4

New Contributors

Full Changelog: v3.0.2...v3.1.0

v3.0.2

28 Sep 18:58
Compare
Choose a tag to compare

Fixes

  • Re-add database SSL support @Zibbp in #508.
  • Fix needing to restart container when changing application settings (Admin > Settings).
    • The worker process now correctly loads the config from file when needing to fetch a config value preventing the need to restart the API container.

What's Changed

  • build(deps): bump golang.org/x/oauth2 from 0.21.0 to 0.22.0 by @dependabot in #486
  • build(deps): bump github.com/go-jose/go-jose/v4 from 4.0.3 to 4.0.4 by @dependabot in #488
  • build(deps): bump github.com/prometheus/client_golang from 1.19.1 to 1.20.2 by @dependabot in #494
  • build(deps): bump github.com/riverqueue/river/rivertype from 0.11.2 to 0.11.4 by @dependabot in #495
  • build(deps): bump github.com/riverqueue/river from 0.11.2 to 0.11.4 by @dependabot in #496
  • build(deps): bump github.com/testcontainers/testcontainers-go/modules/postgres from 0.32.0 to 0.33.0 by @dependabot in #499
  • build(deps): bump golang.org/x/oauth2 from 0.22.0 to 0.23.0 by @dependabot in #503
  • build(deps): bump github.com/jackc/pgx/v5 from 5.6.0 to 5.7.0 by @dependabot in #502
  • feat: re-add database ssl support by @Zibbp in #508

Full Changelog: v3.0.1...v3.0.2

v3.0.1

19 Aug 22:06
41dd30e
Compare
Choose a tag to compare

Important

If you have not upgraded to v3.0.0 yet see the release notes for upgrade instructions!

What's Changed

  • build(deps): bump golangci/golangci-lint-action from 6.0.1 to 6.1.0 by @dependabot in #479
  • build(deps): bump golang.org/x/crypto from 0.25.0 to 0.26.0 by @dependabot in #481
  • build(deps): bump github.com/docker/docker from 27.0.3+incompatible to 27.1.1+incompatible by @dependabot in #480
  • fix arm64 builds by @Zibbp in #484
    • arm64 images will now work with the :latest tag

Full Changelog: v3.0.0...v3.0.1

v3.0.0

11 Aug 00:45
e03616e
Compare
Choose a tag to compare

Important

Version 3.0.0 includes numerous breaking changes that are not backwards compatible!

Features and Changes

  • Replace Temporal with a simpler task system: River.
    • Temporal provided a lot of nice features but ultimately is too difficult for a selfhosted application. Using a simpler task system with custom workflows allows for more customization.
    • Bring back the ability to restart any task from the queue page (except for live video and chat downloads).
      • This brings back the possibility to pull a new version of Ganymede to resolve an issue and then re-run failing archive tasks.
      • image
    • Migrate all but one scheduled tasks to River. The live channel check is not run in River as that will just pollute the queue and some users have a very low interval configured.
    • Optionally deploy River WebUI for a look into the tasks queue
      • image
    • Archive tasks have a heartbeat. If the task times out (crashes, Ganymede restarts, etc) a watchdog will attempt to re-queue the task.
      • Livestream video and chat downloads are not retried, instead they are cancelled and the subsequent workflows (post-process video and convert chat) started.
  • Add support to customize all the directories inside the container using environment variables (#337).
    • On start a migration function will check if the paths change. If a change is detected it will attempt to update all paths in the database.
  • Category restrictions can now optionally be applied to live streams.
    • On each channel check, the category of the live stream is compared against the list of categories configured in the watched channel settings. If a match is found then the stream is archived. It will not detect if the channel switches to a different category after the live stream archive is created. If this is something that interests you let me know!
    • image
  • Add a "Blocked VODs" page in the admin panel.
    • Video IDs can be blocked from being archived.
  • Ability to cancel a VOD archive in-progress.
    • Optionally can delete the video along with the video files.
    • Optionally can block the video ID from future archives.
  • Add a button to regenerate the static thumbnail for videos.
    • A tasked is queued which uses ffmpeg to extract a screenshot at a random position for the full resolution thumbnail along with the web thumbnail.
    • Browsers along with the nginx config aggressively cache thumbnails so a hard reload may be required to see the updated thumbnail.
    • image

Notable Changes

Important changes that don't break functionality.

  • The ganymede-nginx container isn't required anymore. The API container will serve the static files at the VIDEO_DIR env var route. Example: VIDEO_DIR=/data/videos then it would be available at localhost:4800/data/videos. There is no index so you can't browse files. Updating the frontend CDN_URL to localhost:4800/data/videos is the same as serving the files via Nginx.
    • I recommend still using Nginx, it provides caching and sets headers so your browser caches important images like thumbnails. This is mainly for people who don't like running a lot of containers.

Breaking Changes

  • Completely different worker system (requires changes to the compose file)
    • Remove temporal containers
    • Add a new river-ui container
  • Moved the following settings from the config.json to environment variables (set these as environment variables on the api container)
    • DEBUG
    • OAUTH_ENABLED
  • Added environment variables to change the paths of important directory inside the container. Changing these will require changing the mounted volumes.
    • VIDEOS_DIR
    • TEMP_DIR
    • CONFIG_DIR
    • LOGS_DIR
      The defaults of these are:
	VideosDir string `env:"VIDEOS_DIR, default=/data/videos"`
	TempDir   string `env:"TEMP_DIR, default=/data/temp"`
	ConfigDir string `env:"CONFIG_DIR, default=/data/config"`
	LogsDir   string `env:"LOGS_DIR, default=/data/logs"`
  • **You will need to update the paths for your containers to match these new defaults, or override the default by specifying the path in the environment variables. Example:
volumes:
-   - /mnt/nas/vods:/vods
+  - /mnt/nas/vods:/data/videos
-   - ./logs:/logs
+  - ./logs:/data/logs
+  - ./temp:/data/temp
+  - ./config:/data/config # be sure to move `config.json` if needed
  • I recommend mounting the TEMP_DIR as a volume so temporary files are not lost on container restart. See the below docker-compose diff for an example.

Updating Your Instance to v3.0.0

Important

BACK UP YOUR CURRENT INSTANCE, INCLUDING THE DATABASE!!!

The upgrade is non-reversible. Be sure to create a backup of the database if something goes wrong. Rely on your standard backup procedure or create a database dump by running the following command.

docker exec ganymede-db pg_dump -U ganymede ganymede-prd | gzip > /tmp/dump.sql.gz

Upgrade Steps

Wait until you have no active archives. There is no archive comparability between versions!

It may be simpler to start with a fresh and updated docker-compose.yml file. You will need to update the paths and any env vars from your old compose file.

  1. Bring down all containers docker compose down
  2. Make modifications to the docker-compose.yml file. Optionally you can start with a fresh docker-compose.yml file. Be sure to update the volume mounts to account for the new *_DIR variables.
    1. Perform the changes to your docker-compose.yml outlined in the breaking changes section above. This includes...
    2. Removing the temporal containers, and any references to it.
    3. Optionally update the paths in the VIDEOS_DIR and TEMP_DIR environment variable. I recommend mounting the TEMP_DIR to a volume on your host. This is to prevent losing data if the container crashes or restarts. Any modification to these variables requires changing the volume mounts as well.
    4. Adding the river-ui container
version: "3.3"
services:
  ganymede-api:
    container_name: ganymede-api
    image: ghcr.io/zibbp/ganymede:latest
    restart: unless-stopped
    depends_on:
-      - ganymede-temporal
+      - ganymede-db
    environment:
      - TZ=America/Chicago # Set to your timezone
+      - DEBUG=false # set to true for debug logs 
+      - VIDEOS_DIR=/data/videos
+      - TEMP_DIR=/data/temp
+      - LOGS_DIR=/data/logs
+      - CONFIG_DIR=/data/config
      - DB_HOST=ganymede-db
      - DB_PORT=5432
      - DB_USER=ganymede
      - DB_PASS=PASSWORD
      - DB_NAME=ganymede-prd
      - DB_SSL=disable
      - JWT_SECRET=SECRET
      - JWT_REFRESH_SECRET=SECRET
      - TWITCH_CLIENT_ID=
      - TWITCH_CLIENT_SECRET=
      - FRONTEND_HOST=http://IP:PORT
-      - COOKIE_DOMAIN=http://domain.com
      # OPTIONAL
+     # - OAUTH_ENABLED=false
      # - OAUTH_PROVIDER_URL=
      # - OAUTH_CLIENT_ID=
      # - OAUTH_CLIENT_SECRET=
      # - OAUTH_REDIRECT_URL=http://IP:PORT/api/v1/auth/oauth/callback # Points to the API service
-     - TEMPORAL_URL=ganymede-temporal:7233
      # WORKER
      - MAX_CHAT_DOWNLOAD_EXECUTIONS=2
      - MAX_CHAT_RENDER_EXECUTIONS=2
      - MAX_VIDEO_DOWNLOAD_EXECUTIONS=3
      - MAX_VIDEO_CONVERT_EXECUTIONS=2
    volumes:
-   - /mnt/nas/vods:/vods
+   - /mnt/nas/vods:/data/videos
-   - ./logs:/logs
+   - ./logs:/data/logs
+   - ./temp:/data/temp
+   - ./config:/data/config # be sure to move `config.json` if needed
    ports:
      - 4800:4000
  ganymede-frontend:
    container_name: ganymede-frontend
    image: ghcr.io/zibbp/ganymede-frontend:latest
    restart: unless-stopped
    environment:
      - API_URL=http://IP:PORT # Points to the API service
      - CDN_URL=http://IP:PORT # Points to the CDN service
      - SHOW_SSO_LOGIN_BUTTON=true # show/hide SSO login button on login page
      - FORCE_SSO_AUTH=false # force SSO auth for all users (bypasses login page and redirects to SSO)
      - REQUIRE_LOGIN=false # require login to view videos
    ports:
      - 4801:3000
-  ganymede-temporal:
-    image: temporalio/auto-setup:1.23
-    container_name: ganymede-temporal
-    depends_on:
-      - ganymede-db
-    environment:
-      - DB=postgres12 # this tells temporal to use postgres (not the db name)
-      - DB_PORT=5432
-      - POSTGRES_USER=ganymede
-      - POSTGRES_PWD=PASSWORD
-      - POSTGRES_SEEDS=ganymede-db # name of the db service
-    ports:
-      - 7233:7233
-  # -- Uncomment below to enable temporal web ui --
-  # ganymede-temporal-ui:
-  #   image: temporalio/ui:latest
-  #   container_name: ganymede-temporal-ui
-  #   depends_on:
-  #     - ganymede-temporal
- #   environment:
-  #     - TEMPORAL_ADDRESS=ganymede-temporal:7233
-  #   ports:
-  #     - 8233:8080
  ganymede-db:
    container_name: ganymede-db
    image: postgres:14
    volumes:
      - ./ganymede-db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=PASSWORD
      - POSTGRES_USER=ganymede
      - POSTGRES_DB=ganymede-prd
    ports:
      - 4803:5432
  ganymede-nginx: # this isn't necessary if you do not want to serve static files via Nginx. The API container will serve the `VIDEO_DIR` environment variable.
    container_name: ganymede-nginx
    image: nginx
    volumes:
      - /path/to/ng...
Read more

v2.3.2

15 Jun 22:02
4825322
Compare
Choose a tag to compare

Tip

Now is the best time to switch back to the :latest image tags if you are on :main for testing.

v2.3.2

Important

Required Change!

The following changes must be made to your docker-compose.yml file if you have not already done so. Do not make this change if you have archives running. Wait until nothing is being archived then perform the changes. See #441 for more information.

  ganymede-temporal:
-   image: temporalio/auto-setup:1
+   image: temporalio/auto-setup:1.23
    container_name: ganymede-temporal
    depends_on:
      - ganymede-db
    environment:
-     - DB=postgresql # this tells temporal to use postgres (not the db name)
+     - DB=postgres12 # this tells temporal to use postgres (not the db name)
      - DB_PORT=5432
      - POSTGRES_USER=ganymede
      - POSTGRES_PWD=PASSWORD

Features

Audio Only

Support for audio-only archives.
image

Bug Fixes

A bunch of bug fixes are included in this release, most important are #437 and #413.

What's Changed

  • feat: audio only archive support by @Zibbp in #431
  • build(deps): bump go.temporal.io/api from 1.32.0 to 1.34.0 by @dependabot in #432
  • build(deps): bump golangci/golangci-lint-action from 4.0.0 to 6.0.1 by @dependabot in #428
  • build(deps): bump github.com/go-playground/validator/v10 from 10.19.0 to 10.20.0 by @dependabot in #421
  • feat(archive): chat conversion improvements by @Zibbp in #433
  • fix(archive): delete postprocessed video file after converting to hls by @Zibbp in #438
  • feat(activities): handle and kill multiple chat process ids by @Zibbp in #439
  • fix(docker): pin temporal image by @Zibbp in #440
  • fix: re-add tasks by @Zibbp in #442

Full Changelog: v2.3.1...v2.3.2

v2.3.1

17 May 23:46
Compare
Choose a tag to compare

Tip

Now is the best time to switch back to the :latest image tags if you are on :main for testing.

What's Changed

  • Update TwitchDownloader version to fix new VOD ids being greater than what int32 supports lay295/TwitchDownloader#1057

    • You may need to restart the ArchiveTwitchChatWorkflow for any failed archives. Restarting ArchiveTwitchChatWorkflow will restart the entire chat archive flow (download, render, and move). To restart, click the failed workflow then click the "restart" button.
    • image
  • fix : #416 oidc by @boringwolf in #417

New Contributors

Full Changelog: v2.3.0...v2.3.1

v2.3.0

25 Apr 00:32
cb42431
Compare
Choose a tag to compare

Tip

Now is the best time to switch back to the :latest image tags if you are on :main for testing.

New Features

Muted Segments

Going forward, all video (vod) downloads will also save the muted segments. These are saved to the database in the table muted_segments. They are also saved to the info.json file. These are not displayed in the frontend yet, I'm still trying to find a good way to display the segments. For now you can use the API or query the database.

/api/v1/vod/<id>?with_channel=true&with_chapters=true&with_muted_segments=true

Title Regex

Watched channels now have a new option called "title regex". Custom regex can be applied to either live streams or video downloads. This allows you to customize what is downloaded by applying regex to the title. The obvious use case is to ignore reruns as the title usually contains it, but it's all customizable to fit your needs.

To get started, edit a "watched channel" and click the plus button under Advanced > Title Regex

image

A new entry will be visible allowing you to enter a regex and apply some optional settings.

  • negative: Invert the match, meaning you do not want the regex
  • apply to video downloads: Apply the regex to video downloads. By default the regex is only applied to live streams. If this is checked then it will not be used for live streams. You need to make two regexes if you want to apply to both live stream and videos.

A title regex to not download any rerun livestreams would look like the following

image

For more information please see the wiki page https://github.com/Zibbp/ganymede/wiki/Watched-Channel-Title-Regex. If you have any useful regexes, please share in a discussion!

What's Changed

Full Changelog: v2.2.0...v2.3.0