timothy and timothy
08cd3a002d
fix(690,758): count the same query a paged handler pages ( #833 )
...
Build ErsatzTV Image / CI toolchain image resolves (push) Successful in 10s
Build ErsatzTV Image / Delimiter ban (release path) (push) Successful in 14s
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 8m53s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (push) Successful in 6m18s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (push) Successful in 6m40s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (push) Skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (push) Skipped
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 5m46s
Co-authored-by: Timothy <timothy@noreply.gitea.tblindustries.be >
2026-08-26 07:39:23 +00:00
timothy
9ea2750cbf
feat(392): expose ProgramSchedule.padToNearestMinute on the REST API
2026-07-23 08:03:31 +02:00
timothy and Claude Opus 4.8
5c9f04fdec
feat( #253 PR2): optimistic-concurrency on schedule-items aggregate
...
Wire the frozen #253 ETag/If-Match/412 recipe onto ProgramSchedule /
schedule-items, keeping the PR#258 positional in-place reconcile intact.
Backend:
- ReplaceProgramScheduleItems command gains Option<int> ExpectedVersion;
ReplaceScheduleItemsRequest.ToCommand threads it.
- Handler: standalone CheckVersion Either AFTER validation (so 412 isn't
flattened to 422), unconditional Version++ before save, guarded save via
SaveChangesWithConcurrencyGuard, and 412 propagated without running the
post-save reload/enqueue.
- ProgramScheduleViewModel + Mapper carry Version.
- ScheduleController: GET /items emits ETag; PUT /items parses If-Match
(malformed -> 400), threads ExpectedVersion, re-queries for the new ETag,
and advertises 400/412.
- Sibling config-writers (Add/Delete item, Update schedule) bump Version.
Frontend:
- schedules.ts: getScheduleItemsWithMeta + replaceScheduleItems(ifMatch)
returning ResponseWithMeta.
- SchedulesScreen: etagRef threaded through the #242 dirty-guard (set from
load + every successful save); 412 opens a conflict ConfirmDialog whose
Reload discards the draft and re-runs loadItems.
Tests: handler concurrency suite (stale->412 no mutation + fill-group state
untouched, match/absent success+bump, no-op still bumps, racing save->412);
controller ETag/If-Match/412 cases; SchedulesScreen 412-conflict-dialog test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-11 18:36:25 +02:00
timothy and Claude Fable 5
794bb0d4bb
fix(schedules): reload write-path response with read includes + order GET by index ( #229 )
...
Bug 1 (500 on watermark/graphics save): Replace/Add handlers projected the
freshly-built entity graph, whose ProgramScheduleItemWatermark / -GraphicsElement
join rows carry only foreign-key ids — the Watermark/GraphicsElement navs are null,
and Mapper.ProjectToViewModel dereferences them unguarded, throwing an NRE that the
controller surfaced as a 500 on PUT/POST. Both handlers now reload the persisted
item(s) through the read-side include chain before projecting. Extracted that chain
into ProgramScheduleItemQueryExtensions.IncludeScheduleItemDetails() so GET, Replace
and Add share one source of truth.
Masking: PersistItems returned a lazy LanguageExt Map, and the existing round-trip
test only checked .IsRight — never enumerating it, so the deferred NRE never fired.
The new ScheduleItemWriteProjectionTests force enumeration (as the controller's
.ToList()/serialization does) and seed watermark/graphics via a separate context so
the handler's fresh factory context has nothing pre-tracked.
Bug 2 (server side): GetProgramScheduleItemsHandler now .OrderBy(i => i.Index) —
it previously returned id order, which is not index order.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-11 01:26:25 +02:00
timothy
4b4e2b2f82
feat(api): add schedule item duration estimates
...
refs #111
2026-07-03 23:41:57 +02:00
timothy and Claude Fable 5
d0652d4adb
wip: partial implementation salvaged from interrupted workflow run
...
Untrusted draft — no build/test had run yet. Review before building on it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 23:41:57 +02:00
Jason Dove and GitHub
2ad6547349
scheduler context improvements ( #2819 )
...
* improve classic scheduling context display
* add basic block scheduling context
* add scheduling context to classic filler
* improve parsing
2026-02-09 20:19:52 -06:00
Jason Dove and GitHub
bcd2ea7db3
db optimizations around names and case-sensitivity ( #2749 )
...
* generate (case-insensitive) unique names for fields that should be unique
* move name case-insensitivity down to schema level
* update changelog
2026-01-02 09:25:23 -06:00
Jason Dove and GitHub
ecacf3960f
add search fields to filter collections and schedules tables ( #2439 )
2025-09-18 10:44:11 +00:00
Jason Dove and GitHub
245165c9d9
add rerun collection type ( #2421 )
...
* rename collection type
* split collections into separate pages
* add rerun collection types, migration, editor
* add rerun to classic schedule items
* rerun plumbing in classic playout builder
* start to implement rerun enumerator
* add scheduledAt to enumerator movenext
* maintain rerun history in db
* fix shuffle
* fix rerun allowed playback orders
* fix updating rerun collections
* update changelog; fix editing
* update changelog
2025-09-15 18:27:55 +00:00
Jason Dove and GitHub
40ab7c2cff
add graphics elements on classic schedule items ( #2380 )
2025-09-05 11:53:29 +00:00
Jason Dove and GitHub
1c07df5bc3
use cancellation tokens in many places ( #2350 )
...
* use cancellation tokens everywhere
* more cancellation tokens
2025-08-27 03:20:35 +00:00
Jason Dove and GitHub
942cf9e225
allow selecting multiple watermarks on schedule items ( #2286 )
...
* add and populate new table
* add watermark multiselect
* remove old column
* update changelog
* fix tests
2025-08-09 13:53:37 +00:00
Jason Dove and GitHub
7e30444857
dependencies and code cleanup ( #2117 )
...
* fix validation in new form layout
* pin mediatr to last oss version
* update dependencies
* cleanup code in core
* cleanup code in ffmpeg
* cleanup code in infra
* cleanup code in scanner
* cleanup code in application
* cleanup main code
* cleanup test code
* solution-wide code cleanup
2025-07-06 15:56:17 +00:00
Jason Dove and GitHub
07cbf9936b
fix shuffle in order and fill with group mode incompatibility ( #2044 )
2025-06-19 22:10:30 +00:00
Jason Dove and GitHub
d9a3496bf5
add fixed start time behavior option to schedules and schedule items ( #2017 )
2025-05-30 09:30:09 +00:00
Jason Dove and GitHub
202ae33e37
add individual media items to playlists ( #1692 )
...
* add movies to playlists
* add search results to playlist
* update changelog
2024-04-28 06:33:57 -05:00
Jason Dove and GitHub
dcbe4837bf
first pass at block scheduling ( #1548 )
...
* add blocks, block groups
* basic block and block item editing
* add template groups and basic template editing (name)
* add blocks to template calendar
* edit playout templates
* add calendar preview to playout templates
* add basic block playout building
* add mysql migration
* update changelog
2024-01-13 22:01:21 -06:00
Jason Dove and GitHub
245c4ec359
code analysis and cleanup ( #1411 )
...
* cleanup scanner project
* cleanup infrastructure projects
* cleanup ffmpeg project
* cleanup core project
* cleanup app project
* cleanup main project
* update dependencies
* code cleanup
2023-09-03 06:23:42 -05:00
Jason Dove and GitHub
d19e95fb38
add random start point option ( #804 )
2022-05-13 20:36:03 -05:00
Jason Dove and GitHub
c02b83d0d6
code cleanup ( #743 )
...
* update tools
* run code cleanup
* update dependencies
2022-04-19 17:47:18 -05:00
Jason Dove and GitHub
1ee3446589
add schedule item watermark setting ( #733 )
2022-04-12 21:01:20 -05:00
Jason Dove and GitHub
1ab98578ab
refactor namespaces and imports ( #670 )
...
* re-namespace
* optimize usings
* more usings
* more of the same
* more implicit/global usings
* cleanup all usings
* minor fixes
2022-03-03 15:36:07 -06:00
Jason Dove and GitHub
78fdc9c57a
add option to shuffle schedule items ( #652 )
...
* add schedule setting
* it works
* fix tests
* update readme
* rebuild all playouts
2022-02-22 21:20:40 -06:00
Jason Dove and GitHub
6d147de2f3
filler rework ( #449 )
...
* add chapter statistics and new filler options
* refactor playout builder
* more refactor prep for filler
* rewrite schedulers
* refactor collectionkey
* add tail filler kind
* migrate tail filler to filler preset
* optionally show filler
* fix playout detail row count
* remove duration tail filler options
* implement tail and fallback in flood scheduler
* implement tail and fallback in one scheduler
* implement tail and fallback in multiple scheduler
* implement looping fallback filler
* more duration tests
* start to add post-roll filler to flood
* rework playoutitem filler tagging
* rework scheduler logging
* calculate whether configured filler will fit
* implement pre-roll and post-roll duration and count filler
* improve duration filler calculation
* add minutes to search index
* update channel guide to work with new filler
* add mid-roll filler
* don't clone enumerators for filler calculations
* support pre-roll and post-roll pad filler
* implement mid-roll pad filler
* allow clearing filler selections in schedule editor
* fix tests
* filler config validation
* use consistent time zone for tests
2021-10-21 20:23:14 -05:00
Jason Dove and GitHub
22da19845b
add filler option to duration playout mode ( #428 )
...
* add duration tail options to schedule items editor
* add naive filler scheduling
* fix duration item length in xmltv
* show offline image for unfilled duration tail
* fix tests
* update changelog
* update dependencies
2021-10-13 21:15:16 -05:00
Jason Dove and GitHub
a076b3eb30
add shuffle-in-order support to all collections ( #356 )
2021-09-10 13:33:04 -05:00
Jason Dove and GitHub
632753ea93
add multi collections ( #315 )
...
* start to add multi-collections
* create multi collection with no items
* edit multi collections
* fix plex credentials threading issue
* add playback order to multi collection items
* group episodes outside of shuffled enumerator
* move playback order onto each schedule item
* fix multi collection grouping
* update changelog
2021-07-17 21:45:41 -05:00
Jason Dove and GitHub
0fb5bfde58
refactor dbcontext lifetime ( #258 )
...
* refactor create playout handler
* refactor get all playouts handler
* refactor delete playout handler
* remove dead code
* ignore unnamed artists for collections
* more repository cleanup
* more schedule items refactoring
* more playout refactoring
* refactor playout builder
* refactor ffmpeg profiles
* more ffmpeg profile refactoring
* rework resolutions
* refactor media collections
* refactor config elements
* update changelog
* more cleanup
2021-06-13 20:19:10 -05:00
Jason Dove
4d52e115b5
Initial commit
2021-02-08 21:13:53 -06:00