// Kyoo - A portable and vast media library solution. // Copyright (c) Kyoo. // // See AUTHORS.md and LICENSE file in the project root for full license information. // // Kyoo is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // Kyoo is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . using System; using System.Threading.Tasks; using AspNetCore.Proxy; using AspNetCore.Proxy.Options; using Kyoo.Abstractions.Models.Attributes; using Kyoo.Abstractions.Models.Permissions; using Kyoo.Abstractions.Models.Utils; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using static Kyoo.Abstractions.Models.Utils.Constants; namespace Kyoo.Core.Api; /// /// Private routes of the transcoder. /// Url for these routes will be returned from /info or /master.m3u8 routes. /// This should not be called manually /// [ApiController] [Route("videos")] [Route("video", Order = AlternativeRoute)] [Permission("video", Kind.Read, Group = Group.Overall)] [ApiDefinition("Video", Group = OtherGroup)] public class VideoApi : Controller { public static string TranscoderUrl = Environment.GetEnvironmentVariable("TRANSCODER_URL") ?? "http://transcoder:7666"; private Task _Proxy(string route) { HttpProxyOptions proxyOptions = HttpProxyOptionsBuilder .Instance.WithHandleFailure( async (context, exception) => { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; await context.Response.WriteAsJsonAsync( new RequestError("Service unavailable") ); } ) .Build(); return this.HttpProxyAsync($"{TranscoderUrl}/{route}", proxyOptions); } [HttpGet("{path:base64}/direct")] [PartialPermission(Kind.Play)] [ProducesResponseType(StatusCodes.Status206PartialContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetDirectStream(string path) { await _Proxy($"{path}/direct"); } [HttpGet("{path:base64}/direct/{identifier}")] [PartialPermission(Kind.Play)] [ProducesResponseType(StatusCodes.Status206PartialContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetDirectStream(string path, string identifier) { await _Proxy($"{path}/direct/{identifier}"); } [HttpGet("{path:base64}/master.m3u8")] [PartialPermission(Kind.Play)] [ProducesResponseType(StatusCodes.Status206PartialContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetMaster(string path) { await _Proxy($"{path}/master.m3u8"); } [HttpGet("{path:base64}/{video:int}/{quality}/index.m3u8")] [PartialPermission(Kind.Play)] public async Task GetVideoIndex(string path, int video, string quality) { await _Proxy($"{path}/{video}/{quality}/index.m3u8"); } [HttpGet("{path:base64}/{video:int}/{quality}/{segment}")] [PartialPermission(Kind.Play)] public async Task GetVideoSegment(string path, int video, string quality, string segment) { await _Proxy($"{path}/{video}/{quality}/{segment}"); } [HttpGet("{path:base64}/audio/{audio}/index.m3u8")] [PartialPermission(Kind.Play)] public async Task GetAudioIndex(string path, string audio) { await _Proxy($"{path}/audio/{audio}/index.m3u8"); } [HttpGet("{path:base64}/audio/{audio}/{segment}")] [PartialPermission(Kind.Play)] public async Task GetAudioSegment(string path, string audio, string segment) { await _Proxy($"{path}/audio/{audio}/{segment}"); } [HttpGet("{path:base64}/attachment/{name}")] [PartialPermission(Kind.Play)] public async Task GetAttachment(string path, string name) { await _Proxy($"{path}/attachment/{name}"); } [HttpGet("{path:base64}/subtitle/{name}")] [PartialPermission(Kind.Play)] public async Task GetSubtitle(string path, string name) { await _Proxy($"{path}/subtitle/{name}"); } [HttpGet("{path:base64}/thumbnails.png")] [PartialPermission(Kind.Read)] public async Task GetThumbnails(string path) { await _Proxy($"{path}/thumbnails.png"); } [HttpGet("{path:base64}/thumbnails.vtt")] [PartialPermission(Kind.Read)] public async Task GetThumbnailsVtt(string path) { await _Proxy($"{path}/thumbnails.vtt"); } }