Release v0.2.34

This commit is contained in:
ponzischeme89
2026-08-09 08:25:50 +12:00
parent b1128bcce2
commit fdd9e6cab2
116 changed files with 11418 additions and 879 deletions
+17 -1
View File
@@ -39,6 +39,10 @@ type playbackResponse struct {
// already holds this response, and one boolean on a request that is made once per
// playback is cheaper than a field on the poll every open TV makes every ten seconds.
SubtitleDownloadAvailable bool `json:"subtitleDownloadAvailable"`
// Whether at least one subtitle on this title can be checked against another readable
// text track. Like the download flag, this rides on the playback response because only
// the subtitle drop-up needs it, and defaults to false for older gateways on the client.
SubtitleFixAvailable bool `json:"subtitleFixAvailable"`
// Whether it is worth asking this gateway for seek previews. Only the answer rides
// here; the manifest itself does not, because reading it costs a round trip to Emby
// and this response is the one thing standing between a Play press and a decoder
@@ -49,6 +53,11 @@ type playbackResponse struct {
// trip to Emby, and nothing about a skip button is needed before the first frame. The
// television asks for the segment itself once playback has settled.
SkipIntroAvailable bool `json:"skipIntroAvailable"`
// Whether it is worth asking where the closing credits begin. Same reasoning again, and
// deliberately a second boolean rather than a reuse of SkipIntroAvailable: the two are
// separate features with separate switches, and a house that has turned the skip button
// off has not asked to lose the credits pane with it.
EndCreditsAvailable bool `json:"endCreditsAvailable"`
}
type playableSubtitle struct {
@@ -205,8 +214,10 @@ func (s *Server) handlePlayback(w http.ResponseWriter, r *http.Request, sess sto
PlaySessionID: playSessionID,
PlayMethod: playMethod,
SubtitleDownloadAvailable: s.subtitleDownloadAvailable(ctx),
SubtitleFixAvailable: s.subtitleFixAvailable(subtitles),
TrickplayAvailable: s.trickplayEnabled(ctx),
SkipIntroAvailable: s.skipIntroEnabled(ctx),
EndCreditsAvailable: s.endCreditsEnabled(ctx),
})
}
@@ -432,6 +443,11 @@ func (s *Server) playbackSubtitles(
Codec: stream.Codec,
})
}
// Anything the gateway fetched itself joins the list here, so a subtitle downloaded
// from a provider that cannot write beside the media file is an ordinary track on
// every later playback — not something that exists only in the response to the
// download that produced it.
out = mergeSubtitleTracks(out, s.storedSubtitlesFor(ctx, itemID))
delivery, playMethod := selectPlaybackDelivery(source, forceTranscode || subtitleIndex != nil)
if delivery != "" {
delivery = s.emby.DeliveryURL(cred, delivery)
@@ -742,7 +758,7 @@ func (s *Server) autoFollowContinuingShow(ctx context.Context, sess store.Sessio
if json.Unmarshal(rawSeries, &seriesItem) != nil || strings.TrimSpace(seriesItem.Name) == "" {
return ""
}
sonarrSeries, err := s.sonarr.Series(ctx)
sonarrSeries, err := s.sonarrSeriesCatalogue(ctx)
if err != nil {
s.loggerFor(ctx).Warn("auto-follow Sonarr lookup failed", "error", err)
return ""