using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; using Ombi.Api.Emby.Models; using Ombi.Api.Emby.Models.Media.Tv; using Ombi.Api.Emby.Models.Movie; using Ombi.Helpers; namespace Ombi.Api.Emby { public class EmbyApi : IEmbyApi { public EmbyApi(IApi api) { Api = api; } private IApi Api { get; } private const string EmbyConnectService = "https://connect.emby.media/service/"; /// /// Returns all users from the Emby Instance /// /// /// public async Task> GetUsers(string baseUri, string apiKey) { var request = new Request("emby/users", baseUri, HttpMethod.Get); AddHeaders(request, apiKey); var obj = await Api.Request>(request); return obj; } public async Task GetSystemInformation(string apiKey, string baseUrl) { var request = new Request("emby/System/Info", baseUrl, HttpMethod.Get); AddHeaders(request, apiKey); var obj = await Api.Request(request); return obj; } public async Task GetPublicInformation(string baseUrl) { var request = new Request("emby/System/Info/public", baseUrl, HttpMethod.Get); AddHeaders(request, string.Empty); var obj = await Api.Request(request); return obj; } public async Task LogIn(string username, string password, string apiKey, string baseUri) { var request = new Request("emby/users/authenticatebyname", baseUri, HttpMethod.Post); var body = new { username, pw = password, }; request.AddJsonBody(body); request.AddHeader("X-Emby-Authorization", $"MediaBrowser Client=\"Ombi\", Device=\"Ombi\", DeviceId=\"v3\", Version=\"v3\""); AddHeaders(request, apiKey); var obj = await Api.Request(request); return obj; } public async Task LoginConnectUser(string username, string password) { var request = new Request("user/authenticate", EmbyConnectService, HttpMethod.Post); var body = new { nameOrEmail = username, rawpw = password, }; request.AddJsonBody(body); AddEmbyHeaders(request); var obj = await Api.Request(request); return obj; } private static void AddEmbyHeaders(Request request) { request.AddHeader("Accept", "application/json"); request.AddHeader("X-Application", $"Ombi/{AssemblyHelper.GetRuntimeVersion()}"); request.AddContentHeader("Content-Type", "application/json"); } public async Task> GetCollection(string mediaId, string apiKey, string userId, string baseUrl) { var request = new Request($"emby/users/{userId}/items?parentId={mediaId}", baseUrl, HttpMethod.Get); AddHeaders(request, apiKey); request.AddQueryString("Fields", "ProviderIds,Overview"); request.AddQueryString("IsVirtualItem", "False"); return await Api.Request>(request); } public async Task> GetLibraries(string apiKey, string baseUrl) { var request = new Request("library/VirtualFolders", baseUrl, HttpMethod.Get); AddHeaders(request, apiKey); var response = await Api.Request>(request); return response; } public async Task> GetAllMovies(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await GetAll("Movie", apiKey, userId, baseUri, true, startIndex, count, parentIdFilder); } public async Task> RecentlyAddedMovies(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await RecentlyAdded("Movie", apiKey, userId, baseUri, true, startIndex, count, parentIdFilder); } public async Task> GetAllEpisodes(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await GetAll("Episode", apiKey, userId, baseUri, false, startIndex, count, parentIdFilder); } public async Task> RecentlyAddedEpisodes(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await RecentlyAdded("Episode", apiKey, userId, baseUri, false, startIndex, count, parentIdFilder); } public async Task> GetAllShows(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await GetAll("Series", apiKey, userId, baseUri, false, startIndex, count, parentIdFilder); } public async Task> RecentlyAddedShows(string apiKey, string parentIdFilder, int startIndex, int count, string userId, string baseUri) { return await RecentlyAdded("Series", apiKey, userId, baseUri, false, startIndex, count, parentIdFilder); } public async Task GetSeriesInformation(string mediaId, string apiKey, string userId, string baseUrl) { return await GetInformation(mediaId, apiKey, userId, baseUrl); } public async Task GetMovieInformation(string mediaId, string apiKey, string userId, string baseUrl) { return await GetInformation(mediaId, apiKey, userId, baseUrl); } public async Task GetEpisodeInformation(string mediaId, string apiKey, string userId, string baseUrl) { return await GetInformation(mediaId, apiKey, userId, baseUrl); } private async Task> RecentlyAdded(string type, string apiKey, string userId, string baseUri, bool includeOverview, int startIndex, int count, string parentIdFilder = default) { var request = new Request($"emby/users/{userId}/items", baseUri, HttpMethod.Get); request.AddQueryString("Recursive", true.ToString()); request.AddQueryString("IncludeItemTypes", type); request.AddQueryString("Fields", includeOverview ? "ProviderIds,MediaStreams,Overview" : "ProviderIds,MediaStreams "); request.AddQueryString("startIndex", startIndex.ToString()); request.AddQueryString("limit", count.ToString()); request.AddQueryString("sortBy", "DateCreated"); request.AddQueryString("SortOrder", "Descending"); if (!string.IsNullOrEmpty(parentIdFilder)) { request.AddQueryString("ParentId", parentIdFilder); } request.AddQueryString("IsVirtualItem", "False"); AddHeaders(request, apiKey); var obj = await Api.Request>(request); return obj; } private async Task GetInformation(string mediaId, string apiKey, string userId, string baseUrl) { var request = new Request($"emby/users/{userId}/items/{mediaId}", baseUrl, HttpMethod.Get); AddHeaders(request, apiKey); var response = await Api.RequestContent(request); return JsonConvert.DeserializeObject(response); } private async Task> GetAll(string type, string apiKey, string userId, string baseUri, bool includeOverview = false) { var request = new Request($"emby/users/{userId}/items", baseUri, HttpMethod.Get); request.AddQueryString("Recursive", true.ToString()); request.AddQueryString("IncludeItemTypes", type); request.AddQueryString("Fields", includeOverview ? "ProviderIds,Overview" : "ProviderIds"); request.AddQueryString("IsVirtualItem", "False"); AddHeaders(request, apiKey); var obj = await Api.Request>(request); return obj; } private async Task> GetAll(string type, string apiKey, string userId, string baseUri, bool includeOverview, int startIndex, int count, string parentIdFilder = default) { var request = new Request($"emby/users/{userId}/items", baseUri, HttpMethod.Get); request.AddQueryString("Recursive", true.ToString()); request.AddQueryString("IncludeItemTypes", type); request.AddQueryString("Fields", includeOverview ? "ProviderIds,Overview" : "ProviderIds"); request.AddQueryString("startIndex", startIndex.ToString()); request.AddQueryString("limit", count.ToString()); if (!string.IsNullOrEmpty(parentIdFilder)) { request.AddQueryString("ParentId", parentIdFilder); } request.AddQueryString("IsVirtualItem", "False"); AddHeaders(request, apiKey); var obj = await Api.Request>(request); return obj; } private static void AddHeaders(Request req, string apiKey) { if (!string.IsNullOrEmpty(apiKey)) { req.AddHeader("X-MediaBrowser-Token", apiKey); } req.AddHeader("Accept", "application/json"); req.AddContentHeader("Content-Type", "application/json"); req.AddHeader("Device", "Ombi"); } } }