Changelog
Scroll to Version

v2.16.0
Released March 15, 2026

Major Changes

Completely rewrite the program structure to closer align with a standard Python project layout
IMPORTANT: All non-Docker users need to update their launch command to start TCM. See the docs for details.
Move the app folder into backend, remove the modules folder
Move the app/templates folder into frontend
Move the cypress testing directory into tests/cypress
Rewrite all application logging (see below)
Change all API routes to be versioned and include /v2/
Move all card type assets to backend/assets/... - if you have developed a custom card type file these references will need to be updated (I have already updated all those which were submitted to the Card Type repository)
Completely overhaul the Scheduler to use huey instead of apscheduler
apscheduler was prone to "breaking" by locking a Task's next execution in the past, and did not have nice-to-have features like thread locking, state persistence, etc.
The Scheduler will now run in a separate thread from the main TCM server
No longer allow scheduling Task frequencies with basic intervals (i.e. 5 hours) in basic mode; instead all scheduling must be done with crontab strings
Various improvements to the Add Series page
Improve page layout with more consistent styling and positioning of various buttons
Add help messages to each section to guide new users
Redesign the Blueprint HTML elements to use popups instead of unexplained buttons
Various improvements to the home page filters
Preserve the currently applied filter between reloads
Add the ability to stop applying all filters on the home page
Add the ability to delete a single filter condition from the home page
Add length filter conditions - i.e. has more items than, and has less items than for filtering by list length and text is longer than and text is shorter than for filtering by string length
Create new Dictionary card type
All documentation is available here
Create new Anime Fade card type - this was requested by user drewstopherlee
All documentation is available here
Improve the Graphs page
Add an improved filter options section
Label each graph
Various improvements to the Recent page
Add buttons to quickly display Cards created in the last 6 hours, 24 hours, or 7 days
Now display recently added Series, in addition to recently created Title Cards
Change the default card type to Tinted Frame - this is (seemingly) the most popular card design. This change only affects new TCM users, and does not change the default card type of existing users
No longer "pickle" global settings - these are now stored as plain JSON at config/settings.json
Add the ability to selectively re/load Cards for entire seasons, as opposed to individual Episodes or the entire show
Display the temporary credentials within the UI when first enabling authentication
Add some commonly useful system actions to the home page - these currently are starting Card creation, Card loading, and importing Kometa YAML
Display unloaded Cards on the frontend on the Missing page
Significantly improve the performance of the SQL query when displaying Series with the associated Episode/Loaded counts - this should be an approximate 100x performance increase
Completely remove all v1/YAML-related code
This removes all backwards compatibility with those running v1 on the v2 repository
This was done in order to significantly simplify the codebase
Rewrite all environment variables used to significantly change the behavior of TCM - see docs for more details
Update the Font and Template Card previews to select a specific Episode to preview, so Series and Episode level customizations can be viewed concurrently
Update the Font missing character analysis to utilize ImageMagick to actually check for empty or missing character bitmaps, rather than looking at the character definition table (as some Fonts would "define" a blank character which would not be reported missing)
Completely rewrite application logging
Log to an SQL database, not JSONL files - this will significantly improve performance when querying logs
Remove hard-coded contextualized logger arguments in all functions, rather attach log objects directly to the process using the builtin contextvars package - this effectively adds auto contextualization across the entire application
Display a 'pretty' log message table for STDOUT logs
Add the ability to prune (delete) logs from the frontend to aid in sending large log databases via Discord or GitHub
Do not immediately delete un-Synched Series (when enabled on the Settings page) until 10 days (this can be changed via an environment variable) of being gone. This is enabled to prevent database "blips" from Sonarr/Plex/etc. from resulting in TCM completely deleting a large number of Series
Add a "thank you" banner to the page header to show thanks to all the wonderful supports of this project

Major Fixes

Allow selecting the does not equal filter condition on the home page
Handle Title Cards without an assigned Series or Episode on the Recently Added page
Fix season poster loading For Emby - was incorrectly loading Season 0 into 1, 1 into 2, etc, if there was no Specials season
Fix editing the currently assigned Templates for a given Sync via the API - was incorrectly resetting the Template ID assignments with each edit
Properly display the Image Source Priority setting in the correct ID order, not ascending - i.e. 2,1,3 was displaying as 1,2,3
Properly delete existing Episodes from season 0 when these are disabled for a given Series but still present in the assigned Episode Data Source
Reduce false positive Series and Episode matches by modifying the match algorithm to require one of:
Any two database ID matches
An exact name and year match
Any single database ID match and either an exact name or year match
Fix uploading per-season backdrop assets via the UI
Prevent significant page flashes from white to black when swapping pages in the UI
Pin documentation build workflow Python version to 3.13.7 (3.14 is not supported by Pillow)
Handle exceptions due to bad image downloads for posters/logos when adding a Series
Completely rewrite the Emby, Jellyfin, and Sonarr API interface classes to work on validated Pydantic models to improve reliability
Fix required root folder Sync filters for syncing from Sonarr

Minor Changes

Use Python 3.13 in the Docker container instead of 3.11 - I recommend non-Docker users update to 3.13 as well
Add keyboard navigation to the Episode Data table on the Series page - use tab, shift+tab, up arrow, and down arrow to navigate between columns/rows of the table
Store the uploaded file as the Source Image (in addition to the card file) when uploading cards as "textless"
Allow directly adding a library to a Series when added via the add-Series Sonarr webhook by including the connection_id query parameter to the Webhook URL
Display a page loader on the Recently Created page while Cards are being queried
Use improved Episode data endpoints on the Series page to improve performance especially when using simplified data tables
Use reduced data queries on the Missing Cards page to improve performance
No longer allow sorting just the currently visible page of Series on the home page
Print ImageMagick command history when booting and determining command prefix
Log remote file download failures
Upgrade pydantic dependency to v2
Rewrite command line scripts to work with click, rather than builtin argparse
Improve the performance on the Fonts page for very large setups by only initializing the Font accordions for elements as they are expanded
Log bad format strings as DEBUG messages, not ERROR
Modify the Add Series and Settings pages to provide visual feedback if no Connections have been defined yet
Store how long each Task takes in the database
Remove the Import page from the front end
Display a message when there are no recently made Title Cards on the Recent page
Improve the navigation layout on the Changelog page
Add the ability to delete a Series' logo on the front end
Improve the layout of the Sync page by displaying some details in an expandable details section for each Sync
Query card type data from the appropriate develop-specific branch when TCM is on the develop branch; this will enable future flexibility for modifying Card Types on the fly without affecting stable users
Change the default log level to TRACE when first loading the logs page
Change the available page size options on the logs page
Display Connection validation errors in the form when bad parameters are submitted
Change the toolbar theme/logs/help button sizes
Completely rewrite the TVDb interface to work with validated data models and significantly improve reliability and uncaught exceptions due to bad data
Delete a Series' card directory (if empty) when deleting a Series
Add the ability to download a zip of a Series' Title Cards directly from the frontend
Add new format string functions and variables
to_lowercase(...) as an alternate to str.lower()
to_uppercase(...) as an alternate to str.upper()
{ and } as OPEN_BRACKET and CLOSE_BRACKET
Blank text ({""}) as BLANK
Add a new optional timezone argument to the format_date function
Improve the extra accordions on the Series page by only displaying the card types which are currently "active" (i.e. selected by any Series/Template/etc.)
Use an improved formatting (using rich) to log ImageMagick command histories
Improve the error messages displayed for invalid extras when using custom validator logic
Improve the logging when launching the program with a bad encryption key
Stop using animated save/submit buttons
Add a "helper" for available card type details to the Series and Template pages
Keep the last-used MediUX import settings between reloads (stored in the browser)
Add a button to delete a Template condition - the previous method was to just leave this blank

Minor Fixes

Do not remove the missing Card table headers when populating the missing Cards table
Do not stop all Card imports if an OS error occurs for any single file
Handle YAML imports without backdrop/poster URLs
Properly remove deleted Series from the page when bulk-deleting Series on the home page
Do not reject matching library path names for Sonarr Connections if they are for the same library
Improve handling of TVDb API errors when querying Episode data (usually caused by bad TVDb IDs)
Do not query all "duplicate" interfaces for database IDs - just query the first Sonarr, TMDb, and TVDb interface
Display missing Title Cards in improved order - these were being returned by the SQL default order (Episode ID) - now these are sorted by Series, then index
Improve the start.sh script handling of being launched as a non-root user
Handle empty string URLs when uploading Source Images via the frontend
Properly reset the Episode Data table pagination when all Episodes are deleted on the frontend
Properly query Series-related log messages using the | separator
Pin Python version between 3.12 and 3.13 as 3.14 has not been supported by a few dependent packages
Do not require a TMDb connection to browse Source Images on the frontend
Do not throw errors when visiting the Add Series page with no defined Connections
Fix downloading Source Images from Emby or Jellyfin via the UI
Handle MediUX error strings in image downloading
Allow resetting non-list fields to their default value when editing Syncs on the frontend
Do not raise an error for disabled/bad library Connections when downloading a Series poster or logo
Add some logic to prevent adding Series which already exist in the database (should prevent some duplication when incorrectly running multiple Syncs at once)
Prevent displaying "stale" extra info when editing an Episode's extras by navigating back-and-forth between modals
Change the MediUX download timeout to 15 seconds
Allow deleting a Font's character replacement by clearing the input string box

Title Card Changes

All Card Types
Add a pre-card creation "hook" (like React) so custom card types may implement enrich_card_data() as a static method to add arbitrary dynamic extras to a Card
This is currently used in the Dictionary card to automatically pull in an Episode's overview
Create new Anime Fade and Dictionary card types
Cascade
Properly handle characters which need escaping (", \, etc.) in the alternate text
Divider
Rename the Title Text Position extra to Title Text Side to improve clarity
Add new Divider Width extra
Improve divider height calculation algorithm to be more accurate for multi-line text
Formula 1
Change the default frame year to 2026
Inset
Improve the positioning of inset text - this was being positioned using the "old" annotation text measurement method, but now uses the explicit image size measurement algorithm to exactly center the text
Landscape
Add blur box, rounding radius, and box blur extras
Use improved text measurement algorithm to improve dynamic padding when using non-default Fonts
Poster
Add "Episode Text Font Size" extra
Roman Numeral
Add season text size extra
Tinted Frame
Prefer {font_file} in the Episode Text Font File extra instead of {title_font} - the "old" {title_font} is still supported for backwards compatibility, but will log a message
Remote Card Type Changes
Create a helper RemoteDirectory class for easily referencing a directory on the Card Type repository and using it for multiple files
Move the Card Type repository to the TitleCardMaker organization - the new repository is here
Rewrite how all custom card types need to define their default card settings, see the documentation for details

Documentation Changes

Document all remaining card types
Adjust recommended Sync source from Sonarr to your primary media server - this is because many users incorrectly set up the library setting for Sonarr, which can lead to confusion
Document the recently added Logo-related extras for the Anime card type
Add step to install Python to the Getting Started docs
Correct webhook docs for Sonarr integration to reference the "On File Import" section
Finish documenting the Series page
Document all available environment variables

API Changes

Modify the add-Series webhook (/api/webhooks/sonarr/series/add or /api/v2/webhooks/sonarr/series/add) to take the connection_id URL query parameter
Remove deprecated GET /api/cards/missing - use the GET /api/v2/missing/cards endpoint instead
This endpoint now returns the revised ReducedEpisodeData schema (for faster loads)
Remove deprecated GET /api/settings/backups - use the GET /api/v2/backups/all endpoint instead
Remove deprecated PUT /api/cards/series/{series_id}/load/library endpoint
Create new API endpoints to get a Series' Episode data
Deprecate the GET /api/episodes/series/{series_id} endpoint
Create GET /api/v2/episodes/series/{series_id}/extended to get "extended" Episode data which has all fields of all Episodes
Create GET /api/v2/episodes/series/{series_id}/simplified to get simplified data
Remove cards attribute from Episode return schema
Add sort_name to the Font and Template availability API endpoints
Standardize various Font and Template API endpoints
POST /api/fonts/new is now POST /api/v2/fonts/font/new
PUT /api/fonts/{font_id}/file is now PUT /api/v2/fonts/font/{font_id}/file
DELETE /api/fonts/{font_id}/file is now DELETE /api/v2/fonts/font/{font_id}/file
PATCH /api/fonts/{font_id} is now PATCH /api/v2/fonts/font/{font_id}
GET /api/fonts/{font_id} is now GET /api/v2/fonts/font/{font_id}
GET /api/fonts/{font_id}/analysis is now GET /api/v2/fonts/font/{font_id}/analysis
Similar endpoint revisions have been made to the Templates router
Revise the Series/Episode schemas to combine the extras and season_titles fields, rather than have separate fields which are processed into one
Do not paginate the get all Templates API endpoint
Update the GET /api/statistics/snapshots endpoint
New endpoint is GET /api/v2/statistics/snapshots
Remove the previous_days and previous_hours query parameters
Add new start and end query parameters
Create new GET /api/v2/logs/database-zip endpoint to get a zip of the log database
Rename /schedule/ router to /scheduler/ - this affects all endpoints
Create new GET /api/v2/missing/cards-without-loaded endpoint to get all Cards which do not have an associated Loaded asset
Excluded "blacklisted" Blueprints from the Blueprint query by info API endpoint
Add order_by query parameter to the GET /api/v2/blueprints/query/series endpoint to order by the creation date or Series name
Create new GET /api/v2/series/recent API endpoint to get all the Series added after a given datetime
Properly raise an 404 error when querying by a Title Card ID which does not exist
Properly implement the pipe (|) separator when querying for logs which contain a specific substring
Create new POST /api/v2/import/mediux endpoint to import arbitrary Kometa/MediUX YAML via the builtin TVDB ID
Create new DELETE /api/v2/logs/prune endpoint to prune old log messages from the database to reduce the log database size - this is also done within a scheduled Task
Remove all v1/YAML-import related API endpoints
Create new POST /api/v2/cards/preview/episode/{episode_id} and /api/v2/cards/preview/episode/{episode_id}/template/{template_id} endpoints to get a Card preview for the changes to a specific Episode or_ Template - the old /api/cards/preview endpoint has been __removed_ (not deprecated)

Testing Changes

Create spoofed Interface returns for use in frontend tests - these are dynamically injected into the Interface classes when test mode is enabled
Rewrite scheduler tests to work with the new crontab style of scheduling Tasks
Remove navigation tests related to the Import page
Write tests for the Connections, Settings, Sync, Add Series / Blueprint, and Font pages
Change the default dimensions of the testing viewport to 1920x1080

v2.0-alpha.15.0
Released April 27, 2025

Major Changes

Add native support to extract colors from an image and use it in Format Strings and colors
get_image_color can be used in any extras which support Format Strings - like so: {get_image_color(logo_file, fallback='white')} would get the first (primary) color of the logo file - and if one cannot be determined (or is too white/black) then white is used instead
This is documented here
Add a quick-toggle button to the Series page to swap between advanced and basic mode for the Episode data tables
Improve watched status and style-toggles in Card creation
Properly assign a card's style if the watched status is indeterminate
Properly use style-specific Source Images if the watched status is indeterminate
Add the ability to mass-remove libraries from all Series
This can be done to automatically remove all "unlinked" libraries (typically as a result of typing a bad library name in a Sonarr Sync), or to remove all assignments of a valid library
Create a new "Recently Added" page which displays all recently created Title Cards
Accessed at /recent, or via the sidebar
Requires SQL schema e290ff7005ff to add creation timestamp columns to various tables
Existing objects will be populated with "fake" (but sequential) creation timestamps - but objects added/created after this change will be accurate
Allow all card settings to be specified as Format Strings
This means any setting (including extras) can use the dynamic/conditional logic and variables available to explicit format strings like the episode text format, filename format, etc.
For example, rather than creating a custom Template with conditions to change the font color based on a season, this can be done by setting the Font Color setting to (for example) {"red" if season_number == 0 else "blue"}
Add button to query/display all "missing" Series in a given Connection not added to TCM - this is currently untested for Emby or Jellyfin
Allow a Series to be completely disabled
A Series can now have a "Status" of Monitored, Unmonitored, or Disabled
Unmonitored Series will not add new content (Source Images, translations, etc.) but still maintain up-to-date Cards; Disabled Series will be completely ignored during all scheduled Tasks (Card creation, poster downloads, etc.)
Requires SQL schema f4afea8860cf to migrate Series.monitored to Series.status
Existing Series filters on the home page which refer to the Monitored Status field will be removed and should be replaced with a variation of the Series Status filter
Toggling a Series' status works generally the same, but now cycles through Monitored -> Unmonitored -> Disabled -> (loop)
Disabling any Series which you do not plan to adjust or add content to at all can significantly speed up TCM

Major Fixes

Fix the alternate gradient overlay in the Olivier card
Handle null episode titles from TVDb
Manually editing Episode translations within the UI no longer deletes the translation completely
Fix a mismatch of Episodes with the same index and airdate from different Series causing the Plex webhook to incorrectly fail
Require Source Images in the Textless card - this should fix the setup in which users are using the Textless card by default - e.g. only applying un/watched styles
Correctly utilize the local TZ timezone when storing Task start/end times
Add rudimentary library path validation when editing Sonarr connections - TCM will now check if one library path contains another, e.g. /path/1 and /path/12
Reset Series selection on the home page when performing batch status changes
Add pagination to the Missing Cards page/table

Minor Changes

Add ability to re-download a Series' poster via the UI
Significantly improve the Episode match algorithm to require at least 2 exact database ID matches, or an index match and either a title, single database ID, or airdate match
Relocate the log context ID field on the logs tab of the Series page
Trace log bad image content when downloading images
Allow adding ! to a context ID filter string to remove all non-contextual log messages when filtering logs
Contextually blur unrelated log messages when hovering over a context ID on the logs tab of the Series page
Display the relevant database IDs for Series displayed on the Add Series page
Use improved (faster) slicing when querying Snapshots - no longer query all results and then slice the list in Python; instead use a SQL subquery to slice directly
Change the "Remove Counts" button text to "Hide Counts"
Add loading indicator when querying logs on the Logs page
Display an info message to indicate there are no internal server logs
Begin tracking how long scheduled Tasks take
This requires SQL schema 753b403e12d2 to create the task_durations table
These can now be displayed on the Graphs page
Display an error within the UI if a manual Card loading fails
Add daily vertical axis lines on the Graphs page (to delineate days)
Add button to the Source Image popup to quickly set an Episode's card type to Textless
Display loading icons on the home page when performing actions on a Series
Add new "has no Episodes" Series filter condition
v1
Update the "Created by TitleCardMaker" image used in summary image creation
v1
Add a mini maker command for batch show summary creation

Minor Fixes

Properly assign unwatched flag when new Episodes are added via Sonarr webhook
Remove the scroll overflow for posters on the Add Series page
Improve the Series sort name logic to account for non-alphanumeric characters (including Unicode and &)
Force expire the request cache when manually refreshing remote card type data
Log server start time in localized timezone
Improve handling of "bad" IMDb ID's not formatted as tt____ in the database source
Properly delete Card records from the database when removing Episodes which are no longer in the Episode Data Source
v1
Fix manual summary image creation with the mini maker

Title Card Changes

Anime
Allow positioning a logo on the Anime card type; adding the logo position and size extras
Cutout
Add title horizontal shift extra
Fade
Add logo size extra
Landscape
Correctly utilize custom darken and shadow colors (were being ignored)
Logo
Add new logo horizontal shift extra
Skeleton Crew
Fix text sizing on some versions of ImageMagick
Tinted Glass
Fix right-positioned episode text
Limit glass adjustments between -300 and 300 pixels on any face

Documentation Changes

Added documentation on Jellyfin Webhook integration
Document mass library deletion interactions
Correct documentation on how to disable season subfolders
Update Variables docs to reflect the ability to use variables/format strings in any card setting
Add documentation on the backdrop_file, logo_file, and poster_file file variables
Document new get_image_color() function
Create new page on the Recently Added page
Create new page on the Missing Summary page
Document use of the ! in log context ID filters
Create pages on various card types:

API Changes

Create API endpoint to delete library references from all Series
DELETE /api/connections/{id}/libraries can accept either an unlinked boolean query to delete all unlinked libraries (e.g. those not present in the current library list), or a library_name string query to delete all references to a specific library
Create GET /api/cards/recent API endpoint to get all Title Cards which were created after a specified date/time
Create DELETE /api/series/series/{series_id}/poster endpoint to delete a Series poster
Raise 400 exceptions if card loading fails in various Card loading endpoints
Create GET /api/statistics/task-durations endpoint to query task run durations
Create GET /api/missing/series to get all Series in a given Connection which are not added to TCM
API changes to reflect new Series status field
All Series-related models no longer return the monitored boolean field, now returning the status string
Deprecate PUT /api/series/batch/monitor and /api/series/batch/unmonitor endpoints
Create new PATCH /api/series/batch/status/{status} endpoint
Change behavior of PUT /api/series/{series_id}/toggle-monitor endpoint to now cycle through statuses

v2.0-alpha.14.1
Released January 27, 2025

Major Changes

Create new Cascade card type - this card can also have Kanji added to it
Add new Skeleton Crew card type (created by Supremicus)
Improve Plex API call performance
Include Episode GUIDs in the initial API call to Plex to improve Episode match timings (and reduce the need for an API call for each GUID comparison)
Fast-exit when matching Episodes for Card loads; this means loading subsets of Title Cards should be much faster
Add functionality to upload multiple (generic) Source Images directly to a Series source directory
Begin implementation of mask image editing and creation as part of TCM
Significantly improve the speed of Series searching
Update Episode airdate when refreshing Episode data

Major Fixes

Properly display very long exception log messages on the log page
Do not reinitialize the HTML template elements when creating a new Template
Properly display sequential non-alphabetical Templates in dropdowns on the Series page
Fix adding the global card type to Blueprint exports only if one is not defined an an associated Template
No longer allow selecting Sonarr Connections in Series Image Source Priority dropdowns
Fix changing the Font title case setting on the Series page
Implement the Has Missing Title Cards is false Series filter condition (was no-op)
Improve Episode database ID match logic for Plex - require at least one net positive ID match, this means that Episodes which have just one matching ID, but other mismatching ID's (e.g. matching IMDb, not matching TMDb and TVDb IDs) do not falsely flag

Minor Changes

Add Download buttons to Source Images on the Series page
Add new variables for format strings in Card creation:
number_of_seasons which is the number of unique seasons a Series has
Python's builtin len() and locals() functions
Change airdate and absolute_number to always be present even if undefined; if no set airdate or no defined absolute number then these default to None
Log unmatched Episodes when loading Cards into Plex
Improve font replacement query logic for globally assigned Fonts (by querying all titles for characters to replace)
Reword some Task descriptions on the Scheduler page to improve clarity
Log when refreshing Episode data during the Plex webhook
Sleep for 5 seconds before refreshing Episode data for missing Episodes in Plex webhooks
Change the default interval of the card data refresh task to 3 days (from 1)
Revise parts of the Graphs page
Remove the data point styling
Change the graph styling to stepwise (instead of interpolation)
Adjust the fill styling
Improve the error messages for creating previews using uninitialized remote card types
Allow specification of the TCM_CARD_TYPE_URL environment variable to override the root URL of remote card types - this is designed to make it easier to test remote card types while they are developed.

Minor Fixes

Improve handling of bad / invalid TVDb IDs when querying for Episode or Source Image data from TVDb
Handle more types of bad TMDb ID's from Emby
Improve handling of TMDb 404 errors in Source Image queries
Properly enable editable reference fields for existing filters on the home page
Fix Template is not null filter condition assignment from the UI
Properly assign a Series' TVDb ID (instead of TMDb ID) when searching for Series via TVDb
Improve handling of null episode data when querying TVDb
Avoid FE cache collisions for Cards whose size does not change, but is remade
v1
Fix SVG to PNG logo conversion

Title Card Changes

All types
Create an improved (and very accurate) ImageMagick.get_text_label_dimensions method to get the exact dimensions of some label: generated ImageMagick text while accounting for exact dimensions not FontTools reported metrics
Rename the BaseCardType.SEASON_TEXT_FORMATTER class method to season_text_formatter (functional spec remains unchanged)
Change the BaseCardType.resolve_format_strings method two accept a single dictionary (data: dict) rather than unpacked keyword arguments (**data)
Move all card type validator models into their respective card Python files, rather than app.schemas.card_type
Calligraphy
Fix episode text hiding
Comic Book
Fix the episode text box fill color extra (was incorrectly using the title text box fill color)
Fade
Add episode text font size extra
Formula 1
Fix the country flag determination logic
Music
Handle Percentage format strings which resolve to random
Olivier
Add new gradient type extra
Score
Fix the default season text for season 0
Standard
Add episode text stroke color extra

Documentation Changes

Fix minor typos in the Striped card documentation
Create page for the new Cascade card type
Create page for the new Skeleton Crew card type
Correct label for the Calligraphy card type on the home page (was Banner)
Add docs on the BACKSLASH format string variable
Improve the Getting Started docs to have more clarity around when "basic tasks" (source image gathering, card creation, etc.) occur
Add details on all tasks in the scheduler

API Changes

Remove the include_global_defaults query parameter from the GET /api/blueprints/export/series/{series_id}/zip endpoint
Create new PUT /api/sources/series/{series_id}/upload endpoint to upload any number of generic Source Images to a Series
Rewrite the GET /api/series/search endpoint
No longer accept the year, monitored, or font_id query parameters
Only return the id, name, year, and poster_url fields in the return model
Create GET /api/translate/series/{series_id}/season-titles endpoint to look up season titles for a given Series on TVDb; not yet implemented on the front end

v2.0-alpha.14.0
Released November 29, 2024

Major Changes

Create new Score card type
Add the ability to define complex filters to the home page - for example:
Various significant performance improvements
Use reduced SQL queries in various API endpoints
Default to not querying the Card and Episode counts of Series on the home page - this results in ~20x speed up of loads (in my testing)
This means by default , the "progress bars" of Card creation will not be displayed on the home page
Add a new "Display Counts" button to the home page tool bar which can enable the "old" style if the performance impact is not important
Rewrite the Template page so that the Template elements are interactive much sooner (~15x faster in my limited testing)
Populating dropdown elements in the HTML template using JavaScript (not JQuery)
Only initialize the extra data tabs for Templates which are opened
Make all asynchronous API calls in parallel, rather than sequentially
Rewrite portions of the Series page so that elements are initialized via Jinja templates, not JQuery
Allow specification of global card-type specific blur profiles (if blurring is enabled)
Load same-Series Title Cards together (not separately) in Plex/Tautulli Webhook triggers for seasons and shows
Add TCM label using batch edits in Plex
Significantly improve Kometa / MediUX YAML importing:
Download images in parallel
Load cards in batches
Various database performance improvements:
Add explicit column names for clean, full, and sort names (were previously hybrid properties)
Add indices for sort name columns
This is implemented as schema 2dc1e976a801
Update to Python 3.13
Display loading/progress indication for various interactions on the Series pag
Allow overwriting the Image Source Priority setting in Series and Templates within the UI

Major Fixes

Properly utilize per-season backdrops in Card creation (pushed as hotfix)
Properly fall back to the global Image Source Priority if resolved setting is blank
No longer create new Templates with empty (not null) Image Source Priority settings
Correctly display existing global card-type Fonts on the Settings page
Fix uploading season logo files within the UI
Return the watched Source Image details if an unwatched art style is being used but the Episode is watched in all assigned libraries
Correctly remove the Overlay label from Plex if Kometa integration is enabled; this was corrected by PlexAPI 4.16.0 which fixes a bug related to batch label operations
Fix individually reloading individual Cards via the UI
Fix saving and applying global extras for remote card types
Delete duplicate Episodes in the Clean Database task

Minor Changes

Remove confusing "Found __ via Sonarr, but not in server" log message
Stop logging episodes which are not loaded in Plex card loading
Add the ability to capture any generic package logging by defining the TCM_PACKAGE_LOGGING environment variable as a comma-separated string of package/logger names - e.g. sqlalchemy,aiohttp.server
Improve frontend load times for Templates by initializing dropdowns in HTML directly, not via JQuery
Use "new" style of Python Union and Optional type annotations
Begin preliminary integration to optional background removal services (for in-UI mask image editing and creation)
Indicate action icons as clickable on the System page
Blur the page content behind all Sync modals
Move the "unmonitored series do not download source images" warning on the Series page to the header
Do not display individual "rescheduled ___" toasts when modifying Task schedules
Include Mask Images in Blueprint exports
Add generic custom_field extra to the variable overrides section
Add dict as available builtin function/object in format strings
Add unit labels to extras which have a unit (usually just pixels)
Add a new Template filter argument for the current time - this should allow for automatically updating cards based on the time
Add a Download card button to the card popup on the Series page

Minor Fixes

Validate raw image content downloaded from MediUX before importing
Handle empty (null) episode data and airdate returns from TVDb
Create Cards which do not require a Source Image in the Plex/Tautulli webhook endpoints
Improve handling of bad card settings in Card creation during webhook triggers
Fix YAML setting imports for TMDb and Plex settings
Begin using raw (r'') strings in ImageMagick command definitions to stop Python syntax warnings from displaying at runtime
Use a simpler (more mobile friendly) style of "loader" on the home page
Re-display the loader when navigating between pages of Series on the home page
Correct return type for importing blank global options via the API
Add placeholder text to the Series' Template dropdown
Revise log edits for Episode database ID changes made on unattached Sessions (in background tasks)
Properly refresh the Card interaction popup after manually refreshing the Card previews
Fix suggested character replacements for \ when analyzing Fonts - suggest as post:\ so that manually-entered newline characters are not replaced
Handle automatically deleted log files (due to rotation policy) when querying log files for specific text
Use the same button classes for all Font actions to fix small pixel misalignment on the Transfer Font buttons
Use improved Episode equality comparison logic which allows for matching on the absolute episode numbers
v1
Fix default frame color for Tinted Frame cards made with the mini maker
v1
Add --debug flag to the mini maker card creation to print the ImageMagick command history
v1
Improve error logging for non-async runs of TCM

Title Card Changes

Create Score card type
Anime
Increase the default kerning of all kanji - this was erroneously changed in a prior version from 2 to -3, this reverts this
Banner
Limit the banner height between 0 and 1800 pixels
Limit the text offset between 0 and 3200 pixels
Rename the "Banner Toggle" extra to "Disable Banner"
Banner
Add new episode text box fill color extra
Landscape
Add new darken color extra
Notification
v1
Change the default separator character for cards made with the mini maker
Shape
Fix typo in an extra description
Star Wars
Add support for custom Font kerning adjustements
Striped
Add episode text vertical shift extra
Tinted Frame
Add new horizontal shift extras to adjust the title and index/episode text

Documentation Changes

Various Getting Started page improvements:
Remove outdated reference to Template filters
Fix typo for an icon on the scheduler page
Add a step to the Docker instructions to check the volume mounts are working correctly to prevent accidental data loss
Remove docker run command breakdown to avoid confusion
Remove the outdated link to the Tautulli Connection setup, as this is now linked on the Plex page
Add documentation on the global settings for default templates, global fonts, global extras, and default blur profiles
Finish various card type pages:
Document global "Delete Un-Synced Series" setting
Move global "Source Image Deletion" setting into appropriate section of the Settings page
v1
Minor improvements to the sync documentation examples

API Changes

Add query parameter on whether to refresh all episode IDs in the POST /api/episodes/series/{series_id}/refresh endpoint
Create API endpoints for managing mask images
PUT /api/sources/episode/{episode_id}/mask to upload a mask to a given Episode
DELETE /api/sources/episode/{episode_id}/mask to delete a mask for a given Episode
Modify return schema of GET /api/series/all - see new API specification for details
Create new GET /api/series/all-extended endpoint to function like the old /api/series/all endpoint
Create a new GET /api/cards/series/{series_id}/reduced endpoint to return a reduced Card model which does not contain the JSON definition

v2.0-alpha.13.0
Released November 01, 2024

Major Changes

Create new Negative Space card type
All documentation is available here
Add toggle for using season-specific assets (logos and backdrops) for Series
Once enabled, TCM will allow directly setting logos and backdrops for each season within the UI
Requires SQL schema a1520b6160c4
Add per-Series and per-Template level Image Source Priority customization
Requires SQL schema a1520b6160c4
Display the Series name in Blueprints which are a part of a Set while on the Series page
Add the ability to "intercept" Plex API logging and route all messages to the TCM logging mechanism by setting the environment variable TCM_PLEX_LOGGING to TRUE
Remove all references to the "blacklist" from TMDb
Add the ability to delete Source Images from the UI
Add pop-up image interactions to Title Cards and Source Images within the UI
Previously, clicking a Source Image would launch the browser; now a popup is shown
Previously, clicking or right-clicking a Title Card would create the Card (if globally enabled); now a popup is shown
Add the ability to selectively load any Title Card into any Connection/library/episode
Remove the checkmark over Title Cards which indicated whether a Title Card is loaded or not - this is now shown in the popup
Minor improvements to the Plex Webhook
Run in a separate asynchronous thread so that the UI does not lock up while processing
Add timeout query parameter to stop the webhook if it takes longer than the specified number of seconds (defaults to 120)

Major Fixes

Properly implement restoring from backups via the UI / API
Only reload Cards if a Card config actually changed when triggered via a Plex Webhook
Correct SQL model reference used to import a Series and Blueprint
Handle bad remote card type JSON loading while launching the UI - remote card types will now just be skipped, not result in the UI failing to load
Fix setting the global card extension to .jxl via the UI
Correctly apply minimum Source Image resolution settings for TVDB Connections
Pin the cryptography package version to 42.0.8 for ARMv7 Docker images
Fix resetting Episode extras via the UI
Properly handle deleting old database ID's which did not exist in the SetSeriesIDs task
Properly download logos from TVDb (was downloading posters)
Handle changing season/episode/absolute numbers when refreshing episode data
Properly batch label removal when loading Cards into Plex

Minor Changes

Add an icon to directly perform a system backup via the System page
Fix and improve various E2E tests
Change the log level of various messages to be less annoying
Remove the ability to display Source Image information in non-tabular form
Move the edit poster dialog into a popup menu rather than a modal
Move the home page table/poster toggle button to the right side of the menu bar
Move all Series "delete" functionalities (delete Title Cards, Series, etc.) to a separate submenu
Update all package dependency versions
Add the ability to adjust the minimum log message level of the live log messages with the TCM_LOG_WEBSOCKET environment variable
Remove the "search" Source Image interaction/column from the UI - this was confusing for most users, and rarely useful
No longer auto refresh Card previews on the Series page
Add ability to delete Source Images from the UI
Only set Episode IDs for new Episodes when refreshing episode data
Display a Connection's available libraries within the UI on the Connections page

Minor Fixes

Properly display the browse asset button(s) within the UI if TMDb is disabled
Improve handling of bad image content in logo and backdrop upload endpoints
Reject series without premiere years in Jellyfin when querying Series IDs
Handle all generic exceptions when parsing Plex webhooks - most commonly ClientDisconnent errors
Improve parsing of log messages without valid datetimes
Correct handling of logging bad poster URL uploads in Plex
Raise 422 if the specified Connection in a /api/proxy API call does not have a defined URL
Display generic "Some time ago" text if the time difference cannot be determined for log messages on the Series page
Correctly display a success message when a Title Card is deleted in the UI
Do not raise an exception if a specified interface does not exist when downloading logos for a Series
Do not reset currently running Tasks when initializing the Scheduler
Properly show an error toast when TMDb returns no posters when querying via the UI
Add scrolling for x-overflow on the Logs page
v1
Do not include unique source images in the missing file report if both styles are art

Title Card Changes

Cutout
Add extra to shift the vertical position of the cutout text

Documentation Changes

Improve the "how to update" docs to reference docker pull command for non-compose Docker setups
Improve documentation for environment variables
Write documentation on the "live log messages" and "interactive title card" global settings here

API Changes

Fix /api/connections/tautulli/check endpoint
Sleep for only 15 seconds between polling for Episodes in the Sonarr webhook endpoint
Change the default page size of all paginated endpoints to 50 (from 100)
Fix return model for POST /api/sources/episode/{episode_id} if any image source returns a null image
Add season_number query parameter to various API endpoints
PUT /api/sources/series/{series_id}/logo/upload
PUT /api/sources/series/{series_id}/backdrop/upload
Raise 422 if the interface_id query parameter passed in DELETE /api/series/series/{series_id}/plex-labels/library endpoint does not correspond to a valid Plex Connection
Create new API endpoint to delete a Series (or season) logo or backdrop - DELETE /api/sources/series/{series_id}/logo and DELETE /api/sources/series/{series_id}/backdrop
Change PUT /api/series/series/{series_id}/poster Form argument names from poster_url and poster_file to url and file
Rewrite the Card loading API endpoints
Deprecate PUT /api/cards/series/{series_id}/load/all
Deprecate PUT /api/cards/series/{series_id}/load/library
Create new PUT /api/cards/series/{series_id}/load endpoint which optionally takes interface_id and library_name query parameters
Create new PUT /api/cards/episode/{episode_id}/load endpoint to load the Title Cards for a single Episode
Add timeout query parameter to POST /api/webhooks/plex
Create PUT /api/cards/card/{card_id}/load endpoint to reload a Card
Create GET /api/episodes/series/{series_id}/connection/{interface_id}/ endpoint to query remote episode data on a given Connection

v2.0-alpha.12.1
Released September 22, 2024

Major Changes

Display whether a Card has been loaded into at least one media server within the UI - loaded cards will have a small green check mark in the top-left corner
Add the ability to globally change the default Font settings used by each card type
Add in-UI support for restoring from or deleting system backups
Only process new Episodes when new content triggers TCM via the Plex Webhook
Download imported Cards as Cards and Source Images when importing as "textless" in the Kometa / MediUX import
Add a list of Series which are missing logos to the Missing page
Add ability to transfer all references from an existing Font to another existing Font
Make slight changes to the Plex Webhook integration
Add the require_owner query parameter to the Plex Webhook endpoint
Change the trigger_on query parameter of the Plex Webhook endpoint to default to library.new,media.scrobble with no builtin defaults
Rotate log files every 10 MB (from 25 MB) to reflect Discord's new non-Nitro file size limit
Add new global UI settings for the page size/dimension settings of Title Cards and Source Images displayed on the Series page
Perform batch API operations when loading Cards into Plex - this should be a significant speed / stability improvement (especially when loading lots of Cards)

Major Fixes

Properly load remote card types if set as the global card type when not assigned to an existing Template/Series/Episode
Properly delete all Font files in the Font asset directory when deleting files via the API
Delete and replace any existing Font files when uploading a new Font via the API
Do not process Kometa / MediUX Card imports in the main event loop (effectively freezing the UI)
Do not limit the overflow pool of database connections
Pin fastapi package version to 0.112.2 to fix the fastapi-pagination bug for new parameter names

Minor Changes

Also redact host-only URLs in logs - e.g. for http://192.168.0.1:8989, redact http://192.168.0.1 and the full URL
Add easy copy-paste functionality to some elements of the System page
Remove the current version label from the bottom of the Settings page - this is now only on the System page
Properly commit translation changes when creating Cards in a background task
Remove deleted Template element from the page without re-querying all Templates when deleting via the UI
Add new "file does not exist" Template filter condition

Minor Fixes

Properly handle database backups with no alembic version table in parsing
Catch Plex API exceptions raised while adding labels to Plex uploads
Remove sort interaction for restore and delete columns on the backups table
Skip internal server errors with invalid log timestamps
Pin the Starlette package version to 0.38.4 to avoid race conditions caused by multiple middlewares
Fix "false" default values in some alembic SQL schema migrations which were erroneously set to "true"
Handle floating point imprecision for some font percentages (size/kerning/stroke width) when displayed in the UI
Do not stack onclick events when launching the same edit Sync modal repeatedly
Correctly handle a non-existent User when editing credentials via the API
Fix interface-specific library availability API endpoints
v1
Properly load any local .env file when launching the mini maker
Properly parse pre-initialization log messages which do not use the default timezone
Improve handling of invalid SplitCharacteristics properties in custom card type classes

Title Card Changes

Anime
v1
Fix custom archive determination for configs using a custom episode_text_color
Tinted Frame
Allow the Episode Text Font Size extra to go to 0.0
Allow the Frame Width extra to go to 0
Limit the Frame Width extra to a maximum of 1600 pixels

Documentation Changes

Update Plex webhook documentation to reflect changes to the new trigger_on parameter

API Changes

Create new /missing API router
Create GET /api/missing/cards endpoint to get details of all Episodes without Cards
Create GET /api/missing/logos endpoint to get details of all Series without logo files
Deprecate GET /api/cards/missing endpoint
Add the require_owner query parameter to the Plex Webhook endpoint
Change the trigger_on query parameter of the Plex Webhook endpoint to default to library.new,media.scrobble (with no builtin defaults)
Create /backups API router
Move all backup related API endpoints to this subrouter
Deprecate GET /api/settings/backups - new endpoint is GET /api/backups/all
Raise 409 HTTP code if there is no globally assigned Episode Data Source when refreshing data for a Series
Do not return any content from the POST /api/backups/backup endpoint
Remove previously deprecated endpoints:
POST /api/scheduler/type/{mode}
POST /api/series/sonarr/delete
POST /api/cards/key
POST /api/cards/sonarr
GET /api/statistics/

v2.0-alpha.12.0
Released August 27, 2024

Major Changes

BREAKING CHANGE - No longer use pipenv for non-Docker Python dependency virtual environment management
Use uv instead
This is ~10-100x faster than Pipenv
Has built-in support for multiple Python versions and on-the-fly Python installation
All documentation has been updated, but old pipenv run commands can be replaced with uv run (after installation)
Added support for Plex Webhooks
Here is a real-time example of Plex triggering TCM to create a new Card on item rating :
Documentation to implement these is available here
These are the preferred method of triggering fast-updates from Plex (instead of Tautulli), as they are much faster and allow support for custom conditions
Add real-time log messages to the UI (and no longer poll logs on fixed interval) - click here to see one!
These messages will appear in the lower right corner of the UI
Messages are sent via WebSockets, so users who have disabled these via a proxy will need to remove that if you want these messages
Add global option "Disable Live Log Messages" which can be toggled if you do not want these
Reorganize part of the sidebar
Create new "System" page which contains high-level system info like the current version, database schema, server uptime, and available system backups
Move the Logs, Graph, and Changelog pages under the new System menu
Change the menu icon for the Settings page
Merge two new user-submitted card types:
The Supremicus/Dawn card, created by Supremicus
The Supremicus/Horizon card, also created by Supremicus
Both of these cards are very thorough and can be fine-tuned quite a bit. I recommend reading their extras and perhaps the README if you are interested
Significantly improve Docker build times - _huge_ thanks to mchangrh for developing these

Major Fixes

Fix series ID replacement in Emby and Jellyfin
Fix downloading Source Images from Plex via the UI
Fix setting Emby series ID's for Series without ID's
Fix Syncing from Emby when no filter libraries are indicated
Fix querying Series ID's from Emby on some servers
Correct the crontab schedule of the "Clean Database" Task when the Scheduler is in advanced mode

Minor Changes

Add new Sync setting to automatically mark all added Series as Unmonitored
This setting can be toggled if you want to fine-tune which Series have Cards created for them (but don't want to use a more fine-tuned Sync filter)
Requires schema revision db6a1eda7d21
Add a list of internal server errors to the Logs page
These will appear at the bottom of the Logs page, and can be clicked to easily open an Issue on the GitHub for this error
Log the file name of uploaded files when uploading Cards to Plex
v1
Add series characteristics to card initialization
v1
Delete (do not reset) extras in Music and Standard card type archive sub-variations
Cache parsed log data for all inactive log files - this will significantly speed up log loading and searching
Add loading placeholders to the home page statistics (in place of the X
Add the log message's context ID to the right-side of the log message on the Series page
Remove the CSS max content width from log messages on the Series page
v1
Add the abs_episode_number variable to card initialization
Reduce the active menu icon glow by 2px
Rewrite the mini maker script to use improved sub-command syntax - e.g. mini_maker.py genre-card {...}
Add placeholder text to the name fields when creating Syncs
v1
Add --font-vertical-shift arguments to the mini maker for season and movie posters
Use Background Tasks in the Episode data refresh API endpoint
Add support for additional card extensions - namely .avif, .heic, and .jxl
Remove support for the .gif card extension
Remove explicit poetry version management files, move to uv
Exclude sqlalchemy code from logged tracebacks
Include JQuery file directly, do not load via CDN
Utilize new SQL DB connections for functions executed in Background Tasks
As of FastAPI v0.106.0, yielded dependencies do not persist after the request response has been sent, so this requires new DB connections to be made for each background function
Reorganize the Connections forms to use two columns of inputs, rather than one
Only make up to five attempts when loading single-Episode Cards (via API) to Plex , not Emby or Jellyfin
Create new Sonarr integration/webhook to add Series to TCM as they're added to Sonarr; this has marginal benefit over Syncing, but is available regardless - see here for details

Minor Fixes

Use web-ui branch for all user card type file and cards
Do not reset the days URL query parameter when loading the Graphs page
v1
Add the backdrop_file argument to Title Card initialization
Fix the "... days ago" text which could appear within the UI as literally diffDays days
Improve rich formatting when searching log message for multiple |-separated values
Do not attempt to query the ImageMagick prefix when executing in Docker mode
v1
Utilize improved Jellyfin Series matching with database ID's
Reword the "Run this Task" text which appears on the Scheduler page
Do not refresh Episode data when a Series is newly added if it was added as Unmonitored
v1
Improve handling of Episodes without indices when querying watched statuses from Jellyfin
Detect bad images from TPDb uploaded via the API
Detect all types of bad images uploaded via the poster upload API endpoint
Improve handling of Jellyfin episodes without a defined ProviderId field
Improve handling of Jellyfin episodes without titles
Pin rich package version to 13.8.0 to use my PR'd fixes which were causing an "internal server error" during some traceback logging
Potentially fix AJAX-blocked statistics query on the home page for some users using reverse proxies
Also redact host-only URLs from logs - e.g. for 192.168.0.29:32400, redact just 192.168.0.29
Handle exceptions raised while adding the TCM label to objects while loading images into Plex

Title Card Changes

Anime
Add season text color extra (defaults to matching the episode text color)

Documentation Changes

Add documentation on selecting a branch or Docker tag here
Add documentation on all available environment variables here
Add a note about which Connection fields are encrypted within TCM to the Connection page docs
Create System Summary User Guide page
Use new preview image(s) for the Logs page
Describe the log files and internal server errors section of the Logs page
Document all webhook integrations in the User Guide
Add documentation on the TVDb Connection to the User Guide
No longer recommend Tautulli, instead prefer Plex Webhooks

API Changes

Add exists() method to the RemoteFile class - can be used in remote card types
Create GET /api/logs/errors endpoint to get all internal server errors which appear in log files
Create GET /api/logs/files/{filename}/zip endpoint to get a .zip version of a given log file
Add the previous_hours query parameter to the GET /api/statistics/snapshots endpoint
Create GET /api/settings/background-tasks endpoint to view all pending Background Task information
This currently just returns the pending function name and docstring; this will be changed
Change the HTTP method for explicitly setting the scheduler mode (/api/scheduler/type/{mode}) - POST has been deprecated, new method is PUT
Add snapshot query parameter to /api/webhooks/plex/rating-key endpoint
Reorganize all Webhook-related endpoints into a separate /webhooks/ router
Deprecate POST /api/series/sonarr/delete - new route is /api/webhooks/sonarr/series/delete
Deprecate POST /api/cards/key - new route is /api/webhooks/plex/rating-key
Deprecate POST /api/cards/sonarr - new route is /api/webhooks/sonarr/cards
Fix GET /api/available/version and GET /api/settings/version endpoints
Deprecate GET /api/statistics/ endpoint - new route is /api/statistics/system

v2.0-alpha.11.0
Released July 21, 2024

Major Changes

Begin implementing automated front-end testing with Cypress
Allow importing series poster, series backgrounds, and season posters via Kometa / MediUX YAML (this works for Emby, Jellyfin, and Plex)
Add ability to delete all Series which are not a part of any Sync
Adds a global setting called "Delete Un-Synced Series" on the Settings page
If enabled, TCM will delete the Series, Cards, and Source Images (if enabled) of any Series which is not included in any Sync
This is a potentially destructive setting - be careful before enabling. Deleted Cards and Source Images are not backed up by TCM
Add global option for the ImageMagick executable path
This option replaces the TCM_IM_PATH environment variable
This setting is only applicable to some Windows users
Significantly improve front-end error messages for Title Card validation failures - TCM will now display more "human readable" messages of the specific field validations which caused the creation to fail
Reorganize the Templates page
Move the preview cards to the top of the template (from the side) to allow the options to take up the full width of the page
Display extras in groups of three fields, not two
Join some input fields together
Remove the "Delete Missing" option for named Fonts - this was rarely used, not well documented, and largely superfluous
Add the TCM version number to backup filenames
Rotate logs every 12 hours or every 24.9 Megabytes (was just every 12 hours) in order to prevent logs from exceeding the default Discord upload size limit
Various security improvements
Generate a random encryption key on-device at boot time for TCM, rather than using hard-coded value
Encrypt all private Connection details (URLs and API keys) within the database, rather than keep them in plaintext
Do not send private Connection details in API responses even if the user is authorized
Properly redact secrets which may appear in exception tracebacks - this most commonly occurred in Plex API errors which include the X-Plex-Token as a header parameter
Redact secrets in order of descending length to prevent possible "leaking" partial substrings of the secret if contained in another secret - e.g. if you had an API key of ABC and ABCDEF, previously ABC could have been redacted first , resulting in DEF kept as-is in the logs

Major Fixes

Fix handling of dynamic Emby and Jellyfin database ID's
Series are now searched for without the year if not found by year (only applicable to Jellyfin)
Match Series by database ID's, not just name
Dynamically validate and update Series ID's to handle database changes
Update and overwrite existing Series Emby and Jellyfin ID's if newer ID's are found during the Set Series ID's Task
Catch and handle errors raised by invalid card type models during Card imports
Display the currently running Sync on Sync page (re)load
Prevent multiple Syncs from being run concurrently via the UI
Fix Card importing via File upload
Properly initialize the Kometa integration checkbox (if enabled) within the UI
Properly detect invalid TVDb API keys (and mark the Connection as invalid and disabled)
Use improved full-length traceback logging in log files , not just stdout
Fix Source Image gathering if TVDb is a specified source and has no images

Minor Changes

Add sidebar link to the Changelog (accessible from the Settings submenu)
Minor QOL improvements for extra inputs
Display the default value in the input's placeholder text
Add live color bubbles to all color extra fields
Add some QOL visual improvements to the Logs page
Add dynamic links for Series, Fonts, Templates, etc. when detected in log messages - e.g. a message mentioning Series 1 will include a link to the page for Series 1
Highlight matching text when filtering logs by the message
Significantly improve the format of traceback / error messages so they are much easier to read within the UI
Add minor formatting for redacted messages
Reorganize the Settings page - this is just an aesthetic change to improve logical layout of various settings
Pass the active user into the Connections page via Jinja2 template variable, not an API call - this will prevent page unresponsiveness if the authentication section is interacted with immediately after loading the page
Improve logging when parsing invalid Kometa YAML during Card imports
Print the ImageMagick command history if preview card creation fails
Improve ImageMagick magick command prefix detection during boot - TCM will now look at what prefix should be used in background and foreground threads (was just foreground)
Rename the "Mutli Library Filename Support" setting - now called "Multi-Library File Naming"
Log how many Series are returned from a Sync when run
Remove unused full_match_name and full_clean_name attributes from SeriesInfo objects
Add in-UI warning to verify Sonarr libraries before changing them
Group Fonts into sub-groups if there are more than 19 Fonts per section - e.g. if there are 20 fonts that start with A, then it will be broken into Aa, Ab, etc.
Remove the Episode image source attempt counter column from the SQL database
Initialize the Connections page with Jinja2 template variables, not API calls
Modify logging environment variables
TCM_LOG_STDOUT replaces TCM_LOG and adjusts the log level for the std (terminal) output
Add TCM_LOG_FILE to change the log level for file logging - default is TRACE
Add TCM_LOG_RETENTION to change how long logs are kept - default is 7 days
Add the HTTP status code and text to API request terminations - e.g. 200 OK
Display logos from TMDb in "order" sorted by language and resolution
Add right-click interactivity to Series in the home page tablular view (i.e. open in new tab)

Minor Fixes

Pin Pydantic dependency version to 1.10.17 to fix uvicorn server launch on Python 3.12.4
Use alternate randomized filenames for files downloaded during Kometa YAML parsing
Reset intervals to exactly 10 minutes if scheduled interval is too short (was resetting only the minutes field)
v1
Handle incorrectly written/formatted series record database version files
Correctly initialize the card quality slider color based on the currently selected value
Delay running Syncs by up to 5 minutes if a Sync is already running when the Task is executed
Recursively delete all content in Series source folders instead of just files (if globally enabled)
Handle objects specified without template ID's in the Episode card preview API endpoint
Improve handling of log messages without context ID's in the log message table
No longer add null to the context ID filter list when the blank cells are clicked
Do not allow blank context ID cells to be clicked (also remove tool tip text)
Only require unique Template ID's in New and UpdateTemplate objects
Add TVDb to the list of Connections to search in the internal Task to set the Series IDs
Properly handle blank results from TVDb when searching for a Series or Episode via external ID

Title Card Changes

Comic Book
Limit angle fields between 0 and 360 degrees
Cutout
Correctly parse the Blur Profile extra
Overline
Fix the episode text font size extra
Roman Numeral
Parse the roman numeral from the episode text directly so it can be modified with the Episode Text Format
Correctly display multi-line season text
Properly calculate overlapping text for titles with non-default interline spacing
Striped
Reduce default interline spacing by 20px
Improve handling of text boundary calculation for very tall text - no longer raise an uncaught exception if the text is taller than the midpoint of the image

Documentation Changes

Improve installation instructions for Unraid users by adding details on how to create template within the UI
Add TVDb section to the Getting Started page navigation
Add a note about how to add ghcr.io credentials to various Docker managers
Fix command on updating container using Docker compose
Update "Add Series" documentation to reflect new layout and removal of the "Quick-Add" concept

API Changes

Create POST /api/scheduler/type/{mode} endpoint to explicitly set the Scheduler mode
Fix GET /api/settings/version endpoint
Create POST /api/reset and POST /api/auth/reset endpoints to reset all of TCM (or all authentication) - these endpoints are disabled for normal usage, and only enabled when TCM is launched in test mode
Remove explicit 200 and 201 status codes from various /api/fonts endpoints
Add imagemagick_executable field to the UpdatePreferences and Preferences API schema
Remove delete_missing field from the UpdateFont, NamedFont, and BlueprintFont API schema
Add default field to the Extra API schema
Modify all GET /api/connection/* endpoints to no longer return plaintext URLs or API keys

v2.0-alpha.10.1
Released June 24, 2024

Major Changes

Revise the add Series interaction to no longer launch a separate modal; also removing the "quick add" concept
Add import from MediUX (i.e. Kometa) button to the Series page
Allow connecting to TVDb
Can be used as an Episode Data Source. This will be similar to Sonarr, but different episode orderings can be used (such as Official, Absolute, etc.)
Can also be used as an Image Source, but this is not recommended as they only provide a single (generally low quality) image per-Episode
Add SQL schema migration 2c1f9a3de797 to implement required database changes
Add ability to filter Blueprints by the creator name on the Add page
Clicking a given Blueprint's creator will auto-fill and search by that creator
You can also type by:{creator} or creator:{creator} in the search field - e.g. by:CollinHeist
Also search by the Series "clean" name via the search box - e.g. 'Shōgun' can be found by typing 'Shogun'
Publish ghcr.io Docker images for the linux/arm64 and linux/arm/v7 architectures - huge thanks to mchangrh for putting in the work to make the ARMv7 image possible
Reformat changelog - remove "popup" and create new dedicated changelog page which can accessed from the bottom of the settings page

Major Fixes

Skip Plex episodes which do not have a season or episode number when setting Episode ID's
Fix updating the Jellyfin Series ID via the UI
Fix poster selection from TMDb - was selecting the lowest priority poster
Revise CleanPath subclass implementation to work on some newer versions of Windows 11
Fix non-dragging of Cards into Card upload dialog
Fix disabling TMDb Connections from the UI and API
Correctly handle PNG posters uploaded via the UI and API

Minor Changes

Use improved unicode character replacement suggestions for Font analysis
Removed persistent record of "warned" series from Plex
Use improved database ID matching to Plex episodes when loading Cards
Quote the custom ImageMagick executable path in command execution
Add trace logging when placeholder titles are ignored from Sonarr
Log all relevant environment variables during program boot
Add logging of episodes which are not loaded when loading Cards into Plex
Update versions of most dependencies (all minor, no re-install required)
Change web request caching logic to not cache by request quantity but by request time
Slightly reorganize the root directory global settings (cosmetic change only)
v1
Rename the plex_libraries setting to libraries (old name is still supported)

Minor Fixes

Handle sub directories in the source folder during Source Image deletion
Fix some typos in extra tooltips
Remove tasks from the scheduler before they are re-initialized
Fix text overflow which could occur for some very long series names on the home page in tabular view

Title Card Changes

Anime
Add "Episode Text Font Size" extra - note this behaves a bit weird for much smaller or larger values
Add built in character replacements for * and ♥
Formula 1
v1
Also use under f1 card type identifier
Graph
Correctly handle hidden episode text
Actually implement the "Omit Gradient" extra
Music
Limit the music player width to 3000px (was 3200)
Do not blur beneath the player when the full image is blurred - minor speed improvement
Notification
Do not blur beneath the notification(s) when the full image is blurred - minor speed improvement
Poster
Correctly apply the "hide episode text" logic
Shape
Change the shape scalar multiplier to 130% for multi-line titles (was 125%)
Handle math domain errors when the circle size is too small (could happen on very small shapes or very long text)
Tinted Frame
Fix handling of non-path custom episode text fonts

Documentation Changes

Revise references to PMM as Kometa in the Getting Started Plex page
Revise Getting Started to not create two Templates and only create one
Create custom 404 page
Add page for the Shape card
Begin moving old version 1 documentation over to new site
Update some Getting Started pages to reflect new page layouts
Rewrite Getting Started guide to prefer pulling the ghcr.io Docker packages, instead of the self-build
Add TVDb to Connections part of Getting Started tutorial
Rewrite series user guide page for new layout

API Changes

Create new POST /api/import/series/{series_id}/cards/mediux API endpoint to import Kometa / MediUX YAML cards
Create new API endpoints associated with TVDb Connection types
POST /api/connection/tvdb/new - create a new TVDb Connection
GET /api/connection/tvdb/all - get all TVDB Connection details
GET /api/connection/tvdb/{id} - get the Connection details of a specific interface ID
PATCH /api/connection/tvdb/{id} - update the connection details for TVDb
Change PlexConnection.integrate_with_pmm model field to integrate_with_kometa
Change PlexConnection.logo_language_priority model field to logo_language_priority
Deprecate POST /api/sources/series/{id}/backdrop endpoint
Create new POST /api/sources/series/{id}/backdrop/tmdb and /api/sources/series/{id}/backdrop/tvdb endpoints
Add creator query argument to the GET /api/blueprints/query/all endpoint to filter by Blueprint creator
Modify GET /api/series/search endpoint to perform a match on the Series clean name (if name argument is provided)

v2.0-alpha.10.0
Released May 11, 2024

Major Changes

Completely redesign the Series page
New page dedicates much less visual space to the poster and action buttons
All the prior functionality is still present (if a bit shifted around)
Includes a live Card preview which can be used to display present Series and Episode-level changes without saving and remaking a Card
Perform hash validation on all remote card type Python files before they are loaded into the module space
Add functionality to directly import Title Cards as "textless" when uploaded via the Files dialog
Performance improvements on the Templates page
Hard-code available style list so they do not need to query the availability endpoint
Move some asynchronous function calls to after the boilerplate Templates have been added to the page
Only query the available Font metadata, not a full query of all Font information
Allow filtering Blueprints by Series name
Allow specification of a custom ImageMagick .exe executable path (to use instead of the builtin magick or convert call) by defining the TCM_IM_PATH environment variable
Create Striped card type
I spent way too long creating a very customizable way to adjust the stripe pattern - see the docs for details
Rework up triangle and down triangle shapes in the Shape card
Old triangles were the same width and height (i.e. an isosceles triangle) - new triangles are equilateral
Old title text was positioned at halfway up the triangle by height - new text is halfway up by area (e.g. one third by height)
For example, old vs. new:
This was not done originally because the math to determine the placement of the title and season text is significantly more complicated
The old style of triangle generation cannot be used anymore (sorry!)

Major Fixes

Refresh remote card types after a Blueprint is imported
Fix downloading Source Images from Emby via the UI
Match existing Fonts and Templates by content, not name, when imported via Blueprints
Fix Cards ending up hidden when the refresh button was clicked
Do not display a cached logo on the Series page
Fix creation of new Sonarr connections when no existing Emby, Jellyfin, or Plex connections exist
Correctly utilize per-connection localized image rejection (was being ignored)
Use versioned CSS files on the frontend - this should prevent some CSS caching issues caused by switching versions
Properly handle library names with special URL query characters like & in library operations done via the UI

Minor Changes

Refresh Card previews when the image is clicked on the Font and Template pages
Change sidebar text of the add Series page to Add (from Add New)
Scroll to the top of the Card preview display when navigating between pages
Add click interaction to query available Blueprints when the name is clicked
Convert the preview Title Card to .jpg from .webp during Blueprint export (if .webp is the selected card extension)
Add the BACKSLASH builtin variable to use \ in format strings
Add a button to the home page to swap between the table and poster view
Remove the x-axis grid lines from the graphs on the Graphs page
Add input to the graphs page to modify how many days are displayed
Change all in-UI references from PMM to Kometa
Return non-English posters from TMDb if they are textless or the language is present in the connection's language priority setting
Add count on the number of Blueprints which are available for a given Series to the Add page

Minor Fixes

Do not export Series.auto_split_title in Blueprints if default (True)
Fix logo and backdrop visual error when first downloading them via the modal
Fix table headers overlapping the search results on the Series page
Remove the blacklist button from Blueprints displayed as part of a Set
Fix some changelog typos
Fix some minor display issues when viewing some Blueprint Sets
Handle bad types of external IDs (namely IMDb) from Emby and Jellyfin
Properly display an in-UI toast for when no posters are found for a Series
Improve handling of corrupt posters found when adding a Series
Do not hide the Blueprint pagination menu if only one page of results is displayed (could result in the page menu permanently disappearing until reloading)
Add vertical margin between home page posters and pagination menu
Handle uncaught exceptions raised during Card creation in the scheduled task - should prevent singular bad cards from stopping all Card creation

Title Card Changes

Anime
Add kanji font size and stroke width extras
Banner
Adjust the index text placement down 4 pixels
Do not adjust the index text placement with the title vertical shift
Comic Book
Add support for mask images
Formula 1
Fix frame year extra
v1
Fix custom font evaluation to no longer look at irrelevant font attributes
Notification
Add the box adjustments extra
Make the index text interline spacing, interword spacing, and kerning static (not tied to title characteristics)
Overline
Fix line width calculation when a custom kerning is specified
Add episode text font size extra
Fix index text placement when title text is completely hidden
Shape
Correctly apply custom interword spacing
Correctly parse non-integer Shape stroke widths
Draw shape below title and season text (not above)
Correctly evaluate multi-line title height in the text dimension analysis
Completely rework triangle shapes (see Major Changes)
Tinted Frame
Parse {title_font} within the episode text font file extra to indicate TCM should use the same font file as the title text (saves specifying the full path)

Documentation Changes

Add updated scrolling marquee for all available card types to the documentation home page
Replace image for the Series page to reflect new view
Add page on mask images
Fix keyboard shortcut icons on the Blueprint Set page
Begin page on the Anime card
Add documentation on the Font title split modifier option
Add ImageMagick installation instructions to the getting started page
Create card type page for the new Striped card
Use titlecardmaker.com hosted images for all card previews on the home page
Lazy load all card previews on the home page

API Changes

Create API endpoint PUT /api/series/series/{series_id}/copy to copy the Series config from one Series to another
Make the year argument optional in the GET /api/blueprints/query/series endpoint

v2.0-alpha.9.1
Released March 27, 2024

Major Changes

Allow Series level toggle of title auto-splitting
Add SQL schema and migration f1692007cf8a to add the Series.auto_split_title column
Migrate all True Episode-level splits to null
Allow named Fonts to affect after how many characters TCM will attempt to split titles into multiple lines
All Named Fonts can specify a "Title Split Modifier" which is the number of characters to add/remove from the card's default split amount.
For example, if a Card typically splits lines after 25 characters, specifying a modifier of +5 would mean the titles would be split after 30 characters.
This can be used to give more fitting behavior for Fonts which are very small or very large
Add SQL schema 1be1951acc40 to add the Font.line_split_modifier column
Allow card types to adjust the title split behavior on-the-fly
After how many characters a Title is split is now scaled by the specified font size (if the default Font is specified)
Separate the watched and recently added Tautulli agents
Allows only enabling the recently added trigger; or enabling both
Add a "username" input to the Tautulli setup modal so the watched agent can only be triggered when you watch content
Old agents will still work
Create a "Missing" page (/missing) which lists all the Episodes which do not have an associated Title Card
Allow creation of Blueprint "Sets"
A "Set" is a group of associated Blueprints. These can be Blueprints which all use the same style, or are part of the same franchise, etc.
For example, I created a Set of all my Scooby-Doo Blueprints as they all use the same design, Template, and Font
If a Blueprint has any associated Sets, it will be displayed on the Blueprint itself
Sets of existing Blueprints can be created directly on the Blueprints GitHub via this issue form.
New Blueprints can be assigned to existing Sets when they are submitted
Add functionality to upload Cards directly to a Series to import them
Display a small count number - e.g. (3) - in the Blueprint tab menu on the Series page. This count represents how many Blueprints are available for the Series (idea from bugmacnx)
Begin redesign of the Series page; currently can only be accessed by defining the TCM_NEW_SERIES_VIEW environment variable as TRUE

Major Fixes

Query and delete old Loaded assets by Episode ID (not Card) when loading Title Cards
Fix Episode title translation for various regional languages which were using their "fallback" languages
Correctly parse the global card quality setting
Handle TMDb movie IDs in Emby episode parsing
Do not link the edit of Episode and Series extra fields

Minor Changes

Do not instantiate Title objects during EpisodeInfo initialization - minor speed improvement
Do not add intermediate background task queue for Card creation - minor speed improvement
Add airdate column to the Episode data tables (advanced mode only)
Only keep log records for one week, not two
Do not include the delete_missing attribute in Font exports in Blueprints if True
Scroll to the top of the page when navigating between pages of Blueprints
Add "rich" representation of all SQL models to tracebacks
Force delete and re-create the Card when the preview is right-clicked on the Series page
Add global option to enable/disable Card interactions like the left- and right-click functionality on the Series page
Rename "Sync Specials" setting to "Enable Specials" to avoid conflation with the "Sync" feature
Remove the support button from the header
Improve logging for changes to an existing Card config
Change update info frequency on series page to 90 seconds (from 60)
Remove preferences.yml YAML import from the importer page - it is way easier and less error prone to just adjust the settings directly.
Indicate the loading status during Episode extra changes
Add click interaction to the Source Image previews - modal will be launched when the preview image is clicked

Minor Fixes

Fix the "Forgot Password?" link on the login page - was using old website URL
Properly set the modal headers when browsing logos and backdrops
Initialize the log level dropdown before querying for Logs so it can be interacted with while the page loads
Use a centered Unicode bar character | in the library dividers for better vertical alignment
Do not display Loaded asset counts which exceed the Card count
Allow the Series Episode data table to take up the full container width on very large displays
Remove blank fields from Blueprint JSON exports
Fix tooltip typo in the Music card
Fix link typo in changelog
Fix the next/previous Episode buttons in the edit Episode extra modal from resetting after submitting changes

Title Card Changes

Anime
Add Kanji stroke color extra
Correctly scale the kanji stroke width with the Font stroke width
Banner
Change lower title text margin to 40 pixels (from 20)
Music
Change the default long-line truncation behavior to three lines (from two)
Adjust the title split cutoff based on the specified player width
Limit player inset between 0 and 1200 pixels
Tinted Glass
Add rounding radius extra

Documentation Changes

Add documentation on Blueprint Sets
Revise Tautulli getting started docs to mention new separate agents

API Changes

Modify the GET /api/statistics/snapshots endpoint
Add previous_days query parameter to control how many days of snapshots to return
Add slice query parameter to every n-th snapshots to return
Deprecate and remove POST /api/import/series/{series_id}/cards endpoint
Create new POST /api/import/series/{series_id}/cards/files endpoint to upload Card files directly
Create new POST /api/import/series/{series_id}/cards/directory endpoint to import Cards via directory searching
Modify all Blueprint database dependency query arguments (affects all endpoints which have this injection)
Rename refresh_database query argument to force_refresh
Add allow_refresh query argument on whether to allow a refresh from an "expired" database
Create POST /api/cards/preview/episode/{episode_id} endpoint to create a preview Card for a given Episode
Functionally equivalent to the /api/cards/episode/{episode_id} endpoint, but does not write to the database and writes the file to the preview directory
Create GET /api/episodes/series/{series_id}/overview endpoint to get "overview" info of a Series' Episodes

v2.0-alpha.9.0
Released March 10, 2024

Major Changes

Create new Music card type
Create new Notification card type
Create new Formula 1 card type
Display Source Images from Emby and Jellyfin within the UI when browsing images per-Episode
Add option to specify any number of global default Templates
These Templates are a priority below all other overrides, but just above global settings
This should allow very fine-tuned control of all Series in TCM (especially when used with filters)
Completely redo how extras are displayed in Templates, Series, and Episodes
All available extras are shown in a tab-separated section
Extra descriptions and tooltips are now always visible
Display all log available log files within the UI (on the /logs page)
Add color "bubbles" to Extras and alongside Font color inputs to give a small display of the indicated color
Add buttons to analyze the palettes of logo and backdrop files within the UI
Allow specification of global per-card type extras
Significantly improve the text height measurement algorithm
Measure text metric ascent and descent instead of directly reported height (these are unreliable, for some reason)
Account for non-0 font interline spacing in height measurement for multi-line text
In my tests, this meant that manual height-adjusted components - like the bounding box in the Landscape, Comic Book, Tinted Glass, and Music cards; or the kanji placement in the Anime card - aremuchmore accurate
Add previous and next arrows to Episode translation/extra modals to allow quickly navigating between sequential Episodes

Major Fixes

Fix the localized image setting for TMDb Connections
Add colorama and win32-setctime to Pipfile to fix dependency installs in non-Docker on Windows
Do not require a Source Image when creating Cards with the Logo card
Fix Emby Series ID assigment
Allow clearing Series IDs within the UI
Apply more strict Episode database ID matching to prevent a single "bad" database ID from resulting in false matches - especially for multi-episodes within Plex which are tied to one episode within TVDb / TMDb / IMDb
If more than one database ID is present, then any two ID matches are required in the database query
Fix for non-Docker Window Title Card previews
Handle Series names with apostrophes
Still query non-TMDb Connections for Source Images if the Episode does not exist on TMDb
Add missing Episode Font kerning column to Episode data tables
Fix the specification of per-Episode size, and stroke width within Episode data tables
Fix deletion of associated Loaded assets when removing a Connection
Correctly reset the global Episode Data Source when a Connection is deleted
(Potentially) fix some instances where a very long running Task (or busy DB) could cause all Tasks to be skipped and not rescheduled; resulting in no subsequent Task runs (until TCM is restarted)
Fix Jellyfin Series ID assignment incorrectly setting the Emby ID

Minor Changes

Group all Fonts that start with a number under the same # header
Add the internal Font asset file path to the file name label text
Change backup filename format - old backups from before this change will need to be manually deleted
Reduce main page left padding by 20px
Adjust the Font and Template column widths
Add a small color live indicator for above the Font color customization input
Simplify Form parsing for Series and Templates
Skip parsing log files if the file modification time is before the specified after parameter
Change API query start/end messages to TRACE level
Add any custom season title under the season_title Card variable (can be used in format strings)
Improve background task execution:
Do not stop pending Tasks after exception is raised
Improve traceback printing for any raised exceptions
Improve Template previews:
Reflect custom episode text formats
Reflect card-type default season and episode text (was always "Season 1" and "Episode 1")
Improve exception logging when CardType validation fails
Log when a Task is "bad" (e.g. scheduled in the past) and is fixed
Print ImageMagick command history as string, not bytes
Resize posters with Pillow, not ImageMagick, so poster generation does not fail when ImageMagick is not installed
Use fuzzy searching when finding mask images in Card creation
Look for masks like (name)-mask.* or (name)_mask.* to support any image type, and more generalized file naming
Search for series-wide mask mask.* file if Episode-specific mask is not found
Removed animation from graph page as it made toggling individual elements slow
Add format_date() format function to customize the format of an airdate in episode text (or anything else)
Refer to Plex labels as "labels" and not "tags" within the help text in Plex Sync modals
Add Exception traceback to log entries on the log page
Remove Download Page button from the logs page
Increase the bullet point margin in the changelog
Make the changelog full screen
v1
Allow multi-line season titles on season posters made with the mini maker

Minor Fixes

Fix the Series sort order when searching by name
Remove redundant Series name / info in some log messages
Fix annotated text for when episode text is hidden in the Standard card
v1
Properly detect custom Fonts archives from extras for the Comic Book card
Correct the description text for the home page size setting
Do not set the internal use_(Connection) variables if all Connections of that type are disabled
Correctly resize the Source Image when the border is hidden in the Marvel card
_Actually_ expire login tokens after 7 days, not 2
Correctly detect local episode text font files in the Tinted Frame card
Handle exceptions raised during poster downloads
Handle invalid API response from Jellyfin when querying Episode watched statuses
Add generic metric data to Card preview generation
v1
Fix SVG to PNG logo conversion
Handle AttributeError caused by bad TMDb API returns in the TMDb find Episode logic
Properly evaluate missing Source Images for card types which do not use unique Source Images (namely the Poster card)
Resize poster thumbnails uploaded directly via API to 750 pixels, not 500
Resize mask images (to 3200x1800) before applying to Title Card
Fix Card importing when a directory is not specified

Title Card Changes

Anime
Color kanji stroke using the kanji color, not title color
Banner
Increase right margin between text on bottom line of title text to 55 pixels (from 30)
Comic Book
Fix index text box placement (was being offset by index text width, not height)
Graph
Limit graph inset between 0 - 1800 pixels
Limit graph radius between 50 and 900 pixels
Force the graph width to always be less than or equal to the graph radius
Landscape
Add box width extra
Logo
Add logo size and logo vertical shift extras
Do not create intermediate resized logo image, instead using an inline image queue (will speed up Card creation a lot)
Add episode text color extra
Add episode text vertical shift extra
Olivier
Add omit gradient extra
Roman Numeral
Fix season text height calculation for multi-line season text
Shape
Limit the shape inset extra to between 0 - 1800 pixels
Add extra for shape stroke color and width
Standard
Add episode text vertical shift extra
Textless
Make source images optional to make the card work easier with Card imports
Tinted Frame
Change the default frame width to 5 pixels (from 3)
Tinted Glass
Move all text down 50 pixels by default
Add vertical adjustment extra to control vertical positioning of text

Documentation Changes

Add documentation to home page on how to update and switch branches
Add card preview URLs for missing card types to the home page carousel
Create new pages for the new Notification and Music cards which list and give visual examples of supported customizations
Remove unrendered nav items in site building

API Changes

Add new TRACE LogLevel
Add exception field to LogEntry model

v2.0-alpha.8.1
Released January 29, 2024

Major Changes

Add previous and next buttons to the Source Image modal to easily switch between Episodes when manually selecting Source Images
Display Series-relevant logs on the Series page
Add new Reference File Template filter argument
This can be used to filter the Template by the existence of an arbitrary file
Add new global "Card quality" setting
This setting adjusts the JPEG / PNG compression quality used in Card creation
The default value is 95 (slightly higher than the default ImageMagick card quality)
Only applies to .jpg, .jpeg, and .png card extensions
Rewrite how cardinal and ordinal numbers are specified
Old-style _cardinal and _ordinal variable postfixes are removed
New style is to call the to_cardinal() and to_ordinal() functions in the format string
Add SQL data migration to automatically convert any existing season titles and episode text formats to this new syntax
All non-English cardinal/ordinal numbers will need to be changed manually - e.g. {season_number_cardinal_fr} should now be {to_cardinal(season_number, 'fr')}
Remove global "translation language" option
This change will speed up and allow for greater flexibility in Card creation
Rewrite all internal logging
No longer use builtin logging module, use loguru
Enable better traceback printouts (tracebacks now display variable values)
Log data in .jsonl (JSON-line) format to better handle multi-line log messages
Do not write API context IDs to the stdout/stderr output
Allow for Sonarr Sync filtering by Series root folder

Major Fixes

Fix Series deletion in in Sync delete API endpoint
Handle Cards without Episodes in 32ef3d4633ce SQL schema migration
Correctly load Title Cards for Series with more than one library when not in library-unique-Card mode
Correctly apply Series translations when the Series has no libraries
Do not allow multiple Syncs to run at once (which could cause a Series to be added multiple times)
Do not auto-sort Font replacements
Add SQL schema 3122c0553b1e to separate the Font.replacements JSON column into the two paired Font.replacements_in and Font.replacements_out list columns

Minor Changes

Allow advanced format string specifications in:
Season sub folder naming (this will allow users to omit season sub folders completely by specifying format as {''})
Season title ranges
Add more verbose logging for when a Translation "fails"
Reject "fake" translations which exactly match their original titles
Update tmdbapis and pillow dependency version(s)
Change the default error toast display time to 7.5 seconds (from 5.0s)
Add new titlecase() function to format strings
Add new to_short_ordinal() function for format strings

Minor Fixes

Commit Series changes to the database before refreshing card types
Handle Plex API errors raised during watched status querying
Delete unlinked Episodes in clean database Task
Auto-increment Series IDs to avoid any cache-clashes after deleting a Series
Handle transparencies of 0.0 in Inset card
Correctly utilize custom Font interline and interword spacing in the Inset card
Correctly utilize custom Font interline spacing in the Banner card
Correct the display toast text when manually starting a Sync
Fix the index text banner shift extra in the Comic card
Add .ttc fonts to the whitelist for the Font file upload input
Import Blueprint within background task when importing Series and Blueprint to avoid missing Blueprint Episode overrides if Series Episode data is still being refreshed
Use """" syntax in format string evaluation to allow for " and ' characters

Title Card Changes

Anime
Add the kanji color and episode stroke color extras (contributed by Reicha7)
Do not apply custom Font stroke widths to the kanji text
Graph
Reduce the default graph text font size from 75 to 70
Tinted Frame
Automatically search for episode text font files (if specified) next to the Source Image; this means these Font files can be imported directly via Blueprints
Allow specification of "random" frame colors - specify as random[color1, color2] - e.g. random[red, blue] will randomly select red or blue

Documentation Changes

Create a Terminology page to the Getting Started tutorial to explain some of the basic terms of TCM
Create a Variables page which details all the available variables for use in format strings
Modify Getting Started commands to list the single-line docker commands (was causing issues on Windows)

API Changes

Allow pipe (|) separated query strings in the log endpoint (GET /api/logs/query)
Change log level names to their uppercase equivalent

v2.0-alpha.8.0
Released January 17, 2024

Major Changes

Add support for multiple of each type of Connection - e.g. two Sonarr servers, two Plex servers, etc.
Rewrite a majority of the backend to support an arbitrary number of Connections and libraries
Automatically convert "Episode is Watched" Template Filter arguments
Allow for multiple libraries per-server per-Series and library-specific Title Card creation - e.g. you can now have a Plex TV, TV 4K, Emby TV, TV 4K, and Jellyfin TV, TV 4K library for a single Series (but why would you?)
Add global option to enable per-library Card naming; this is required to keep separate Cards with separate watched statuses per library
Display a Card's library name in the hover text within UI (if setting is enabled)
Display error on Settings/Connections sidebar when a Connection is invalid
Sonarr libraries will need to be re-assigned
Rewrite Tautulli notification agent integration and endpoint to work with multiple Plex servers
Tautulli is now a sub-component of a Plex Connection, no longer a separate section on the page
Tautulli agents will need to be re-created
Create new Banner, Graph, Inset, and Shape card types
Combine "Refresh Episode Data," "Download Source Images," and "Add Translation" tasks / functionality into the "Create Title Cards" task / interactions - this replaces the "Process Series" buttons/terminology
This was done because each of these tasks was meaningless without Card creation, and if triggered out-of-sync, then would trigger needless Card re-creations
Remove "Process Series" button from Series page
Change default interval of "Create Title Cards" task to every 12 hours
Create tabular view for home page (default view is table; can be toggled in Settings)
This view allows performing "batch" operations to multiple Series at once
Shift-clicking/selection functionality is implemented
Create Snapshot SQL table where TCM will periodically take a "snapshot" of your DB
This snapshot notes how many Episodes, Series, Fonts, Title Cards you have; as well as total number of Title Cards created, etc.
These snapshots can be visualized into a fully interactive graph by clicking View Graphs at the bottom of the home page, like so:
Rework home page statistics
Now they are located at the bottom of the home page
Display more types of statistics (e.g. number of Fonts, Templates, etc.)
Automatically redact "secrets" from logs (this applies to URLs and API keys)
Allow arbitrary Python code inside format strings - not just base str.format data
Can access any Card variables, as well as NEWLINE for \n, and to_roman_numeral to convert a number to a roman numeral
For example, a title text format of {NEWLINE.join([' '.join(['.'.join(word) for word in line.split(' ')]) for line in title_text.splitlines()])} will automatically insert a period between all non-line splitting letters of each word in the title text - I used this to create Title Cards for Friends like so:
Allow pre- and post- case-function application (i.e. upper/lower-case) specific Font character replacements
Any character replacements prefixed with pre: or post: will only apply that replacement once
Add new global settings:
Option to delete a Series' Source Images when the Series is deleted from the UI
Option to delete any "missing" Episodes which are in TCM butnotin the assigned Episode Data Source
Option to reduce in-UI animations (for performance and/or accessibility)

Major Fixes

Fix Episode source image uploading via UI
Fix source image downloading from Emby
Utilize SQL cascade orphan deletion to clean up Episode, Card, and Loaded assets when a Series or Episode is deleted
Handle invalid cron expressions in Scheduler table initialization
Properly utilize a Series' sort name in the repository URL evaluation
Properly import Blueprints with multiple pre-existing Templates and Fonts
Correct Template ID assignment in the add new Episode endpoint
Handle new types of Tautulli API keys (was hexstrings, now can be any string)
Correct small-screen size detection (was using monitor size, not window size)
Handle bad formatting (mainly newlines) in Scheduler cron expressions
Handle explicit line breaks (\n) in season and episode text
Correctly parse some language codes in title translation
Automatically retry un-initialized Connections when making requests (previously would require a restart of TCM)
Reject bad Source content when manually selecting and uploading an image via the UI
Prevent one Task from running multiple times if triggered manually and then a scheduled trigger occurs
Escape backslash charactersbeforeother command characters to handle titles that start and end with quotes (")
Add a new scheduled Task to "clean" the database and remove duplicate and outdated entries
Correctly identify changes to the Card source file (i.e. switching between Art and Unique styles)

Minor Changes

Also display images from Plex when browsing Episode Source Images within UI
Utilize proxied URL to avoid sending the header X-Plex-Token in the URL (for MITM)
Update Source Image download endpoint to reverse-proxy Plex URLs
Do not ignore temporary / placeholder titles from Sonarr or Plex if title matching is enabled - this means Cards will be created with titles like "TBA" if triggered via an integration (Tautulli or Sonarr webhook), but will be updated during the next Title Card creation (if new titles are available)
Add row-marking to Episode data tables if that Episode is missing a Card
Trigger Card (re)creation by clicking on it in the Files tab of the UI
Add 'Episode Extras' Template Filter variable (supported operations are listed in the docs
Utilize SQLAlchemy 2.0 ORM mappings in all tables for better TA and intellisence
Utilize randomly selected Title Card as preview in Blueprint export to add variety when exporting multiple Blueprints for a Series (was always the first Card)
Compress images with Pillow, not ImageMagick
Change input background color for dark mode to #e4e4e4 from #ffffff (for those with picky eyes like me)
Change search icon for browsing Source Images in UI
Automatically restore from backup if SQL migration failed during boot (to avoid future migration changes created by existing intermediate alembic tables)
Change Card SQL table primary key to auto-increment (meaning Card IDs will not be reused)
Log new Episodes in batches (e.g. Added 20 new Episodes instead of 20x Added new Episode ..)
List some builtin variable overrides in extra dropdowns
Report filesize statistics in *ibytes not *ibibits
Automatically open new Font accordion after creation
Allow and handle multi-season season title ranges - e.g. s1e2-s2e3
Add ability to force refresh the Blueprint database by right clicking the Browse Blueprints button on the Add Series page
Display the Source Image data as a table by default
Log Title Card loading as it happens, not after the fact
Do not use background tasks for manual Series Episode data refreshing
Add input for TCM URL to the Tautulli setup modal (for users whose Web UI is not the same URL as their TCM backend)
Log when there are no title translations available from TMDB
Create (and make available) various "metric" data, like:
season_episode_count as the number of Episodes in a season; season_episode_max as the maximum episode number in a season; season_absolute_max as the maximum absolute episode number in a season; series_episode_count as the total number of Episodes in a Series; series_episode_max as the maximum episode number in a Series; and series_absolute_max as the maximum absolute episode number in a Series
Use Debug log level by default when loading the logs page
Expire all login tokens after 7 days (was 2)
Add new Episode Identifier (e.g. S01E03) Template filter to easily allow filtering by specific Episode(s)
Change logging context IDs to 6 characters (from 12)

Minor Fixes

Display less pagination menus on the files tab to avoid overflow for Series with more than 100 tabs
Correctly identify (and do not display) blank change logs
Query Episode watched statusesbeforeSource Image selection (in case some Template filter or styling changes the effective source or style)
Handle bad Episode data from Jellyfin (caused by bad Series ID)
Reduce login animation speed by 300ms
Do not require Source Image to exist for Roman Numeral card creation
Correctly calculate the bounding box boundaries when using a custom interword spacing with the Landscape card
Fix kanji vertical spacing for multi-line titles with custom Fonts in the Anime card
Handle more types of generic uncaught exceptions from the TMDb API
Refresh Card and File data after Episode deletion
Only wait 5 seconds to delete intermediate Blueprint files (down from 15)
Fix pyyaml package version 6.0.1 to fix cython bug present in 6.0.0
Unescape \( and \) in ImageMagick commands on Windows
Remove placeholder elements if Series search fails (to avoid appearance of permanent loading)
Handle search results without an assigned watch status in Emby and Jellyfin
Do not stack Font replacement and season title range input fields on mobile
Add minimum 5 second delay between adding Series on the front-end
Do not add Source Image HTML elements for images which do not exist
Correct the Blueprints repository link on the "no Blueprints" popup
Add charset-normalizer requirement to Pipfile (fixes some Windows installs)
Add pre-pool pinging to DB connection creation, and change connection timeout to 30 seconds - should help with multi-threaded DB reliability
Add poster filesize to the Series poster URL to prevent bad browser caches
Fix IMDb ID parsing from Emby
Do not buffer Python logging (fixes batched logging on some machines)
Commit to the Database after each Sync to avoid potential duplication of Series
Handle scheduled Tasks whose "next run" is in the future during boot
Correct the Episode extras modal when an Episode has >1 extra
Fix the Template preview generation for when an explicit style is indicated
Display extras from local Card types in Extra dropdown fields

Title Card Changes

Generalize mask overlays, now "mask" images can be added to (almost) every single type of Card - for example:
Calligraphy
Add a shadow color extra
Reduce the maximum logo height to 725px (From 750px)
Cutout
Allow transparent overlay colors in Cutout card
Divider
Add a Text Gravity extra
Landscape
Change the shadow opacity to 85% (was 80%)
Add a shadow color extra
Enable the bounding box (and use box darkening) by default
Overline
Change the default line thickness to 9px (from 7)
Adjust default interline spacing for title text when the line position is bottom
Standard
Add episode text font size extra
Star Wars
Add support for custom Font vertical shifts
Tinted Frame
Position the logo below the frame, index, and title text in the Tinted Frame card
Add a drop shadow to the logo when specified as the middle element
Add a shadow color extra
Change the shadow opacity to 85% (was 80%)
Shift top index text down 3px
Utilize even title line splitting
Change the title splitting length to 42 characters
White Border
Add episode text font size extra
Add border color extra

Documentation Changes

Move setup instructions to the Getting Started landing page
Add scrolling image marquee to the home page with example screenshots from the UI
Stylize references to in-UI buttons
Create Templates User Guide page
No longer publish docs to RTD - now all docs are on titlecardmaker.com
Create Logs User Guide page
Replace doc .png assets with .webp for smaller filesize and faster loading
Rewrite Connection docs to reflect multi-connection support
Create Scheduler User Guide page
Revise Getting Started instructions to explicitly mention the TitleCardMaker-WebUI install directory
Add note about Docker "invalid reference format" errors and potential fixes

API Changes

Change default page size for all paginated API endpoints to 100 (from 250)
Add API endpoints to perform batch operations like Series deletion, Title Card deletion, un/monitoring, Card loading, etc.
Standardize API endpoints in the /series router to match other routers
Create API endpoint to delete an Episode's Source Image file(s)
Always force reload Title Cards in trigger API endpoints
Only refresh card types in Episode PATCH endpoint if change occurred
Do not perform unmonitored Tasks in the process Series endpoint
Add API endpoint to delete a Series within TCM via the Sonarr delete-series API webhook
The webhook should be configured to POST to {TCM URL}/api/series/sonarr/delete
Do not always re-query Episode watched statuses in Card creation endpoints

v2.0-alpha.7.0
Released November 8, 2023

Major Changes

Use new logo
Major documentation revisions
Relocate all v2 documentation to titlecardmaker.com
Create dynamic auto-generated "social cards" for richer link previews in Discord (and other site) - for example:
Use site-wide banner for navigation, move table of contents to sidebar (more room for content)
Add various pages (including starter Docker and Docker compose pages)
Various Blueprint improvements
Allow multiple preview files on all Blueprints - hovering over the preview will show a small animation indicating >1 preview file which can be cycled through by clicking
Allow arbitrary files to be added to Blueprints. These files are then downloaded into the relevant Source directory when imported
Add toggle to the Blueprint browser to only show Blueprints for Series which you have already added to TCM
Add toggle to the Blueprint browser to exclude Blueprints which have already been imported (does not work retroactively)
Limit the height of Blueprint description fields
Add pre-populated database IDs to Blueprint issue forms (when opened via the UI)
Relocate repository to TitleCardMaker organization - now at TitleCardMaker/Blueprints
Use "fuzzy" string matching in search toolbar (using Levenshtein Distance between strings)
View Title Cards and Source Images within the UI (on the Files tab of a Series' page)
Added ability to analyze custom Font files and make character replacement suggestions
New Analyze Font Replacements button which performs an analysis of the Font for missing characters and makes suggestions for replacements (and warns about irreplaceable characters)
Suggestions now look to decompose Unicode characters in their normalized equivalents when searching for replacements - e.g. if é is missing, it will look for É, e, then E, etc.
Font analysis now looks at empty glyphs in addition to missing glyphs - this should catch instances where the Font was created with blank spaces instead of the glyph being omitted
The analysis looks at the titles and translations of all Episodes associated with (even by proxy) the Font
Allow for card-type specific generic season title specification
Cards can define a SEASON_TEXT_FORMATTER attribute of type Callable[[EpisodeInfo], str] to change the season title text when there is no customization
Various front-end changes
Make the background color on dark mode slightly darker
Move the Connections, Scheduler, and Import tabs under the Settings tab on the side bar
Create new Add Series tab under the home page on the side bar (and remove floating button)
Add animated loading logo when waiting for Series to load on the home page
Add new absolute_episode_number variable which can be used in variable formats (e.g. episode text formats) and is the absolute number if available, and the episode number if not
Add new human readable cron expressions to the Scheduler table (in advanced scheduler mode) - e.g. 20 */10 * * * is described as At 20 minutes past the hour, every 10 hours
Add healthcheck command, and API endpoint, to Docker container
Automatically perform backups of the database and global options before attempting any SQL schema migrations

Major Fixes

Correctly utilize Template ordering
The SQL template relationships were utilizing implicit ordering by Template ID, but if a non-sequential Template order was applied to a Sync/Series/Episode, then the order would constantly be reset
Update SQL schema to 25490125daaf which adds an explicit order column to all many-to-many association tables
Correctly initialize Sync Template dropdowns with the correct order of Template specifications
Allow force-resetting of passwords by specifying the TCM_DISABLE_AUTH environment variable while booting to avoid potential lockouts
Fix name mismatches when importing Blueprints causing duplicate Series entries (matching is now done with database IDs)
Use hashed image URLs for source images so they properly reload when modified
Fix Episode ID assignment in Jellyfin
Correctly load Title Cards into multiple servers when Series has more than one library
Correctly apply Plex Sync exclusion tags

Minor Changes

Relocate the y-position of the index text on the Calligraphy card. It is now dynamic with the logo height
Paginate the /api/cards/series/{series_id} API endpoint
Minor visual changes to the login page
Add logo above login header
Add link to new forgotten password instructions
Modified "help" tooltips on various pages to not use popups but instead inline help text - this looks better and makes this info always visible (even on mobile)
Only keep backups for up to 3 weeks
Add connection-thematic-specific coloring to Sync elements
Start loading Font preview when directed from Font link
Sleep 30 seconds between attempts to load Episode Cards via API endpoints (Tautulli, Sonarr, excplit) - up from 15
Add new "does not contain" Template Filter condition - can be used for strings and list variables
Change Template sidebar icon to not conflict with new logo
Add help text to the (un)monitor button below Series posters (was hoverable tooltip)
Also open Series search bar by pressing / key
Auto-redirect from login page if authentication is disabled
Add global "colorblind" accessibility option to utilize more distinct colors (primarily in progress bars)
Add global option for enabled language codes to allow specification of translated numbers (i.e. Season and Episode text)
Refresh (and animate the reloading of) Card statistics when clicked
Query Series statistics every 60 seconds (increased from 30)
Add header button which links to the current page's relevant documentation if available
Modify the sidebar toggle logic - clicking the logo will return to home page if you are not on mobile
Add a loading indicator to Blueprint elements while being imported
Revise changelog to utilize accordions to make navigation easier
Add a note to the Sync page if no Connections are defined

Minor Fixes

Handle non-404 errors when downloading Font files from Blueprints
Handle permission errors for root folders creation when starting TCM
Left-align Blueprint actions on mobile
Remove temporary title-match logging when evaluating EpisodeInfo comparisons
Add default TZ of UTC to Docker build
Add missing placeholder text to some card type dropdowns
Change default season text on Calligraphy card to Season {season_number_cardinal} - e.g. Season One (was Season 1)
Limit length of file name path components of cards, folders, etc. to 254 characters (could be exceeded if the title was included in the filename)
Correctly utilize Card type default Font replacements in Title Card creation
Return Series search results by the Series sort name (so case and special character-agnostic)
Properly clear new Sync forms after creation
Do not show error toasts when statistics cannot be queried on the home page
Correctly handle all supported TMDb language codes (was using outdated list)
Correct logo downloading from Emby and Jellyfin
Wrap pagination menus on the home page on mobile to avoid overflow
Do not auto-zoom into text boxes on mobile (particularly iOS) by dynamically adjusting font size to 16px when selected
Properly color the "outside page" background in some mobile browsers
Handle explicitly raised errors (caused by bad Episode data sources) in Refresh Episode Data task
Properly handle deleting attributes from the Preferences model without resetting object
Correct next/previous navigation between same-named Series
Correctly set Options tab as active tab by default to avoid flicker when loading page
Only remake Cards for changes to attributes which are actually reflected in the selected Card's card type model
Remove individual variable columns of the Card SQL table; instead store generic model_json data
Update SQL schema to caec4f618689 to convert existing Card objects
Non-builtin Cards will be remade after migration
Re-query the current page of Series when the sort order is changed on the home page
Do not submit separate API requests for adding a Series and importing a Blueprint in one operation
Reflect global un/watched style settings in Template previews
Attempt to refresh Episode data up to three times in Sonarr webhook API endpoints (for when your EDS is a Media Server and is slow to refresh)
Properly detect mobile devices in JS
Correctly clear Episode translations in Episode modals

v2.0-alpha.6.0
Released October 7, 2023

Major Changes

Add API endpoint to trigger Card creation via Sonarr webhook - this is practically identical to the Tautulli trigger (but not for watched-status changes) but works for all Media Servers - setup docs are here
Create new Calligraphy card type
Create new Marvel card type
Simplify default directory structure
Move assets, backups, logs, and source directories under config.
Move the Database and global options files under config
Explicitly handle and integrate local Python card types into the UI
Any *.py file will be parsed when launched and on trigger of the RefreshCardTypes task
Documentation for integrating cards is available here
Back up global settings / preferences when performing the BackupDatabase task
Toggle side navigation bar completely when the TCM icon is clicked
Display changelogs within the UI (you're looking at it!)
Write EXIF data to all Plex uploaded images when PMM Integration is enabled

Major Fixes

Correctly display and edit extras in Episode modals
Use bottom-heavy titling in Overline card
Correct YAML importing to properly sequence imports of Fonts, then Templates, then Series
Properly apply custom Fonts to Series when importing YAML
Correctly convert season folder format variables when importing YAML
Hide home page statistics on mobile to improve formatting
Properly initialize, enable, and display the Template special syncing dropdown

Minor Changes

Only query card types once per load on Templates page
Filter file browser to accept Font files in upload dialog
Filter file browser to accept image files in source, poster, and logo upload dialogues
Add note about what Blueprints are to Series page
Use global card file type for preview image generation (should be ~50% faster for those with .jpg as their card extension)
Modify the Star Wars and Landscape card type descriptions
Modify Font.file SQL schema and data to Font.file_name
Add --logo mini argument to mini_maker.py to add logo files to created cards
Apply Font replacements before and after title text case function and title splitting is applied
Add button to quickly add all letters of the alphabet to the preview title in the Font preview
Make season title popups uninvertible
Add button to add all A-Z/a-z to the example title on Fonts preview
Allow specification of "even" splitting style in card types (instead of just top / bottom)
Add variables for the "title-case" version of spelled episode text cardinal and ordinal numbers - i.e. "One" instead of "one" (only applies to Cards with non-fix cased season/episode text)
Add episode text font size extra to Olivier card
Add dynamic links to the assigned Fonts for Templates and Series which opens the Font page for easier editing
Export Series and Template localized image rejection in Blueprints
Add navbar and header via Jinja2 templates, not AJAX injection
Add contextual logging to each Alembic SQL schema migration
Add logo vertical shift extra to Tinted Frame card
Highlight the active page in the nav bar

Minor Fixes

Handle bad f-strings in Card logo_file format strings
Add more TMDb language codes for translations and logo language prioritization
Explicitly attempt the Sonarr and Tautulli integration endpoints multiple (up to 6) times - this should handle instances where the media server is slow to add the new Episode to the server, causing TCM to fail to upload the new Card
Only generate number word translations when requested for Card creation
Correct preview episode text in card preview endpoint
Pass watched attribute into Preview card model so that watched-status specific toggles (not styles) are applied
Properly apply blurred grayscale style modifiers to preview cards if watched and unwatched styles are both blurred and grayscale
Correctly import the logo_language_priority YAML option
v1
Fix Summary image creation
Handle bad TZ environment declarations in Docker
Export Series match_titles property in Blueprints
Use TVDb /dereferrer endpoint in TVDb links

v2.0-alpha.5.2
Released September 4, 2024

Major Changes

Match existing Fonts and Templates (by name) when importing Blueprints
Add various UI global options:
How many Series to display per page on the home page
How many Episodes to display per page
Whether to stylize un-monitored Series posters on the home page
Whether to display simplified Episode data tables which only display the most commonly edited columns
Export Font files in a separate sub-zip directory when exporting Blueprints
Add warnings to the Series page if the Series is not matched in Emby/Jellyfin/Sonarr/TMDb
Add display to start adding a new Series for given query if no results are found in search bar
Create Overline card type
Automatically search for "mask" images to overlay on top of the frame and frame edges in the Tinted Frame card
TCM will search for files named like {filename}-mask.png - e.g. s1e1-mask.png in the source folder
If provided, this mask image is overlayed after the text and frame is drawn
This can be used to give the appearance of part of the image extending beyond the boundaries of the frame - for example:
Merge new user card type azuravian/SciFiTitleCard

Major Fixes

Use version number in Javascript filenames to avoid caching files between versions
Correct page load error when loading Series pages with non-default Font kerning and default stroke widths
Improve reliability and speed of Tautulli Plex rating key endpoint
Delete old Blueprint zips
Actually use Font replacements
Update Wdvh/WhiteTextStandard to be much faster and integrate better with the UI

Minor Changes

Do not refresh ImageMagick interface(s) after updating global settings
Reduce remote card type API endpoint queries on the Series page (improves loading time)
Globally query available data on the Series page to significantly improve Episode table loading times
Add blank Templates at the top of the Templates list
Utilize persistent Jellyfin IDs
Add Glass Color extra in Tinted Glass card
Use better Series title matching in Plex (for Series without database IDs)
Don't display erroneous placeholders for Font values
Add additional info to tooltips on the default values of some extras
Do not blur edges of source images in the Tinted Frame card when entire image is already blurred (should improve card creation time when blurring is enabled)
Remove explicit logo extra from imported Templates YAML
Add episode text vertical shift extra to Olivier card
Remove warning about Episode missing an absolute number in season title range evaluations

Minor Fixes

Handle SQL errors in load all Title Cards task
Display more pagination elements by default
Properly detect contextual Loggers in decorated functions
Do not invert modal un-invertible subcontent
Correct CreateTitleCards Task description
Correct plural of Episode override count when browsing the Blueprints on the Series page
Use contextual logger in remote card type initialization
Explicitly sanitize card filenames (should handle explicit \n in card filenames)
Correctly detect hidden episode text in Olivier card
Refer to the web-ui branch of the CardTypes repository for all RemoteFile objects
Handle more instances of busy databases in scheduled Tasks
Handle explicit newlines (\\n) in titles for preview card creation

v2.0-alpha.5.1
Released August 18, 2023

Major Changes

Rewrite various PlexInterface functions to significantly improve speed of Plex as a Sync and Episode data source
Add buttons to the Series page to remove all TCM / PMM labels from within Plex
Add scheduled Task to remove "bad" Card entries (e.g. duplicates, unlinked, etc.)
Use separate colors for "progress" bars to differentiate un/monitored Series on the home page
Overhaul extra selection to display all supported extras in dropdowns
Add various extras to the Tinted Frame card:
Add episode_text_font to override the Font used for the Episode Text
Add episode_text_font_size to adjust the size of the Episode text
Add episode_text_vertical_shift to adjust vertical position of Episode text
Add frame_width to adjust the width of the frame
Add column to the Episode data table to create a singular Card
Add new Font customization option for interword spacing

Major Fixes

Fix logo as the top/middle element in Tinted Frame card
Correctly export Episode extras in Blueprints
Keep records of advanced scheduling crontabs between restarts
Respect logo size scalar in Tinted Frame boundaries
Permit {title} in the global filename format option
Fix direction of vertical shifts in the Tinted Glass card (was opposite to the glass box)
Fix the Cutout title card on some versions of ImageMagick
Handle SVG logos selected via the UI
Add button to query TMDb for logos if a Series logo does not already exist
Correctly display previously modified extras in the Episode extras modal

Minor Changes

Automatically open and start populating a GitHub issue when the "Export Blueprint" button is pressed
Allow ordering Blueprints by creation time or Series name
Log "missing" Series triggers by Tautulli endpoint as info, not errors
Remove deleted row from Episode data table without re-querying all Episodes
Sequentially transition in Posters on home page, and search results on the new Series page
Use dark theme by default
Display up to 15 page selectors on the Episode data tab, up to 4 on mobile
Only display 50 Episodes/page on Episode data table
Use a container size of 500 in PlexInterface functions
Add global support for title_text_format extra to apply automatic formatting to title text
Show "internal" tasks within the UI when Advanced Scheduling is enabled
Add new Fonts and Templates to the top of their respective lists
Automatically convert filename format arguments from v1 to their v2 equivalents
Change default interval for the refresh Episode data Task to 8 hours (from 6)
Add headers between Fonts when more than 20 are defined
Permit custom Font files in the Roman Numeral card
Show up to 15 (5 on mobile) page selectors for Blueprints
Add API endpoint to get all Cards, unblacklist Blueprint
Display more verbose errors in toasts for 422 validation errors
Autofocus on the search field on the new Series page
Add blur_profile extra to the Cutout card
Add divider_color extra to the Divider card
Parse Font interline spacing in the Roman Numeral card
Parse Font interline spacing and Kerning in the Cutout card

Minor Fixes

Correct interface refreshing triggered by toggling the connection
Stop querying or displaying logs, and Series statistics when cookie / session expires
Correct contextual logger reference in error decorators
Fix Sync modals on mobile (they were too wide)
Fix Emby and Jellyfin library dropdown population in Sync modals
Do not automatically uppercase season and episode text in Divider card
Do not automatically expire DB sessions after commiting
Include disabled auto title splitting in Episode Blueprint exports
Properly handle missing logos on Fade and Poster title cards
Do not display "negative" previous Task durations
Use the correct slashes in the card directory placeholder text on the Series page
Remove Episode ID's from list of batch ID's when manually saved
Log the relevant Episode labels when preventing source image selection within Plex
Allow empty character replacements in custom Fonts
Use inline Form validation on Form page
Correctly parse unchecking the "Delete Missing" checkbox
Fix exporting Episode data in Blueprints when Plex is used as the Episode data source
Handle more instances of "bad" search results from Sonarr
Parse background extra for the Logo card
Make Template Filter reference values optional
Refresh HTML theme after adding new Template Filter conditions
Do not use Background Tasks in the Tautulli / Plex rating key endpoint to avoid race conditions where no cards are loaded if task sequences quickly after card creation
Do not "manually" refresh Series Episode data after adding a Series from the UI (redundant)
Utilize Font stroke width in the Divider card

v2.0-alpha.5.0
Released August 4, 2024

Major Changes

Completely revamp the process new Series are added to TCM
Now the + New Series button takes you to a separate page where you can interactively search any enabled interface (Emby/Jellyfin/Plex/Sonarr/TMDb) for the Series - a slightly outdated example:
When a Series is selected, you can easily browse any available Blueprints to add the Series and Blueprint immediately
Series can also be quickly added to TCM without opening the menu by clicking the Quick-Add button, which uses the last-selected Libraries and Templates
Browse all available Blueprints within the UI
Below the aforementioned new series adding, any defined Blueprints can be browsed - for example:
These Blueprints can then be imported directly, without explicitly searching for the Series - this will import the Series if it does not exist, as well as the Blueprint
Any Blueprints you aren't interested in (or have already imported) can be permanently hidden from this part of the UI, but will still appear when searching for that Series explicitly.
Allow toggling of an "Advanced" Scheduler mode - to allow Tasks to be scheduled via Cron expressions, not just intervals
View and browse Series logos within the UI - at the bottom of the Files tab on the Series page the current logo can be viewed; and all available logos on TMDb can be browsed and downloaded
Create White Border title card
Implement optional authorization to require a valid username/password to access TCM (and the API) - example of the login screen:

Major Fixes

Correctly read Version file during initialization
Correct the automated validation tests run on all Blueprint submissions
Fix logos for the Fade title card not being automatically passed into Cards
Fix loading of global Preferences when using remote card types forcing a settings reset on each boot

Minor Changes

Only update Preference attributes if changed
Separate all CSS/HTML/JS files
Order Fonts and Templates by their name
Combine un/watched style fields to be more compact
Use lazy loading on Blueprint images in Series page
Cache remote card types for 6 hours (from 30 minutes)
Add tooltip to the theme toggle button
Add box_color extra to Landscape card
Display total Card progress / percentage beneath the Series poster on the home page
Only query Emby/Jellyfin usernames on Connections page load if enabled
Add various keyboard navigations:
Allow tabbing between Series on the home page, and hitting Enter to open page
Hitting F or S anywhere to start typing in the Series search box
Hit SHIFT and H anywhere to return to the home page

Minor Fixes

Raise a 404 Exception if a non-existent Font file is deleted via the API
Require unique Template specifications in Series, Fonts, Syncs, and Episodes
Use contextual logger in Source image replacement endpoint
Make some UI formatting improvements for mobile:
Do not stack the Episode data table
Vertically center align header buttons
Hide support button
Increase sidebar vertical padding
Stack file cards
Center log table
Stack Template columns
Fix race condition triggered by deleting Series and Cards at the same time
Only commit changes to global connectionsafterrefreshing interface
Correct method calls when a Series cannot be found in Emby or Jellyfin
Fix contextual logging of uncaught TMDb exceptions

v2.0-alpha.4.1
Released July 17, 2023

Major Changes

Rework global Preferences to be a bit less error-prone (purely a behind the scenes change)
Only read the most recent log file when querying for new messages within the UI
Add option to Sonarr Connection details to only grab Episode data for Episodes that are downloaded (this is a global setting)
No longer skip loading remaining Cards into a Series when >3 Card uploads fail
Completely overhaul Blueprint submission
Blueprints are now submitted by just filling out an Issue form on the GitHub, and then automated workflows parse and validate your submission to create and merge the actual Blueprint

Major Fixes

Remove default --workers 4 server argument from the Dockerfile
Require plexapi 4.14.0 to fix PMM integration failing on some servers
To fix the PMM integration if you are not using Docker, you might need to run pipenv clean then a cleanpipenv install
Prevent TCM from grabbing source images of previously loaded Title Cards
Require Series match when creating Cards via Tautulli/rating key - it was possible to remake the Card for the wrong Series if the two had the exact same Episode index + title (i.e. Pilot for S01E01)
Fix Emby/Jellyfin Syncs

Minor Changes

Add improved documentation to pretty much all of the code
Use raise .. from .. syntax where applicable
Add maxsplit=1 arguments to improve string splitting speed where applicable
Move require_kanji logic into Anime card model
Paginate /api/templates/all endpoint return
Use HTML tooltips instead of titles on the Connections page
Standardize all MediaServer and EpisodeDataSource subclasses to use the same method argument structure
Use contextual logger in decorated functions to log failed GET requests
Use sys.exit instead of built-in exit function
Add request method to method start log messages (e.g. GET, POST, etc.)
Change Emby and Jellyfin to query for Series ID's at runtime (to handle database ID shuffling, which seems to happen?)
Change the default global filename format to {series_full_name} - S{season_number:02}E{episode_number:02}

Minor Fixes

Add explicit 10-30 second timeouts to all remote content queries to prevent the program from possibly locking
Use contextual Logger for:
Refreshing remote card types when importing Preference YAML
Season title range evaluation
Raise 404 if requesting Statistics for a Series, or deleting a Template that DNE via the API
Use updated image size methods in AspectRatioFixer and StandardSummary creation via fixer
No longer use deprecated ABC.abstractproperty decorator
Use correct __slots__ iterable in SeasonTitleRanges class
Correct Process Series button tooltip to not reference Card loading
Explicitly pass connection URLs to __init__ methods
Correct language in the delete Sync toast

v2.0-alpha.4.0
Released January 17, 2024

Major Changes

Add scheduled task to perform automatic database backups - default interval is 1 day, and backups are kept for 4 weeks
Allow import and exporting of Blueprints
A Blueprint is a customization that applies to a specific Series
A Blueprint can include any number of Templates, Fonts, Series customizations,andEpisode customizations
Blueprints are hosted on the new Blueprints repository, which I've started adding some of my own Blueprints to, both as examples and for use
Blueprints can be imported into a Series via the new Blueprints tab on the Series page
If there are Blueprints available, an example of each will be displayed in the UI, along with the creator, a brief description, and a list of what is included in the Blueprint
A Blueprint can be easily exported by clicking the Export Blueprint Button, which will download a .zip file of the Blueprint (as JSON) that you can edit, any associated Font files, and a preview image for the Series.
Refresh Episode data for each Series immediately after being Synced
Add button (and endpoint) to process entire Series at once, including proper sequencing of Source Image downloading and Card creation
Use explicitRefresh Previewbutton in Named Font card preview instead of auto-change detection
Reflect Font title case specification in Named Font card preview
Allow Syncs to be edited within the UI

Major Fixes

Correctly commit changes when updating multiple Episodes via endpoint if last Episode object is unchanged
Filter out any messages from the "future" when displaying them in the UI (typically caused by misaligned timezone)
Use the correct Seriesunwatchedstyle in Episode source file resolution (was usingwatchedstyle)
Allow deletion of any individual season titles (not just the last title) from the UI
Fix effective Template determination for _Episodes_
Fix homepage sorting by Series name for Series that have numeric names (e.g. 1923)
Allow specification of manually split Titles by disabling Auto-Split title for that Episode and then putting \n in the title where you want to force a split
Always commit changes to the global Preferenceseven ifthe interface is disabled
Do not error on bad Series database ID's
Properly display the names of uploaded Named Font files within the UI

Minor Changes

Add interword_spacing extra to Frame and Olivier card types
Use contextual logger for:
Failed image download logging
Template creation endpoint
Interface refreshing
Remote Card Type evaluation
Changes to the global Preferences
ImageMagick prefix determination
Enforce a minimum task interval of 10 minutes (to prevent freezing up the UI if scheduled too frequently)
Skip Jellyfin Series ID assignment if all ID's are present
Use updated versions of most packages in Pipfile
Require 1.x for Pydantic as I haven't validated v2
Move mkdocs to a dev package
Remove "URL" form validation from Connections page to allow URL's without a TLD
Use hard drive icon instead of sever icon for "Load Cards into ..." Buttons to not use the same design for logs and
Do not return CardActions object from Card creation or import endpoints
Add font replacement for é and É to Comic Book card type
Add "progress bar" to show percentage of Title Cards created below Series poster
Do not show Sync sections for disabled interfaces
Change maximum ImageMagick thread count to 12
Use magick IM prefix by default
Disable various buttons on the Series page after clicking to prevent making duplicate requests
Use orange icons onForce Reload ..buttons

Minor Fixes

Improve handling of objects with no Template IDs on YAML imports
Remove redundant text from error message when there is missing data from an Episode Text Format string
Handle SQL OperationalError in TranslateSeries task
Disable caching in Sonarr to catch changes in sequential API requests (e.g. Syncing, adding tag, re-Syncing)

v2.0-alpha.3.0
Released July 2, 2023

Major Changes

Improve Sonarr Interface initialization times by no longer querying all Series ID's upon init, instead search for the Series via the /lookup API endpoint when querying for a Series
Completely overhaul all logging and log messages
Every API request and top-level function (e.g. scheduled tasks) generate a unique Context ID like aafa3e9eedaf that is logged in all messages corresponding to that function
Create /logs API router to query log files
Display the status of background tasks in small toasts that in the bottom right corner. These differ from info toasts that directly respond to an action taken (like a button press) which appear in the top right
Allow logs to be viewed within the UI
Accessible from the green server button / icon on the page header
Logs can be filtered within the UI by log level, context ID(s), message substring, start and end time
A context ID or start/end time can be clicked on to add as a filter
Use UMASK of 002 in Dockerfile
Handle overriding source files with extras (including format strings) - specify as source_file

Major Fixes

Allow Template booleans to be cleared (False -> True) from within the UI
Handle unspecified arguments in connections YAML importing
Handle invalid page landings by redirecting to the homepage

Minor Changes

Sort Series on the server rather than client
Paginate Episode data table (and corresponding API endpoint) on Series page
Only show home page Series navigation menu if there at least two pages
Specify four worker processes in Dockerfile (will eventually make this a variable)
Remove logging of Preference file changes
Remove log message for existing translations
Remove log message for failure to meet Template Filter criteria
Remove log messages for using cached remote card contents
Parse Episode airdates when initializing EpisodeInfo objects from Plex
Do not log missing Source images in the scheduled task
Use runuser instead of gosu in Dockerfile

Minor Fixes

Remove double magick ImageMagick prefix from TintedFrame card
Add slight shadow to separate page header from dark themed page content
Remove blank toast from Title Card creation response handler
Include fake Series name and Episode indices in Card preview generation
Log the correct number of identified entries from a Plex Rating Key
Remove unequal margin from page header button icons
Retry PersistentDatabase transactions up to 5 times to reduce DB corruptions caused by multi-process access
Remove some Debug messages erroneously labeled as critical
Handle uncaught exceptions during interface dependency refreshing

v2.0-alpha.2.2
Released June 21, 2023

Major Changes

Paginate Series homepage for faster loads for very large servers
Fix selection of uppercase title case for custom Fonts via UI
Fix Card importing force reload for Card importer (checked/unchecked were reversed)

Major Fixes

Pass Episode cardinal/ordinal numbers to all Card types (fixes Olivier / other Card Types)
Fix Tautulli integration API endpoints
Relocate preferences JSON file to be persistent between Docker instances (now at /config/source/prefs.json)

Minor Changes

Allow Plex rating key API endpoint to work with lists of keys (not just single)
Add lazy loading to Series posters on home page
Show list of affected Series when deleting a Template via UI
Show info toast when starting to source image downloading is initiated via UI

Minor Fixes

Increase bottom margin between statistics and series cards on home page
Correctly initialize default card extension for Card importer based on global card extension
Fix IMDb Series ID for Series with unassigned IMDb ID's (label was showing TVDb)
Utilize magick IM 7.0 Command Prefix in Tinted Frame card (this is kind of a test)
Add 10 minute misfire grace period to Scheduler - shouldallow tasks to finish if delayed
Fix default box_adjustments in Landscape and Tinted Glass cards

v2.0-alpha.2.1
Released June 16, 2023

Major Changes

Add internal task to query for and set missing Series ID's every 24 hours by default

Major Fixes

Fix error where logos were being downloaded from TMDb as posters
Correct default box adjustments in Landscape and Tinted Glass card Pydantic models

Minor Changes

Remove blank Sync name from Sync delete toast
Add green checkmark next to selected Series in Importer dropdown to improve legibiliy
Sleep for 30 seconds on SQL OperationalErrors in Sync and Episode Data Refresh tasks
Use full width textarea elements on mobile on Importer page
Center align the Scheduler table on mobile
Make Series page input elements full width

Minor Fixes

Correct URI path to blank image in Font preview
Minor CSS / layout improvements for the home page on mobile
Fix Sonarr library field auto population
Fix logo positioning on mobile (was offcenter)

v2.0-alpha.2.0
Released June 16, 2023

Major Changes

Add scheduled Task to download any missing Series posters
Download Series posters from associated Media Server (e.g. Plex, Emby, Jellyfin) before trying TMDb
Add functionality for TCM to "guess" and auto-fill the Libraries setting based on your Sonarr root folders
Simplify HTML/CSS on all pages so that the header and sidebar are non-sticky elements (reducing weird scrolling oddities)
Fix background "image" gradient not filling the page on some pages in Chrome
Add navigation buttons to Series pages to quickly move between Series (alphabetically)
Add Comic Book title card (https://github.com/CollinHeist/TitleCardMaker/issues/343)
Vastly improve Emby Syncs:
Make them much faster by not making individual API requests per-year (weird API bug..)
Apply exclusion tags
Directly parse Series database ID's while Syncing
Handle changing Jellyfin Series ID's (maybe)

Major Fixes

Properly merge Episode translations into extras
Fix Card preview generation for Templates and Fonts
Handle any type of Tautulli API Key (pre API v3.6, API keys were hexstrings, but they are now randomly generated Base64 strings)
Allow changing the Font title case from the UI

Minor Changes

Change images used in Card preview generation
Skip and do not warn if a disabled interface is part of the global image source priority in source selection
Download Series poster, assign ID's, and refresh Episode databeforereturning from add new Series API endpoint
Update "get all Series" API endpoint to optionally order return by name, year, or ID
Add additional type annotations

Minor Fixes

Catch SQL OperationalError exceptions in Episode data refresh scheduled task
Handle transparent in Color Title Card fields (this is a bug in the Pydantic modules that I've submitted a PR/fix for, but will only be released in Pydantic v2.0)
Fix CSS resulting in a small white rectangle on some browsers for the card type preview on the Settings page
Handle Episodes without season/episode numbers in Emby and Jellyfin

v2.0-alpha.1.0
Released June 14, 2023

Initial Release