ErsatzTV

Stream custom live channels using your own media

ZLIB License

Stars
1.2K

Bot releases are hidden (Show)

ErsatzTV - v0.8.7-beta Latest Release

Published by jasongdove 4 months ago

Release Notes

Added

  • Add Active Date Range to block playout template editor to allow limiting templates to a specific date range
    • This is year-agnostic, meaning the Month/Day range will apply to every year
    • This also supports wrapping the end of the year (e.g., start 12/1 and end 1/15)
  • Add new Deco system for "decorating" channels with non-primary content
    • Decos currently contain
      • Watermarks
      • Dead Air Fallback (i.e. fallback filler)
    • Similar to blocks, decos have deco groups for organization
    • Similar to blocks, decos have deco templates for filling a "day" with decos
    • In the playout template editor, playout template items can have both a block template and a deco template
      • This allows watermarks and dead air fallback to change at different times than primary content
    • Block playouts can also have a default deco
      • This will apply whenever a deco template is missing, or when a deco template item cannot be found for the current time
      • Effectively, this sets a default watermark and dead air fallback for the entire playout
  • Add XMLTV Days To Build setting, which is distinct from the existing Playout Days To Build setting
    • The value for XMLTV Days To Build cannot be larger than Playout Days To Build
    • This allows, for example, a week of playout data while optimizing XMLTV data to only a day or two
  • Add health check to detect config folder issue on MacOS
    • ETV versions through v0.8.4-beta (using dotnet 7) stored config data in $HOME/.local/share/ersatztv
    • ETV versions starting with v0.8.5-beta (using dotnet 8) store config data in $HOME/Library/Application Support/ersatztv
    • If a dotnet 8 version of ETV has NOT been launched on MacOS, it will automatically migrate the config folder on startup
    • If a dotnet 8 version of ETV has been launched on MacOS, a failing health check will display with instructions on how to resolve the config issue to restore data
  • Add Video Profile setting to FFmpeg Profile editor when h264 format is selected
  • Add Video Preset setting to FFmpeg Profile editor for some combinations of acceleration and video format:
    • Nvenc / h264
    • Nvenc / hevc
    • Qsv / h264
    • Qsv / hevc
    • None / h264
    • None / hevc
  • Add experimental list type Playlist
    • Playlists contain an ordered list of:
      • Collections
      • Multi-Collections
      • Smart Collections
      • TV Shows
      • TV Seasons
      • Artists
      • Movies
      • Episodes
      • Music Videos
      • Other Videos
      • Songs
      • Images
    • Playlists can be added to schedules as a schedule item
    • Each time through the playlist, one item will be scheduled from each playlist item (if Play All is unchecked)
      • NB: This does not mean every collection will always schedule one item; the normal flood playout restrictions like duration and fixed start times still apply here
    • If Play All is checked, that playlist item will play all of its items each time through the playlist
      • This can be helpful if you want to play entire collections in a specific order, e.g.
        • Every episode from Show 1 Season 2
        • Every episode from Show 2 Season 3
        • Every episode from Show 1 Season 3
    • Playlist items with fewer media items will be re-shuffled (if applicable) before those with more media items
  • Add two new environment variables to customize config and transcode folder locations
    • ETV_CONFIG_FOLDER
    • ETV_TRANSCODE_FOLDER
  • Add checkbox to allow use of B-frames in FFmpeg Profile (disabled by default)

Fixed

  • Fix some cases of 404s from Plex when files were replaced and scanning the library from ETV didn't help
  • Fix more wildcard search phrase queries (when wildcards are used in quotes, like title:"law & order*")
  • Fix non-wildcard simple queries when asterisks are used in quotes, like title:"m*a*s*h"
  • Fix bug where channels would unnecessarily wait on each other
    • e.g. in-progress streams would delay responding with a playlist when new streams were starting
  • Update Plex show title in ETV when changed in Plex
  • Reindex seasons and episodes when show is updated from media server
    • This is needed to keep show_* tags accurate in the search index (e.g., show_title, show_studio)
  • Fix external subtitle detection to support forced/sdh subtitles with language tag before and after forced/sdh tag:
    • Something.forced.en.srt
    • Something.sdh.en.srt
    • Something.en.forced.srt
    • Something.en.sdh.srt
  • Fix playback from Jellyfin 10.9 by allowing playlist HTTP HEAD requests
  • Fix HLS Segmenter V2 segment duration (previously 10s, now 4s)
  • Fix HLS Segmenter V2 error video generation
  • Fix MySql database migrations
  • Fix Plex library scans with MySql/MariaDB
  • Fix block playout playback when no deco is configured
  • Fix HLS Segmenter V2 to delete old segments (use less disk space while channel is active)
  • Fix template and deco template editors to prevent items that go beyond midnight
  • Fix block playout random seeds
    • Different blocks within a single playout will now correctly use different random seeds (shuffles)
    • Erasing block playout history will also generate new random seeds for the playout
  • Fix building playouts that use mid-roll filler and have content without chapter markers
    • When this happens, mid-roll will be treated as post-roll
  • Fix VAAPI decoder capability check
    • This caused some streams to incorrectly use software decoding
  • Fix scheduling loop/failure caused by some duration schedule items
  • Fix video_bit_depth search field for Plex media
  • Fix template and deco template editors with MariaDB/MySql backend
  • Fix transcoding 10-bit source content using QSV acceleration on Windows

Changed

  • Show health checks at top of home page; scroll release notes if needed
  • Improve HLS Segmenter V2 compliance by:
    • Serving fmp4 segments when hevc video format is selected
      • 1.5. The container format for HEVC video MUST be fMP4.

    • Using accurate BANDWIDTH value in multi-variant playlist
    • Using proper MIME types for statically-served .m3u8 and .ts files
    • Serving playlists with gzip compression
  • Use HLS Segmenter V2 for channel preview when channel is configured for HLS Segmenter V2
  • Detect and use /dev/dri/card* devices in addition to /dev/dri/render* devices
  • Change default folder locations in docker using new environment variables
    • ETV_CONFIG_FOLDER - now defaults to /config
    • ETV_TRANSCODE_FOLDER - now defaults to /transcode
    • If the old locations are still present in docker, these variables will be ignored, so you can migrate at your own pace
      • Old config location: /root/.local/share/ersatztv
      • Old transcode location: /root/.local/share/etv-transcode
ErsatzTV - v0.8.6-beta

Published by jasongdove 7 months ago

Release Notes

Added

  • Add show_studio and show_content_rating to search index for seasons and episodes
  • Add two new global subtitle settings:
    • Use embedded subtitles
      • Default value: true
      • When disabled, embedded subtitles will not be considered for extraction (text subtitles), or playback (all embedded subtitles)
    • Extract and use embedded (text) subtitles
      • Default value: false
      • When enabled, embedded text subtitles will be periodically extracted, and considered for playback
  • Add sub_language and sub_language_tag fields to search index
  • Add /iptv request logging in its own log category at debug level
  • Add channel guide (XMLTV) template system
    • Templates should be copied from _channel.sbntxt, _movie.sbntxt, _episode.sbntxt, _musicVideo.sbntxt, _song.sbntxt, or _otherVideo.sbntxt which are located in the config subfolder templates/channel-guide
      • Copy the file, remove the leading underscore from the name, and only make edits to the copied file
    • The default templates will be extracted and overwritten every time ErsatzTV is started
    • The templates use scribian template syntax
    • The templates contain comments describing which fields are available for use in the templates
  • Add experimental and incomplete Images library kind
    • Image libraries have fallback metadata added like Other Video libraries (every folder is a tag)
    • Image library items currently default to a duration of 15 seconds
      • The Media > Images page can be used to configure image durations at a folder level
      • Child folders with unset durations will inherit the closest ancestor's duration
  • Add experimental new streaming mode HLS Segmenter V2
    • In my initial testing, this streaming mode produces significantly fewer playback warnings/errors
    • If it tests well for others, it may replace the current HLS Segmenter in a future release
  • Add setting to change XMLTV data from Local time zone to UTC
    • This is needed because some clients (incorrectly) ignore time zone specifier and require UTC times
  • Support .ogv video files in local libraries

Fixed

  • Fix antiforgery error caused by reusing existing browser tabs across docker container restarts
    • Data protection keys will now be persisted under ErsatzTV's config folder instead of being recreated at startup
  • Fix bug updating/replacing Jellyfin movies
    • A deep scan can be used to fix all movies, otherwise any future updates made to JF movies will correctly sync to ETV
  • Automatically generate JWT tokens to allow channel previews of protected streams
  • Fix bug applying music video fallback metadata
  • Fix playback of media items with no audio streams
  • Fix timestamp continuity in HLS Segmenter sessions
    • This should make some clients happier
  • Fix Other Video, Song and Image fallback metadata tags to always include parent folder (folder added to library)
  • Allow playback of items with any positive duration, including less than one second
  • Fix VAAPI transcoding of OTA content containing A53 CC data
  • Fix AV1 software decoder priority (libdav1d, libaom-av1, av1)
  • Fix some stream failures caused by loudnorm filter
  • Fix multi-collection editor improperly disabling collections/smart collections that haven't already been added to the multi-collection
  • Fix path replacement logic when media server paths use inconsistent casing (e.g. \\SERVERNAME AND \\ServerName)
  • Fix many search queries, including actors with the name Will
  • Fix sqlite database is locked error that would crash ETV on startup after search index corruption
  • Fix bug where replacing files in Plex would be missed by subsequent ETV library scans
    • This fix will require a one-time re-scan of each Plex library in full
    • After the initial full scan, incremental scans will behave as normal
  • Fix edge case where some local episodes, music videos, other videos, songs, images would not automatically be restored from trash
  • Fix MPEG-TS playback when JWT tokens are enabled for streaming endpoints

Changed

  • Log search index updates under scanner category at debug level, to indicate a potential cause for the UI being out of date
  • Batch search index updates to keep pace with library scans
    • Previously, search index updates would slowly process over minutes/hours after library scans completed
    • Search index updates should now complete at the same time as library scans
  • Do not unnecessarily update the search index during media server library scans
  • Use different library for reading song metadata that supports multiple tag entries
  • Update /iptv routing to make UI completely inaccessible from that path prefix
  • Use CUDA 11 instead of CUDA 12 in NVIDIA docker image to significantly lower required driver version
  • Allow block durations with 5-minute increments (e.g., 5 min, 10 min, 15 min, etc.)
ErsatzTV - v0.8.5-beta

Published by jasongdove 9 months ago

Release Notes

Added

  • Respect browser's Accept-Language header for date time display
  • Add new schedule item setting Fill With Group Mode
    • This setting is only available when a Collection, Multi-Collection or Smart Collection is scheduled with Duration or Multiple playout modes
    • Use this setting when you want to schedule a collection containing groups (show or artists), with only videos from a single group (show or artist) being used in each rotation
    • The options are None, Ordered Groups and Shuffled Groups:
      • None: no change to scheduling behavior - all groups (shows and artists) will be shuffled/ordered together
      • Ordered Groups: each time this item is scheduled, the entire Duration or Multiple will be filled with a single group, and the groups will rotate in a fixed order
      • Shuffled Groups: each time this item is scheduled, the entire Duration or Multiple will be filled with a single group, and the groups will rotate in a shuffled order
  • Add new playout type External Json
    • Use this playout type when you want to manage the channel schedule using DizqueTV
    • You must point ErsatzTV to the channel number json file from DizqueTV, e.g. channels/1.json
    • For playback, ErsatzTV will first check for the appropriate media file file locally
      • If found, ErsatzTV will run ffprobe to get statistics immediately before streaming from disk
    • When local files are unavailable, ErsatzTV must be logged into the same Plex server as DizqueTV
      • ErsatzTV will ask Plex for statistics immediately before streaming from Plex
  • Add new experimental playout type Block
    • This playout type is under active development and updates may reset or delete related playout data
    • Many planned features are missing, incomplete, or result in errors. This is expected.
    • Block playouts consist of:
      • Blocks - ordered list of items to play within the specified duration
      • Templates - a generic "day" that consists of blocks scheduled at specific times
      • Playout Templates - templates to schedule using the specified criteria. Only one template will be selected each day
    • Much more to come on this feature as development continues
  • Show chapter markers in movie and episode media info
  • Add two new API endpoints for interacting with transcoding sessions (MPEG-TS and HLS Segmenter):
    • GET /api/sessions
      • Show brief info about all active sessions
    • DELETE /api/session/{channel-number}
      • Stop the session for the given channel number
  • Add channel preview (web-based video player)
    • Channels MUST use H264 video format and AAC audio format
    • Channels MUST use MPEG-TS or HLS Segmenter streaming modes
      • Since MPEG-TS uses HLS Segmenter under the hood, the preview player will use HLS Segmenter, so it's not 100% equivalent, but it should be representative
  • Add button to stop transcoding session for each channel that has an active session
  • Add more log levels to Settings page, allowing more specific debug logging as needed
    • Default Minimum Log Level (applies when no other categories/level overrides match)
    • Scanning Minimum Log Level
    • Scheduling Minimum Log Level
    • Streaming Minimum Log Level

Fixed

  • Fix error loading path replacements when using MySql
  • Fix tray icon shortcut to open logs folder on Windows
  • Unlock playout when playout build fails
  • Ignore errors deleting old HLS segments; this should improve stream reliability
  • Update show year when changed within Plex
  • Fix crop scale behavior with NVIDIA, QSV acceleration
  • Fix bug that corrupted uploaded images (watermarks, channel logos)
    • Re-uploading images should fix them
  • Recreate XMLTV channel list (including logos) when channels are edited in ErsatzTV
    • This bug caused the ErsatzTV logo to be used instead of channel logos in some cases
  • Update drop down search results in main search bar when items are created/edited/removed
  • Fix green line at bottom of video when NVIDIA accel is used with intermittent watermark
  • Fix error starting streaming session when subtitles are still being extracted for the current item

Changed

  • Upgrade from .NET 7 to .NET 8
  • In schedule items, disambiguate seasons from shows with the same title by including show year
    • Old format: Show Title (Season Number)
    • New format: Show Title (Show Year) - Season Number
  • Remove FFmpeg Profile Normalize Loudness option dynaudnorm as it often caused streams to fail to start
  • Disable loudness normalization by default in new FFmpeg Profiles
  • Use AAC audio format by default in new FFmpeg Profiles
ErsatzTV - v0.8.4-beta

Published by jasongdove 11 months ago

Release Notes

Fixed

  • Fix playout builder crash with improperly configured pad filler preset
  • Properly validate filler preset mode pad to require filler pad to nearest minute value
  • Fix bug where previously-synchronized collection tags would disappear
    • This bug affected Jellyfin, Emby and Plex collections
  • Fix detection of AMF hardware acceleration on Windows
ErsatzTV - v0.8.3-beta

Published by jasongdove 11 months ago

Release Notes

Added

  • Add Scaling Behavior option to FFmpeg Profile
    • Scale and Pad: the default behavior and will maintain aspect ratio of all content
    • Stretch: a new mode that will NOT maintain aspect ratio when normalizing source content to the desired resolution
    • Crop: a new mode that will scale beyond the desired resolution (maintaining aspect ratio), and crop to desired resolution
      • This mode does NOT detect black and intelligently crop
      • The goal is to fill the canvas by over-scaling and cropping, instead of minimally scaling and padding
  • Include inputstream.ffmpegdirect properties in channels.m3u when requested by Kodi
  • Log playout item title and path when starting a stream
    • This will help with media server libraries where the URL passed to ffmpeg doesn't indicate which file is streaming
  • Add QSV Capabilities to Troubleshooting page
  • Add language_tag and seconds fields to search index
  • Allow synchronizing Plex TV Show libraries that use Personal Media Shows agent
  • Include Noto CJK Fonts in docker images to support those characters in generated subtitles like songs and music video credits
  • Support show fallback metadata with folder names like Show.Name(1992)

Fixed

  • Fix playout bug that caused some schedule items with fixed start times to be pushed to the next day
  • Fix playout bug that prevented padded durations from fitting within a schedule item of the same duration
    • For example, filler that padded to 30 minutes would often not fit in a 30 minute duration schedule item
  • Fix VAAPI transcoding 8-bit source content to 10-bit
  • Fix NVIDIA subtitle scaling when scale_npp filter is unavailable
  • Remove ffmpeg and ffprobe as required dependencies for scanning media server libraries
    • Note that ffmpeg is still always required for playback to work
  • Fix PGS subtitle pixel format with Intel VAAPI
  • Fix some cases where Copy button would fail to copy to clipboard
  • Fix some cases where ffmpeg process would remain running after properly closing ErsatzTV
  • Fix QSV HLS segment duration
    • This behavior caused extremely slow QSV stream starts
  • Fix displaying multiple languages in UI for movies, artists, shows
  • Fix MySQL queries that could fail during media server library scans
  • Fix scanning Jellyfin libraries when library options and/or path infos are not returned from Jellyfin API
  • Fix error indexing music videos in File Not Found state
  • Fix bug scheduling duration filler when filler collection contains item with zero duration
  • Fix bug displaying television seasons for shows that have no year metadata

Changed

  • Upgrade ffmpeg to 6.1, which is now required for all installs
  • Use new ffmpeg throttling method to minimize cpu/gpu use without impacting audio normalization
  • Change FFmpeg Profile Normalize Loudness setting from checkbox to dropdown
    • Off: do not normalize loudness
    • loudnorm: use loudnorm filter to normalize loudness (generally higher CPU use)
    • dynaudnorm: use dynaudnorm filter to normalize loudness (generally lower CPU use)
  • Jellyfin collection scanning will no longer happen after every (automatic or forced) library scan
    • Automatic/periodic scans will check collections one time after all libraries have been scanned
    • There is a new table in the Media > Libraries page with a button to manually re-scan Jellyfin collections as needed
  • In FFmpeg Profile editor, only display hardware acceleration kinds that are supported by the configured ffmpeg
  • Test QSV acceleration if configured, and fallback to software mode if test fails
  • Detect QSV capabilities on Linux (supported decoders, encoders)
  • Use hardware acceleration for error messages/offline messages
  • Try to parse season number from season folder when Jellyfin does not provide season number
    • This may fix issues where Jellyfin libraries show all season numbers as 0 (specials)
  • Rework Plex collection scanning
    • Automatic/periodic scans will check collections one time after all libraries have been scanned
    • There is a table in the Media > Libraries page with a button to manually re-scan Plex collections as needed
    • Plex smart collections will now be synchronized as tags, similar to other Plex collections
ErsatzTV - v0.8.2-beta

Published by jasongdove about 1 year ago

Release Notes

Added

  • Automatically rebuild search index after improper shutdown
  • Add experimental support for Elasticsearch as search index backend
    • No query changes should be needed since ES is backed by lucene and supports the same query syntax
    • This can be configured using the following env vars (note the double underscore separator __)
      • ELASTICSEARCH__URI (e.g. http://localhost:9200)
      • ELASTICSEARCH__INDEXNAME (default is ersatztv)
  • Add experimental support for MySQL/MariaDB database provider
    • There is no functionality to migrate data between providers
    • This can be configured using the following env vars (note the double underscore separator __)
      • PROVIDER - set to MySql
      • MYSQL__CONNECTIONSTRING - (e.g. Server=localhost;Database=ErsatzTV;Uid=root;Pwd=ersatztv;)
  • Add option to use shared Plex servers, not just owned servers
    • This can be enabled by setting the env var ETV_ALLOW_SHARED_PLEX_SERVERS to any non-empty value
  • Show Plex server names in Libraries page

Fixed

  • Fix subtitle scaling when using QSV hardware acceleration
  • Fix log viewer crash when log file contains invalid data
  • Clean channel guide cache on startup (delete channels that no longer exist)
  • Fix Emby movie libraries so local file access is not required
  • Fix adding alternate schedule
  • Fix parsing show title from NFO file that also contains season information

Changed

  • Optimize transcoding session to only work ahead (at max speed) for 3 minutes before throttling to realtime
    • This should greatly reduce cpu/gpu use when joining a channel, particularly with long content
  • Allow manually editing (typing) schedule item fixed start time
  • Use different control for editing schedule item duration, and allow 24-hour duration
    • This is needed if you want a default/fallback alternate schedule to fill the entire day with one schedule item
    • The schedule item should have a fixed start time of midnight (00:00) and a duration of 24 hours
  • Use Direct3D 11 for QSV acceleration on Windows
ErsatzTV - v0.8.1-beta

Published by jasongdove about 1 year ago

Release Notes

Added

  • Add custom resolution management to Settings page

Fixed

  • Only allow a single instance of ErsatzTV to run
    • This fixes some cases where the search index would become unusable
  • Fix VAAPI rate control mode capability check

Changed

  • Rework startup process to show UI as early as possible
    • A minimal UI will indicate when the database and search index are initializing
    • The UI will automatically refresh when the initialization processes have completed
  • Force ffmpeg to use one thread when hardware acceleration is used since hardware acceleration does not support multiple threads
ErsatzTV - v0.8.0-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Disable playout buttons and show spinning indicator when a playout is being modified (built/extended, or subtitles are being extracted)
  • Automatically reload playout details table when playout build is complete
  • Add Discard To Fill Attempts setting to duration playout mode
    • This setting only has an effect when it's configured to be greater than zero and when using Shuffle or Random playback order
    • When the current item is longer than the remaining duration, it will be discarded and ETV will try to fit the next item in the collection, up to the configured number of times
    • When the remaining duration is shorter than all items in the collection, the normal filler logic will be used
  • Add Finish column to playout detail table

Fixed

  • Skip checking for subtitles to extract when subtitles are not enabled on a channel/schedule item
  • Properly scale subtitles when using hardware acceleration
  • Fix color normalization of content with missing color metadata when using NVIDIA acceleration
  • VAAPI: explicitly use CQP rate control mode when it's the only compatible mode
  • Fix scaling anamorphic Emby content that Emby claims is not anamorphic

Changed

  • HLS Direct streaming mode
    • Use MPEG-TS container/output format by default to maintain v0.7.8 compatibility
      • MP4 and MKV container/output format can still be configured in Settings
    • Improve MP4 compatibility with certain content
  • For Pad and Duration filler - prioritize filling the configured pad/duration
    • This will skip filler that is too long in an attempt to avoid unscheduled time
    • You may see the same filler more often, which means you may want to add more filler to your library so ETV has more options
  • Update ffmpeg, libraries and drivers in all docker images
ErsatzTV - v0.7.9-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Synchronize actor metadata from Jellyfin and Emby television libraries
    • New libraries and new episodes will get actor data automatically
    • Existing libraries can deep scan (one time) to retrieve actor data for existing episodes
  • HLS Direct streaming mode
    • Use MP4 container/output format by default, with new global option to use MKV container/output format
    • MP4 output format: stream copy dvd subtitles
    • MKV output format: stream copy any embedded subtitles

Fixed

  • Fix extracting embedded text subtitles that had been incompletely extracted in the past
  • Fix fallback filler looping by forcing software mode for this content
    • Other content will still use hardware acceleration as configured
    • Hardware-accelerated fallback filler may be re-enabled in the future
  • Fix playout building when shuffle in order is used with a single media item
  • Fix pgs subtitle burn in from media server libraries
  • Fix subtitle and watermark overlays with RadeonSI VAAPI driver
  • Fix NVIDIA pipeline to use hardware-accelerated decoder with 8-bit h264 content

Changed

  • Timeout playout builds after 2 minutes; this should prevent playout bugs from blocking other functionality
ErsatzTV - v0.7.8-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Add Season, Episode playback order
    • This is currently only available when a show is added directly to a schedule
    • This will ignore release date and sort exclusively by season number and then by episode number
  • Add Show Media Info button to movie and episode detail pages for troubleshooting

Fixed

  • Limit HLS Direct streams to realtime speed
  • Fix Reset Playout button to use worker thread instead of UI thread
    • This fixes potential UI hangs and database concurrency bugs
  • Maintain watermark alpha channel (built-in transparency) using QSV acceleration
  • Properly extract and burn in embedded text subtitles using Jellyfin, Emby and Plex libraries
  • Fix bug where deleting a channel would not remove its data from XMLTV
  • Fix colorspace filter for some files with invalid color metadata
  • Fix playback of external subtitles on Windows
  • Fix vobsub subtitle burn in from media server libraries

Changed

  • Remove duplicate items from smart collections before scheduling
    • i.e. shows no longer need to be filtered out if search results also include episodes
    • Certain multi-collection scenarios may still include duplicates across multiple collections
  • Use autocomplete fields for collection searching in schedule items editor
    • This greatly improves the editor performance
  • Ignore dot underscore files
ErsatzTV - v0.7.7-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Use plot field from Other Video NFO metadata as XMLTV description
  • Add detailed warning log when a file is added to ErsatzTV more than once

Fixed

  • Fix updating (re-adding) Trakt lists to properly use new metadata ids that were not present when originally added
  • Fix local show library scanning with non-english season folder names, e.g. Staffel 02
  • Fix bug where local libraries would merge with media server libraries when the same file was added to both libraries
  • Fix transcoding some 10-bit content from media servers using VAAPI acceleration
  • Fix decoding of MPEG-4 Part 2 (e.g. DivX) content using NVIDIA acceleration
  • Fix color normalization from bt470bg to bt709 using QSV acceleration
  • Fix adding files to search index with unknown video codec
  • Fix subtitle burn-in (embedded or external) using Jellyfin, Emby and Plex libraries
    • This requires a one-time full library scan, which may take a long time with large libraries.

Changed

  • Use Poster artwork for XMLTV if available
    • If Poster artwork is unavailable, use Thumbnail
  • Improve XMLTV response time by caching data as playouts are updated
ErsatzTV - v0.7.6-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Add Troubleshooting page with aggregated settings/hardware accel info for easy reference
  • Read director fields from music video NFO metadata
  • Pass directors and studios to music video credit templates
  • Add optional JSON Web Token (JWT) query string auth for streaming endpoints (everything under /iptv)
    • This can be configured using the following env var (note the double underscore separator __)
      • JWT__ISSUERSIGNINGKEY
    • When configured, a JWT signed with the configured signing key is required to be passed in the query string as access_token, for example:
      • http://localhost:8409/iptv/channels.m3u?access_token=ABCDEF
      • http://localhost:8409/iptv/xmltv.xml?access_token=ABCDEF
    • When channels are retrieved this way, the access token will automatically be passed through to all necessary urls
    • Note that ONLY the /iptv endpoints will require auth when JWT is configured

Fixed

  • Fix scaling anamorphic content from non-local libraries
  • Fix direct streaming content from Jellyfin that has external subtitles
    • Note that these subtitles are not currently supported in ETV, but they did cause a playback issue
  • Fix Jellyfin, Emby and Plex library scans that wouldn't work in certain timezones
  • Fix song normalization to match FFmpeg Profile bit depth
  • Fix bug playing some external subtitle files (e.g. with an apostrophe in the file name)
  • Fix bug detecting VAAPI capabilities when no device is selected in active FFmpeg Profile
  • Fix playout mode duration bugs in XMLTV
    • Tail mode filler will properly include filler duration in XMLTV
    • Duration that wraps across midnight will no longer have overlapping items in XMLTV
  • Maintain collection progress across all alternate schedules on a playout
  • Fix color normalization from bt470bg to bt709

Changed

  • Ignore case of video and audio file extensions in local folder scanner
    • For example, the scanner will now find movie.MKV as well as movie.mkv on case-sensitive filesystems
  • Include multiple display-name entries in generated XMLTV
    • Plex should now display the channel number instead of the channel id (e.g. 1.2 instead of 1.2.etv)
  • Rework concurrency a bit
    • Playout builds are no longer blocked by library scans
    • Adding Trakt lists is no longer blocked by library scans
    • All library scans (local and media servers) run sequentially
  • Emby collection scanning will no longer happen after every (automatic or forced) library scan
    • Automatic/periodic scans will check collections one time after all libraries have been scanned
    • There is a new table in the Media > Libraries page with a button to manually re-scan Emby collections as needed
  • For performance reasons, limit console log output to errors on Windows
    • Other platforms are unchanged
    • Log file behavior is unchanged
ErsatzTV - v0.7.5-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Use AV1 hardware-accelerated decoder with VAAPI, QSV, NVIDIA when available
  • Use VP9 hardware-accelerated decoder with VAAPI when available

Fixed

  • Align default docker image (no acceleration) with new images from ErsatzTV-ffmpeg
  • Fix some transcoding pipelines that use software decoders
  • Improve VAAPI encoder capability detection on newer hardware
  • Fix trash page to properly display episodes with missing metadata or titles
  • Fix playback of content with yuv444p10le pixel format
  • Fix case where some multi-episode files from Plex would crash the scanner

Changed

  • Upgrade all docker images and windows builds to ffmpeg 6.0
  • Plex, Jellyfin and Emby libraries now retrieve all metadata and statistics from the media server
    • File systems will no longer be periodically scanned for libraries using these media sources
  • Plex, Jellyfin and Emby libraries now direct stream content when files are not found on ErsatzTV's file system
    • Content will still be normalized according to the Channel and FFmpeg Profile settings
    • Streaming from disk is preferred, so every playback attempt will first check the local file system
  • Use libvpl instead of libmfx to provide intel acceleration in vaapi docker images
  • Search queries no longer remove duplicate results as this was causing incorrect behavior
  • Prioritize audio streams that are flagged as "default" over number of audio channels
    • For example, a video with a stereo commentary track and a mono "default" track will now prefer the "default" track
  • Support many more season folder names with local television libraries
ErsatzTV - v0.7.4-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Add button to copy/clone schedule from schedules table
  • Synchronize episode tags and genres from Jellyfin, Emby and Local show libraries
  • Add Deep Scan button to Jellyfin and Emby libraries
    • This is now required to update some metadata for existing libraries, when targeted updates are not possible
    • For example, if you already have tags and genres on your episodes in Jellyfin or Emby, you will need to deep scan each library to update that metadata on existing items in ErsatzTV

Fixed

  • Fix many QSV pipeline bugs
  • Fix MPEG2 video format with QSV and VAAPI acceleration
  • Fix playback of content with undefined colorspace
  • Fix NVIDIA color normalization with VP9 sources
  • Fix fallback filler looping
  • Fix bug where some libraries would never scan
  • Fix filler ordering so post-roll is properly scheduled after padded mid-roll
  • Fix pre/post-roll filler padding when used with mid-roll
    • This caused overlapping schedule items, fallback filler that was too long, etc.

Changed

  • Merge generated Other Video folder tags with tags from sidecar NFO
  • Prioritize audio streams that are flagged as "default" when multiple candidate streams are available
    • For example, a video with a stereo commentary track and a stereo "default" track will now prefer the "default" track
ErsatzTV - v0.7.3-beta

Published by jasongdove over 1 year ago

Release Notes

Added

  • Attempt to release memory periodically
  • Add OpenID Connect (OIDC) support (e.g. Keycloak, Authelia, Auth0)
    • This only protects the management UI; all streaming endpoints will continue to allow anonymous access
    • This can be configured with the following env vars (note the double underscore separator __)
      • OIDC__AUTHORITY
      • OIDC__CLIENTID
      • OIDC__CLIENTSECRET
      • OIDC__LOGOUTURI (optional, needed for Auth0, use https://{auth0-domain}/v2/logout?client_id={auth0-client-id} with proper values for domain and client-id)
  • Add experimental alternate schedule system
    • This allows a single playout to dynamically select a schedule based on date criteria, for example:
      • Weekday vs weekend schedules
      • Summer vs fall schedules
      • Shark week schedules
    • Alternate schedules can be managed by clicking the calendar icon in the playout list
    • Playouts contain a prioritized (top to bottom) list of alternate schedules
    • Whenever a playout is built for a given day, ErsatzTV will check for a matching schedule from top to bottom
    • A given day must match all alternate schedule parameters; wildcards (*any*) will always match
      • Day of week
      • Day of month
      • Month
    • The lowest priority (bottom) item will always match all parameters, and can be considered a "default" or "fallback" schedule

Fixed

  • Fix schedule editor crashing due to bad music video artist data
  • Fix bug where playouts would not maintain smart collection progress on schedules that use multiple smart collections
  • Fix library scanning on osx-arm64
  • Fix ability to remove some media server libraries from ErsatzTV

Changed

  • Always use software pipeline for error display
    • This ensures errors will display even when hardware acceleration is misconfigured
  • Call scanner process only when scanning is required based on library refresh interval
  • Use lower process priority for scanner process with unforced (automatic) library scans
  • Disable V2 UI and APIs by default
    • V2 UI can be re-enabled by setting the env var ETV_UI_V2 to any value
ErsatzTV - v0.7.2-beta

Published by jasongdove almost 2 years ago

Release Notes

Fixed

  • Fix i965 VAAPI encoding in docker by switching to non-free driver

Changed

  • Rewrite log page to read directly from log files instead of sqlite
ErsatzTV - v0.7.1-beta

Published by jasongdove almost 2 years ago

Release Notes

Added

  • Add new music video credit templates

Fixed

  • Fix many transcoding failures caused by the colorspace filter
  • Fix song playback with VAAPI and NVENC
  • Fix edge case where some local movies would not automatically be restored from trash
  • Fix synchronizing Jellyfin and Emby collection items
  • Fix saving some external subtitle records to database

Changed

  • Upgrade to dotnet 7
  • Upgrade all docker images to ubuntu jammy and ffmpeg 5.1.2
  • Limit library scan interval between 0 and 1,000,000
    • 0 means do not automatically scan libraries
    • 1 to 999,999 means scan if it has been that many hours since the last scan
  • Use new ErsatzTV.Scanner process for scanning all libraries
    • This should reduce the ongoing memory footprint
ErsatzTV - v0.7.0-beta

Published by jasongdove almost 2 years ago

Release Notes

Fixed

  • Fix removing Jellyfin and Emby libraries that have been deleted from the source media server
  • Fix Work-Ahead HLS Segmenter Limit setting to properly limit number of channels that can work-ahead at once
  • Include base path value in generated channel playlist (M3U) and channel guide (XMLTV) links
  • Fix parsing song metadata from OGG audio files
  • Properly unlock/re-enable trakt list operations after an operation is canceled

Added

  • Add (required) bit depth normalization option to ffmpeg profile
    • This can help if your card only supports e.g. h264 encoding, normalizing to 8 bits will allow the hardware encoder to be used
  • Extract font attachments after extracting text subtitles
    • This should improve SubStation Alpha subtitle rendering
  • Detect VAAPI capabilities and fallback to software decoding/encoding as needed
  • Add audio stream selector scripts for episodes and movies
    • This will let you customize which audio stream is selected for playback
    • Episodes are passed the following data:
      • channelNumber
      • channelName
      • showTitle
      • showGuids: array of string ids like imdb_1234 or tvdb_1234
      • seasonNumber
      • episodeNumber
      • episodeGuids: array of string ids like imdb_1234 or tvdb_1234
      • preferredLanguageCodes: array of string preferred language codes configured for the channel
      • audioStreams: array of audio stream data, each containing
        • index: the stream's index number, this is what the function needs to return
        • channels: the number of audio channels
        • codec: the audio codec
        • isDefault: bool indicating whether the stream is flagged as default
        • isForced: bool indicating whether the stream is flagged as forced
        • language: the stream's language
        • title: the stream's title
    • Movies are passed the following data:
      • channelNumber
      • channelName
      • title
      • guids: array of string ids like imdb_1234 or tvdb_1234
      • preferredLanguageCodes: array of string preferred language codes configured for the channel
      • audioStreams: array of audio stream data, each containing
        • index: the stream's index number, this is what the function needs to return
        • channels: the number of audio channels
        • codec: the audio codec
        • isDefault: bool indicating whether the stream is flagged as default
        • isForced: bool indicating whether the stream is flagged as forced
        • language: the stream's language
        • title: the stream's title
  • Add new fields to search index
    • video_codec: the video codec
    • video_bit_depth: the number of bits in the video stream's pixel format, e.g. 8 or 10
    • video_dynamic_range: the video's dynamic range, either sdr or hdr

Changed

  • Change Multi-Episode Shuffle scripting system to use Javascript instead of Lua
ErsatzTV - v0.6.9-beta

Published by jasongdove almost 2 years ago

Release Notes

Fixed

  • Fix bug where tail or fallback filler would sometimes schedule much longer than expected
    • This only happened with fixed start schedule items following a schedule item with tail or fallback filler
  • Fix NFO reader bug that caused inaccurate warning messages about invalid XML and incomplete metadata
  • Fix reverse proxy SSL termination support by supporting X-Forwarded-Proto header
  • Fix automatic playout reset scheduling
    • Playouts would reset every 30 minutes between midnight and the configured time, instead of only at the configured time
  • XMLTV: properly group schedule items with Custom Title followed by item(s) with Guide Mode set to Filler

Added

  • Add music video credits template system
    • Templates are selected in each channel's settings
    • Templates should be copied from _default.ass.sbntxt which is located in the config subfolder templates/music-video-credits
      • Copy the file, give it any name ending with .ass.sbntext, and only make edits to the copied file
    • The default template will be extracted and overwritten every time ErsatzTV is started
    • The template is an Advanced SubStation Alpha file using scribian template syntax
    • The following fields are available for use in the template:
      • resolution: the ffmpeg profile's resolution, which is used for margin calculations
      • title: the title of the music video
      • track: the music video's track number
      • album: the music video's album
      • plot: the music video's plot
      • release_date: the music video's release date
      • artist: the music videos artist (the parent folder)
      • all_artists: a list of additional artists from the music video's sidecar NFO metadata file
      • duration: the timespan duration of the music video, which can be used to calculate timing of additional subtitles
      • stream_seek: the timespan that ffmpeg will seek into the media item before beginning playback
  • Add Multi-Episode Shuffle playout order for Television Show schedule items
    • The purpose of this playout order is to improve randomization for shows that normally have intro, multiple episodes, and outro
    • This playout order requires splitting the parts into individual files (e.g. splitting s01e01-03.mkv into s01e01.mkv, s01e02.mkv and s01e03.mkv)
    • This playout order requires a lua script in the config subfolder scripts/multi-episode-shuffle
    • The lua script should be named for the television show's guid, e.g. tvdb_12345.lua or imdb_tt123456789.lua
    • The script defines the number of parts that each un-split file typically contains
    • The script also defines a function to map each episode to a part number (or no part number i.e. nil if an episode has not been split)
    • All groups of part numbers (i.e. all part 1s, all part 2s) will be shuffled
    • The playout order will then schedule a random part 1 followed by a random part 2, etc
      • Un-split (nil) episodes will be randomly placed between re-combined parts (e.g. part1, part2, part3, un-split, part1, part2, part3)
  • Add ETV_BASE_URL environment variable to support reverse proxies that use paths (e.g. /ersatztv)

Changed

  • No longer place watermarks within content by default (e.g. within 4:3 content padded to a 16:9 resolution)
    • This can be re-enabled if desired using the Place Within Source Content checkbox in watermark settings
ErsatzTV - v0.6.8-beta

Published by jasongdove about 2 years ago

Release Notes

Fixed

  • Fix typo introduced in 0.6.7-beta that stopped QSV HEVC encoder from working
  • Fix scaling logic for Nvidia acceleration and software mode
  • Attempt to position watermarks within content (not over added black padding)
  • Fix search results for Other Videos when NFO metadata is used
  • Properly synchronize tags from Emby movies and shows
  • Properly sync updated file paths from Plex
  • Fix numeric range search queries (e.g. minutes:[5 TO 10], minutes:[* TO 3])

Added

  • Add QSV Device option to ffmpeg profile on linux
  • Add guids to search index (e.g. imdb:tt000000, tvdb:12345)
Related Projects