display recording groups
This commit is contained in:
parent
28b0ff1e75
commit
73255b6073
|
@ -52,6 +52,17 @@ namespace MediaBrowser.Api.LiveTv
|
||||||
|
|
||||||
[ApiMember(Name = "UserId", Description = "Optional filter by user and attach user data.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
[ApiMember(Name = "UserId", Description = "Optional filter by user and attach user data.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||||
public string UserId { get; set; }
|
public string UserId { get; set; }
|
||||||
|
|
||||||
|
[ApiMember(Name = "GroupId", Description = "Optional filter by recording group.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||||
|
public string GroupId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Route("/LiveTv/Recordings/Groups", "GET")]
|
||||||
|
[Api(Description = "Gets live tv recording groups")]
|
||||||
|
public class GetRecordingGroups : IReturn<QueryResult<RecordingInfoDto>>
|
||||||
|
{
|
||||||
|
[ApiMember(Name = "UserId", Description = "Optional filter by user and attach user data.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||||
|
public string UserId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("/LiveTv/Recordings/{Id}", "GET")]
|
[Route("/LiveTv/Recordings/{Id}", "GET")]
|
||||||
|
@ -247,7 +258,8 @@ namespace MediaBrowser.Api.LiveTv
|
||||||
var result = _liveTvManager.GetRecordings(new RecordingQuery
|
var result = _liveTvManager.GetRecordings(new RecordingQuery
|
||||||
{
|
{
|
||||||
ChannelId = request.ChannelId,
|
ChannelId = request.ChannelId,
|
||||||
UserId = request.UserId
|
UserId = request.UserId,
|
||||||
|
GroupId = request.GroupId
|
||||||
|
|
||||||
}, CancellationToken.None).Result;
|
}, CancellationToken.None).Result;
|
||||||
|
|
||||||
|
@ -378,5 +390,16 @@ namespace MediaBrowser.Api.LiveTv
|
||||||
|
|
||||||
return ToStreamResult(stream.Stream, stream.MimeType);
|
return ToStreamResult(stream.Stream, stream.MimeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public object Get(GetRecordingGroups request)
|
||||||
|
{
|
||||||
|
var result = _liveTvManager.GetRecordingGroups(new RecordingGroupQuery
|
||||||
|
{
|
||||||
|
UserId = request.UserId
|
||||||
|
|
||||||
|
}, CancellationToken.None).Result;
|
||||||
|
|
||||||
|
return ToOptimizedResult(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -211,5 +211,13 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
Task CreateSeriesTimer(SeriesTimerInfoDto timer, CancellationToken cancellationToken);
|
Task CreateSeriesTimer(SeriesTimerInfoDto timer, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the recording groups.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="query">The query.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task{QueryResult{RecordingGroupDto}}.</returns>
|
||||||
|
Task<QueryResult<RecordingGroupDto>> GetRecordingGroups(RecordingGroupQuery query, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,6 +239,9 @@
|
||||||
<Compile Include="..\MediaBrowser.Model\LiveTv\ProgramQuery.cs">
|
<Compile Include="..\MediaBrowser.Model\LiveTv\ProgramQuery.cs">
|
||||||
<Link>LiveTv\ProgramQuery.cs</Link>
|
<Link>LiveTv\ProgramQuery.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingGroupDto.cs">
|
||||||
|
<Link>LiveTv\RecordingGroupDto.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingInfoDto.cs">
|
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingInfoDto.cs">
|
||||||
<Link>LiveTv\RecordingInfoDto.cs</Link>
|
<Link>LiveTv\RecordingInfoDto.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
|
@ -226,6 +226,9 @@
|
||||||
<Compile Include="..\MediaBrowser.Model\LiveTv\ProgramQuery.cs">
|
<Compile Include="..\MediaBrowser.Model\LiveTv\ProgramQuery.cs">
|
||||||
<Link>LiveTv\ProgramQuery.cs</Link>
|
<Link>LiveTv\ProgramQuery.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingGroupDto.cs">
|
||||||
|
<Link>LiveTv\RecordingGroupDto.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingInfoDto.cs">
|
<Compile Include="..\MediaBrowser.Model\LiveTv\RecordingInfoDto.cs">
|
||||||
<Link>LiveTv\RecordingInfoDto.cs</Link>
|
<Link>LiveTv\RecordingInfoDto.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|
27
MediaBrowser.Model/LiveTv/RecordingGroupDto.cs
Normal file
27
MediaBrowser.Model/LiveTv/RecordingGroupDto.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
namespace MediaBrowser.Model.LiveTv
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class RecordingGroupDto.
|
||||||
|
/// </summary>
|
||||||
|
public class RecordingGroupDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the name.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The name.</value>
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The identifier.</value>
|
||||||
|
public string Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the recording count.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The recording count.</value>
|
||||||
|
public int RecordingCount { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -84,6 +84,12 @@ namespace MediaBrowser.Model.LiveTv
|
||||||
/// <value>The status.</value>
|
/// <value>The status.</value>
|
||||||
public RecordingStatus Status { get; set; }
|
public RecordingStatus Status { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the name of the status.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The name of the status.</value>
|
||||||
|
public string StatusName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Genre of the program.
|
/// Genre of the program.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -22,6 +22,21 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The identifier.</value>
|
/// <value>The identifier.</value>
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the group identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The group identifier.</value>
|
||||||
|
public string GroupId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RecordingGroupQuery
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the user identifier.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The user identifier.</value>
|
||||||
|
public string UserId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TimerQuery
|
public class TimerQuery
|
||||||
|
|
|
@ -75,6 +75,7 @@
|
||||||
<Compile Include="LiveTv\ChannelQuery.cs" />
|
<Compile Include="LiveTv\ChannelQuery.cs" />
|
||||||
<Compile Include="LiveTv\ProgramInfoDto.cs" />
|
<Compile Include="LiveTv\ProgramInfoDto.cs" />
|
||||||
<Compile Include="LiveTv\ProgramQuery.cs" />
|
<Compile Include="LiveTv\ProgramQuery.cs" />
|
||||||
|
<Compile Include="LiveTv\RecordingGroupDto.cs" />
|
||||||
<Compile Include="LiveTv\RecordingQuery.cs" />
|
<Compile Include="LiveTv\RecordingQuery.cs" />
|
||||||
<Compile Include="LiveTv\RecordingStatus.cs" />
|
<Compile Include="LiveTv\RecordingStatus.cs" />
|
||||||
<Compile Include="LiveTv\SeriesTimerInfoDto.cs" />
|
<Compile Include="LiveTv\SeriesTimerInfoDto.cs" />
|
||||||
|
@ -209,7 +210,6 @@
|
||||||
<PostBuildEvent Condition=" '$(ConfigurationName)' != 'Release Mono' ">if '$(ConfigurationName)' == 'Release' (
|
<PostBuildEvent Condition=" '$(ConfigurationName)' != 'Release Mono' ">if '$(ConfigurationName)' == 'Release' (
|
||||||
xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\net45\" /y /d /r /i
|
xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\net45\" /y /d /r /i
|
||||||
)</PostBuildEvent>
|
)</PostBuildEvent>
|
||||||
<PostBuildEvent Condition=" '$(ConfigurationName)' == 'Release Mono' ">cp -fu "$(MSBuildProjectDirectory)\..\packages\PropertyChanged.Fody.1.41.0.0\PropertyChanged.Fody.dll" "$(MSBuildProjectDirectory)\..\Tools\Fody\"</PostBuildEvent>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
|
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
|
||||||
<Import Project="Fody.targets" />
|
<Import Project="Fody.targets" />
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<MonoDevelop.Ide.Workspace ActiveConfiguration="Release Mono" />
|
<MonoDevelop.Ide.Workspace ActiveConfiguration="Release Mono" />
|
||||||
<MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\app.config">
|
<MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\app.config">
|
||||||
<Files>
|
<Files>
|
||||||
<File FileName="MediaBrowser.Server.Mono\app.config" Line="14" Column="17" />
|
<File FileName="MediaBrowser.Server.Mono\app.config" Line="15" Column="3" />
|
||||||
<File FileName="MediaBrowser.Server.Mono\FFMpeg\FFMpegDownloadInfo.cs" Line="1" Column="1" />
|
<File FileName="MediaBrowser.Server.Mono\FFMpeg\FFMpegDownloadInfo.cs" Line="1" Column="1" />
|
||||||
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="1" Column="1" />
|
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="1" Column="1" />
|
||||||
<File FileName="MediaBrowser.Server.Implementations\Library\UserManager.cs" Line="1" Column="1" />
|
<File FileName="MediaBrowser.Server.Implementations\Library\UserManager.cs" Line="1" Column="1" />
|
||||||
|
|
|
@ -160,6 +160,26 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
return val.Value * 2;
|
return val.Value * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetStatusName(RecordingStatus status)
|
||||||
|
{
|
||||||
|
if (status == RecordingStatus.InProgress)
|
||||||
|
{
|
||||||
|
return "In Progress";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == RecordingStatus.ConflictedNotOk)
|
||||||
|
{
|
||||||
|
return "Conflicted";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == RecordingStatus.ConflictedOk)
|
||||||
|
{
|
||||||
|
return "Scheduled";
|
||||||
|
}
|
||||||
|
|
||||||
|
return status.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
public RecordingInfoDto GetRecordingInfoDto(LiveTvRecording recording, LiveTvChannel channel, ILiveTvService service, User user = null)
|
public RecordingInfoDto GetRecordingInfoDto(LiveTvRecording recording, LiveTvChannel channel, ILiveTvService service, User user = null)
|
||||||
{
|
{
|
||||||
var info = recording.RecordingInfo;
|
var info = recording.RecordingInfo;
|
||||||
|
@ -176,6 +196,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
ExternalId = info.Id,
|
ExternalId = info.Id,
|
||||||
ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"),
|
ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"),
|
||||||
Status = info.Status,
|
Status = info.Status,
|
||||||
|
StatusName = GetStatusName(info.Status),
|
||||||
Path = info.Path,
|
Path = info.Path,
|
||||||
Genres = info.Genres,
|
Genres = info.Genres,
|
||||||
IsRepeat = info.IsRepeat,
|
IsRepeat = info.IsRepeat,
|
||||||
|
@ -291,9 +312,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
IsNews = program.IsNews,
|
IsNews = program.IsNews,
|
||||||
IsKids = program.IsKids,
|
IsKids = program.IsKids,
|
||||||
IsPremiere = program.IsPremiere,
|
IsPremiere = program.IsPremiere,
|
||||||
RunTimeTicks = (program.EndDate - program.StartDate).Ticks
|
RunTimeTicks = (program.EndDate - program.StartDate).Ticks,
|
||||||
|
Type = "Program"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var imageTag = GetImageTag(item);
|
||||||
|
|
||||||
|
if (imageTag.HasValue)
|
||||||
|
{
|
||||||
|
dto.ImageTags[ImageType.Primary] = imageTag.Value;
|
||||||
|
}
|
||||||
|
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, item.GetUserDataKey()));
|
dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, item.GetUserDataKey()));
|
||||||
|
|
|
@ -448,15 +448,31 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(query.ChannelId))
|
if (!string.IsNullOrEmpty(query.ChannelId))
|
||||||
{
|
{
|
||||||
|
var guid = new Guid(query.ChannelId);
|
||||||
|
|
||||||
|
var currentServiceName = service.Name;
|
||||||
|
|
||||||
list = list
|
list = list
|
||||||
.Where(i => _tvDtoService.GetInternalChannelId(service.Name, i.ChannelId) == new Guid(query.ChannelId))
|
.Where(i => _tvDtoService.GetInternalChannelId(currentServiceName, i.ChannelId) == guid)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(query.Id))
|
if (!string.IsNullOrEmpty(query.Id))
|
||||||
{
|
{
|
||||||
|
var guid = new Guid(query.Id);
|
||||||
|
|
||||||
|
var currentServiceName = service.Name;
|
||||||
|
|
||||||
list = list
|
list = list
|
||||||
.Where(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(query.Id))
|
.Where(i => _tvDtoService.GetInternalRecordingId(currentServiceName, i.Id) == guid)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(query.GroupId))
|
||||||
|
{
|
||||||
|
var guid = new Guid(query.GroupId);
|
||||||
|
|
||||||
|
list = list.Where(i => GetRecordingGroupIds(i).Contains(guid))
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -734,5 +750,118 @@ namespace MediaBrowser.Server.Implementations.LiveTv
|
||||||
|
|
||||||
await service.UpdateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
await service.UpdateSeriesTimerAsync(info, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<string> GetRecordingGroupNames(RecordingInfo recording)
|
||||||
|
{
|
||||||
|
var list = new List<string>();
|
||||||
|
|
||||||
|
if (recording.IsSeries)
|
||||||
|
{
|
||||||
|
list.Add(recording.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recording.IsKids)
|
||||||
|
{
|
||||||
|
list.Add("Kids");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recording.IsMovie)
|
||||||
|
{
|
||||||
|
list.Add("Movies");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recording.IsNews)
|
||||||
|
{
|
||||||
|
list.Add("News");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recording.IsPremiere)
|
||||||
|
{
|
||||||
|
list.Add("Sports");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!recording.IsSports && !recording.IsNews && !recording.IsMovie && !recording.IsKids && !recording.IsSeries)
|
||||||
|
{
|
||||||
|
list.Add("Others");
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Guid> GetRecordingGroupIds(RecordingInfo recording)
|
||||||
|
{
|
||||||
|
return GetRecordingGroupNames(recording).Select(i => i.ToLower()
|
||||||
|
.GetMD5())
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<QueryResult<RecordingGroupDto>> GetRecordingGroups(RecordingGroupQuery query, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var recordingResult = await GetRecordings(new RecordingQuery
|
||||||
|
{
|
||||||
|
UserId = query.UserId
|
||||||
|
|
||||||
|
}, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var recordings = recordingResult.Items;
|
||||||
|
|
||||||
|
var groups = new List<RecordingGroupDto>();
|
||||||
|
|
||||||
|
var series = recordings
|
||||||
|
.Where(i => i.IsSeries)
|
||||||
|
.ToLookup(i => i.Name, StringComparer.OrdinalIgnoreCase)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
groups.AddRange(series.OrderBy(i => i.Key).Select(i => new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = i.Key,
|
||||||
|
RecordingCount = i.Count()
|
||||||
|
}));
|
||||||
|
|
||||||
|
groups.Add(new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = "Kids",
|
||||||
|
RecordingCount = recordings.Count(i => i.IsKids)
|
||||||
|
});
|
||||||
|
|
||||||
|
groups.Add(new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = "Movies",
|
||||||
|
RecordingCount = recordings.Count(i => i.IsMovie)
|
||||||
|
});
|
||||||
|
|
||||||
|
groups.Add(new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = "News",
|
||||||
|
RecordingCount = recordings.Count(i => i.IsNews)
|
||||||
|
});
|
||||||
|
|
||||||
|
groups.Add(new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = "Sports",
|
||||||
|
RecordingCount = recordings.Count(i => i.IsSports)
|
||||||
|
});
|
||||||
|
|
||||||
|
groups.Add(new RecordingGroupDto
|
||||||
|
{
|
||||||
|
Name = "Others",
|
||||||
|
RecordingCount = recordings.Count(i => !i.IsSports && !i.IsNews && !i.IsMovie && !i.IsKids && !i.IsSeries)
|
||||||
|
});
|
||||||
|
|
||||||
|
groups = groups
|
||||||
|
.Where(i => i.RecordingCount > 0)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var group in groups)
|
||||||
|
{
|
||||||
|
group.Id = group.Name.ToLower().GetMD5().ToString("N");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new QueryResult<RecordingGroupDto>
|
||||||
|
{
|
||||||
|
Items = groups.ToArray(),
|
||||||
|
TotalRecordCount = groups.Count
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -445,6 +445,17 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.getLiveTvRecordingGroups = function (options) {
|
||||||
|
|
||||||
|
var url = self.getUrl("LiveTv/Recordings/Groups", options || {});
|
||||||
|
|
||||||
|
return self.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: url,
|
||||||
|
dataType: "json"
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
self.getLiveTvRecording = function (id, userId) {
|
self.getLiveTvRecording = function (id, userId) {
|
||||||
|
|
||||||
if (!id) {
|
if (!id) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.210" targetFramework="net45" />
|
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.212" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
Loading…
Reference in New Issue
Block a user