Skip to content

Releases: Zibbp/ganymede

v1.2.3 - Maintenance

07 Feb 14:43
Compare
Choose a tag to compare

What's Changed

Fixes

  • fix(live): use cursor var
    • Archiving a channel's videos that has more than 100 videos now properly works.

API Docs

Swagger API docs have been implemented. I will try to keep these up to date. To view the docs visit the API container http://IP:PORT/swagger/index.html.

Maintenance

This release is mainly focused on cleaning up and improving the CI process. Linting has been added locally and as a CI job. Basic unit tests have also been added. These tests do not cover any Twitch integrations yet.

Full Changelog: v1.2.2...v1.2.3

v1.2.2 - ARM Build Fix

25 Jan 20:57
af71e01
Compare
Choose a tag to compare

What's Changed

  • ops(action): overhaul build action by @Zibbp in #95
    • Images now use a single manifest with different architecture types. Visit the PR for more information.
  • build(deps): bump entgo.io/ent from 0.11.6 to 0.11.7 by @dependabot in #94

Full Changelog: v1.2.1...v1.2.2

v1.2.1 - ARM Builds

24 Jan 23:45
3cad053
Compare
Choose a tag to compare

What's Changed

  • Tests by @Zibbp in #88
  • build(deps): bump entgo.io/ent from 0.11.5 to 0.11.6 by @dependabot in #89
  • build(deps): bump github.com/spf13/viper from 1.14.0 to 1.15.0 by @dependabot in #90
  • Create Dockerfile.aarch64 by @Smallinger in #87
  • fix: use "render_chat" variable when archiving videos from a watched channel 2c32b7b.

ARM Builds

With every new release an ARM64 image is built with a tag of :latest-arm64. This includes both the API and frontend images. Thanks to @Smallinger for PR.

New Contributors

Full Changelog: v1.2.0...v1.2.1

v1.2.0 - Watched Channel Sub Only Video

20 Jan 20:27
Compare
Choose a tag to compare

What's Changed

  • Watched channels subscriber only videos by @Zibbp in #83
  • Add another fallback font cffa1ca.

Features

Pull Request #83 adds a field when adding a watched channel enabling the option of downloading "subscriber-only" videos. Previously this was not checked for when archiving a channel's videos. This resulted in those videos failing in the queue. If the option is disabled (default) any video that has a "sub-only" restriction provided by Twitch's GraphQL API will be skipped.

image

Full Changelog: v1.1.9...v1.2.0

v1.1.9 - Improvements

16 Jan 21:32
Compare
Choose a tag to compare

Changes

  • VOD pagination route now accepts video types 206bcbb.
  • Add optional caption_path database column e319030.
  • Add back some of the fallback fonts d678d14.

Features

Video Type Filtering

When viewing a channel's videos a new multi-select dropdown is available which allows filtering by video types (archive, live, highlight, upload, or clip).
image
image

Video Player

This release moves the video player to VideoJS. There was some issues with the recently implemented Ovenplayer. VideoJS is also a more mature and has a larger community.

Captions Path

An optional caption_path field has been added to video database entries. Twitch has no captions for live streams but I was tinkering with Whisper to create vtt caption files for different video and audio files. I supplied Whisper with an archive video and it did a great job at transcribing the audio to a vtt caption file. The file was placed in the video directory and I populated the caption_path in Admin > Settings. If the caption_path is populated the video player will load the captions.
ganymede-captions

I will not be adding functionality to generate captions after an archive completed. This something you will need to script, possibly using the success webhooks to trigger a job.

v1.1.8 - Fixes & Video Download Token

15 Jan 01:34
Compare
Choose a tag to compare

Changes

  • Switch back to the main chat-downloader repository 16afe24.
  • Create Twitch token config entry b33a17e.
  • Use Twitch token for VOD/video downloads, this allows sub-only downloads c800041.
  • Fix: Check if pos2+1 is out of bounds for emotes 2ff1efb. Fixes #79

v1.1.7 Storage Templates & Chat Render Option

11 Jan 16:29
c875d2b
Compare
Choose a tag to compare

What's Changed

Frontend

Storage Templates

Storage templates allows users to customize how folders and files are named. Previously folders were created using the naming scheme of {id}-{uuid}. Now this can be customized. To get started customizing the storage templates navigate to Admin > Settings and click the "Storage Template Settings" button. Here you are able to customize templates for folders and files. Any template changes apply only for new files. To apply your current storage templates to existing files, execute the "storage migration" task at Admin > Tasks. More information about this can be found on the storage template wiki page. One requirement of the folder template is {{uuid}} must be included somewhere in the template. This is to ensure unique folders for each archive so file do not get accidently overwritten.
image

Render Chat Option

When manually archiving a video or using the "watched channels" feature, an option has been added to disable chat rendering. This feature allows users to skip the chat rendering task while still downloading the chat json file. Chat rendering is enabled by default and you will need to disable it for every archive if you wish to not have the chat rendered.
image

Full Changelog: v1.1.6...v1.1.7

v1.1.6 - Performance Improvements and Optimizations

09 Jan 18:14
Compare
Choose a tag to compare

Changes

API

  • Chat playback now uses embedded badges if available in the chat file 053ae5c.
    • If both emotes and badges are embedded in a chat file, no requests to Twitch or any other external services is called when watching a video.
    • Use channel's specific badges instead of global versions in 53edd7b.
  • Improve performance of real time chat playback routes ebb4b4b.
    • Before this release, playback of large chat files would be slow and consume a lot of memory.
    • Improvements:
      • Revert back to Go's encoding/json package for better memory management.
      • Chat comments are sorted and stored in the cache using an interface on the initial request.
        • Before the comments were stored as a byte which needed to be unmarshalled each time which was terrible for performance.
      • A binary search is now used to find the index of a comment that is closest to the request offset time.
        • Before the comments were looped through to find the requested time. This was not efficient for large chat files.
      • The chat comment cache has a 10 minute expiration time that is refreshed each time a route that uses it is called.
      • The badge and emote routes have been improved to handle memory better.

Frontend

  • Add "loading chat" text when the real time chat player is loading Zibbp/ganymede-frontend@aff4dd0.
  • Add placeholder images for video thumbnails and channel profile images Zibbp/ganymede-frontend@666f657.
    • A blank image is used as a placeholder while the thumbnail is loading.
    • This results in a more pleasant experience when loading images as content is not jumping all over the page.
  • Styling fixes on the admin "watched channels" page Zibbp/ganymede-frontend@9d30103.

Information about Performance Improvements

How the real time chat player works

When navigating to a video to playback, the first two requests the real time chat player makes is for the emotes and badges. Each one of these requests opens the chat file and checks if there are embedded emotes and badges. If embedded images are found, those are sent back to the frontend chat player. If no images are found, the emotes or badges are fetched from various providers. This process, especially extracting the embedded images results in a temporary increase of ram usage as it has to load a large chat file (250mb) into memory and extract/process the embedded images which is a majority of the chat file size. Once the image are sent back to the client Go's garbage collector will free up the memory when it sees fit.

After the emotes and badges are loaded into the player, the first comments are fetched. Comments are fetched in interval of 10 seconds using this API route /api/v1/vod/id/chat?start=0&end=10. In the backend, this route will check if the comments are stored in the cache. If they are not then the chat file is opened, comments extracted, formatted, and placed into the cache for subsequent requests. Once placed or read from the cache, a binary search is used to find a comment's index which is closest to the requested start location. The index is then used to iterate up until the end location is satisfied.

Performance numbers

This test occurred locally using a 251mb chat file which has 3,379 embedded images.

Endpoint used: /chat/seek?start=12352&count=30.

Old Performance:

Initial Request: 19.5 seconds
Cached Requests: ~8 seconds

New Performance:

Initial Request: 17.4 seconds
Cached Requests: 50-60 milliseconds.

With a ~3x reduction of memory usage.

Summary

The initial chat request when starting a real time chat playback will still take some time as it has to open, unmarshall, and sort the 10's of thousands of comments. Once that is complete the comments are stored in a 10 minute cache. Any subsequent request that uses that chat file will pull the comments from the chat resulting in <100 millisecond response times of the requested chat comments.

Notice any issues or bugs with this release? Please open an issue.

Full Changelog: v1.1.5...v1.1.6

v1.1.5 - New Player & HLS Support

06 Jan 21:06
e2803f0
Compare
Choose a tag to compare

What's Changed

  • New Video Player Zibbp/ganymede-frontend@075fe19.
    • Now using OvenPlayer.
    • Better support for HLS playlists.
    • The chat player still uses Plyr for now.
  • Add an option to convert the archived video from mp4 to a HLS playlist 0e8803e.
    • Disabled by default. This setting can be enabled at Admin > Settings.
    • The conversion takes place during the "Video Convert" queue job.
    • The mp4 is deleted and not moved to the final destination as to avoid having two identical large video files in two formats.
    • This option is useful if you publicly host Ganymede. It will significantly decrease the initial load time of the video.
      • A basic test of restricting the browser to 50mb/s loading a 20gb video.
        • MP4 - 10 seconds until playable.
        • HLS - 1.8 seconds until playable.
    • Not of much significance if you only use Ganymede on your LAN as the load times between an HLS playlist and large MP4 is under a second.
    • M3U8 file and segments are stored in a sub folder with a naming scheme of externalId-video_hls.
  • Bump frontend packages Zibbp/ganymede-frontend@631dd19.

v1.1.4 - API Static Files

03 Jan 17:46
Compare
Choose a tag to compare

Changes

  • feat(http): allow the api to serve static files in 3f0b230.
    • This change allows the API container to serve static files similar to the Nginx container. The Nginx container will still be preferred, this is for users who wish to not use the Nginx container or have issues with it. To use in place of the Nginx container, set the frontend environment variable CDN_URL to be equal the API host with /static at the end like so: http://192.168.1.150:4800/static.