aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Trickplay
diff options
context:
space:
mode:
authorNick <20588554+nicknsy@users.noreply.github.com>2023-06-23 14:22:00 -0700
committerNick <20588554+nicknsy@users.noreply.github.com>2023-06-23 14:22:00 -0700
commit619d1d47f27e3ca2f2f249fa81fe23f8019ec0e7 (patch)
tree691ee278764cb44f4731dedbdd10dee5de8a9c70 /MediaBrowser.Providers/Trickplay
parent0e2c362078c5b0babaa0fd254106452e6d67ebe8 (diff)
Move GetHlsPlaylist to ITrickplayManager
Diffstat (limited to 'MediaBrowser.Providers/Trickplay')
-rw-r--r--MediaBrowser.Providers/Trickplay/TrickplayManager.cs76
1 files changed, 76 insertions, 0 deletions
diff --git a/MediaBrowser.Providers/Trickplay/TrickplayManager.cs b/MediaBrowser.Providers/Trickplay/TrickplayManager.cs
index 419adc4b03..9fe3a330a0 100644
--- a/MediaBrowser.Providers/Trickplay/TrickplayManager.cs
+++ b/MediaBrowser.Providers/Trickplay/TrickplayManager.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Configuration;
@@ -321,6 +322,81 @@ public class TrickplayManager : ITrickplayManager
return Path.Combine(GetTrickplayDirectory(item, width), index + ".jpg");
}
+ /// <inheritdoc />
+ public string? GetHlsPlaylist(Guid itemId, int width, string? apiKey)
+ {
+ var tilesResolutions = GetTilesResolutions(itemId);
+ if (tilesResolutions is not null && tilesResolutions.TryGetValue(width, out var tilesInfo))
+ {
+ var builder = new StringBuilder(128);
+
+ if (tilesInfo.TileCount > 0)
+ {
+ const string urlFormat = "Trickplay/{0}/{1}.jpg?MediaSourceId={2}&api_key={3}";
+ const string decimalFormat = "{0:0.###}";
+
+ var resolution = $"{tilesInfo.Width}x{tilesInfo.Height}";
+ var layout = $"{tilesInfo.TileWidth}x{tilesInfo.TileHeight}";
+ var tilesPerGrid = tilesInfo.TileWidth * tilesInfo.TileHeight;
+ var tileDuration = tilesInfo.Interval / 1000d;
+ var infDuration = tileDuration * tilesPerGrid;
+ var tileGridCount = (int)Math.Ceiling((decimal)tilesInfo.TileCount / tilesPerGrid);
+
+ builder
+ .AppendLine("#EXTM3U")
+ .Append("#EXT-X-TARGETDURATION:")
+ .AppendLine(tileGridCount.ToString(CultureInfo.InvariantCulture))
+ .AppendLine("#EXT-X-VERSION:7")
+ .AppendLine("#EXT-X-MEDIA-SEQUENCE:1")
+ .AppendLine("#EXT-X-PLAYLIST-TYPE:VOD")
+ .AppendLine("#EXT-X-IMAGES-ONLY");
+
+ for (int i = 0; i < tileGridCount; i++)
+ {
+ // All tile grids before the last one must contain full amount of tiles.
+ // The final grid will be 0 < count <= maxTiles
+ if (i == tileGridCount - 1)
+ {
+ tilesPerGrid = tilesInfo.TileCount - (i * tilesPerGrid);
+ infDuration = tileDuration * tilesPerGrid;
+ }
+
+ // EXTINF
+ builder
+ .Append("#EXTINF:")
+ .AppendFormat(CultureInfo.InvariantCulture, decimalFormat, infDuration)
+ .AppendLine(",");
+
+ // EXT-X-TILES
+ builder
+ .Append("#EXT-X-TILES:RESOLUTION=")
+ .Append(resolution)
+ .Append(",LAYOUT=")
+ .Append(layout)
+ .Append(",DURATION=")
+ .AppendFormat(CultureInfo.InvariantCulture, decimalFormat, tileDuration)
+ .AppendLine();
+
+ // URL
+ builder
+ .AppendFormat(
+ CultureInfo.InvariantCulture,
+ urlFormat,
+ width.ToString(CultureInfo.InvariantCulture),
+ i.ToString(CultureInfo.InvariantCulture),
+ itemId.ToString("N"),
+ apiKey)
+ .AppendLine();
+ }
+
+ builder.AppendLine("#EXT-X-ENDLIST");
+ return builder.ToString();
+ }
+ }
+
+ return null;
+ }
+
private string GetTrickplayDirectory(BaseItem item, int? width = null)
{
var path = Path.Combine(item.GetInternalMetadataPath(), "trickplay");