rework epg storage
This commit is contained in:
parent
33e31d246f
commit
adc22b5e81
|
@ -114,7 +114,7 @@ namespace Emby.Server.Implementations.Data
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +252,7 @@ namespace Emby.Server.Implementations.Data
|
||||||
AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
|
AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
|
||||||
AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
|
AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
|
||||||
AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
|
AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
|
||||||
|
AddColumn(db, "TypedBaseItems", "ShowId", "Text", existingColumnNames);
|
||||||
|
|
||||||
existingColumnNames = GetColumnNames(db, "ItemValues");
|
existingColumnNames = GetColumnNames(db, "ItemValues");
|
||||||
AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
|
AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
|
||||||
|
@ -457,7 +458,8 @@ namespace Emby.Server.Implementations.Data
|
||||||
"Artists",
|
"Artists",
|
||||||
"AlbumArtists",
|
"AlbumArtists",
|
||||||
"ExternalId",
|
"ExternalId",
|
||||||
"SeriesPresentationUniqueKey"
|
"SeriesPresentationUniqueKey",
|
||||||
|
"ShowId"
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly string[] _mediaStreamSaveColumns =
|
private readonly string[] _mediaStreamSaveColumns =
|
||||||
|
@ -577,7 +579,8 @@ namespace Emby.Server.Implementations.Data
|
||||||
"Artists",
|
"Artists",
|
||||||
"AlbumArtists",
|
"AlbumArtists",
|
||||||
"ExternalId",
|
"ExternalId",
|
||||||
"SeriesPresentationUniqueKey"
|
"SeriesPresentationUniqueKey",
|
||||||
|
"ShowId"
|
||||||
};
|
};
|
||||||
|
|
||||||
var saveItemCommandCommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
|
var saveItemCommandCommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
|
||||||
|
@ -1044,6 +1047,16 @@ namespace Emby.Server.Implementations.Data
|
||||||
saveItemStatement.TryBind("@AlbumArtists", albumArtists);
|
saveItemStatement.TryBind("@AlbumArtists", albumArtists);
|
||||||
saveItemStatement.TryBind("@ExternalId", item.ExternalId);
|
saveItemStatement.TryBind("@ExternalId", item.ExternalId);
|
||||||
|
|
||||||
|
var program = item as LiveTvProgram;
|
||||||
|
if (program != null)
|
||||||
|
{
|
||||||
|
saveItemStatement.TryBind("@ShowId", program.ShowId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
saveItemStatement.TryBindNull("@ShowId");
|
||||||
|
}
|
||||||
|
|
||||||
saveItemStatement.MoveNext();
|
saveItemStatement.MoveNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1935,6 +1948,23 @@ namespace Emby.Server.Implementations.Data
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (enableProgramAttributes)
|
||||||
|
{
|
||||||
|
var program = item as LiveTvProgram;
|
||||||
|
if (program != null)
|
||||||
|
{
|
||||||
|
if (!reader.IsDBNull(index))
|
||||||
|
{
|
||||||
|
program.ShowId = reader.GetString(index);
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2441,6 +2471,7 @@ namespace Emby.Server.Implementations.Data
|
||||||
list.Remove("IsPremiere");
|
list.Remove("IsPremiere");
|
||||||
list.Remove("EpisodeTitle");
|
list.Remove("EpisodeTitle");
|
||||||
list.Remove("IsRepeat");
|
list.Remove("IsRepeat");
|
||||||
|
list.Remove("ShowId");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HasEpisodeAttributes(query))
|
if (!HasEpisodeAttributes(query))
|
||||||
|
|
|
@ -94,7 +94,7 @@ namespace Emby.Server.Implementations.Data
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -305,26 +305,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
var seriesTimers = await GetSeriesTimersAsync(cancellationToken).ConfigureAwait(false);
|
var seriesTimers = await GetSeriesTimersAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
List<ChannelInfo> channels = null;
|
|
||||||
|
|
||||||
foreach (var timer in seriesTimers)
|
foreach (var timer in seriesTimers)
|
||||||
{
|
{
|
||||||
List<ProgramInfo> epgData;
|
await UpdateTimersForSeriesTimer(timer, false, true).ConfigureAwait(false);
|
||||||
|
|
||||||
if (timer.RecordAnyChannel)
|
|
||||||
{
|
|
||||||
if (channels == null)
|
|
||||||
{
|
|
||||||
channels = (await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false)).ToList();
|
|
||||||
}
|
|
||||||
var channelIds = channels.Select(i => i.Id).ToList();
|
|
||||||
epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
epgData = GetEpgDataForChannel(timer.ChannelId);
|
|
||||||
}
|
|
||||||
await UpdateTimersForSeriesTimer(epgData, timer, false, true).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,6 +315,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
var timers = await GetTimersAsync(cancellationToken).ConfigureAwait(false);
|
var timers = await GetTimersAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var tempChannelCache = new Dictionary<string, LiveTvChannel>();
|
||||||
|
|
||||||
foreach (var timer in timers)
|
foreach (var timer in timers)
|
||||||
{
|
{
|
||||||
if (DateTime.UtcNow > timer.EndDate && !_activeRecordings.ContainsKey(timer.Id))
|
if (DateTime.UtcNow > timer.EndDate && !_activeRecordings.ContainsKey(timer.Id))
|
||||||
|
@ -345,15 +330,14 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var epg = GetEpgDataForChannel(timer.ChannelId);
|
var program = GetProgramInfoFromCache(timer);
|
||||||
var program = epg.FirstOrDefault(i => string.Equals(i.Id, timer.ProgramId, StringComparison.OrdinalIgnoreCase));
|
|
||||||
if (program == null)
|
if (program == null)
|
||||||
{
|
{
|
||||||
OnTimerOutOfDate(timer);
|
OnTimerOutOfDate(timer);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
RecordingHelper.CopyProgramInfoToTimerInfo(program, timer);
|
CopyProgramInfoToTimerInfo(program, timer, tempChannelCache);
|
||||||
_timerProvider.Update(timer);
|
_timerProvider.Update(timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -672,11 +656,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
timer.Id = Guid.NewGuid().ToString("N");
|
timer.Id = Guid.NewGuid().ToString("N");
|
||||||
|
|
||||||
ProgramInfo programInfo = null;
|
LiveTvProgram programInfo = null;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(timer.ProgramId))
|
if (!string.IsNullOrWhiteSpace(timer.ProgramId))
|
||||||
{
|
{
|
||||||
programInfo = GetProgramInfoFromCache(timer.ChannelId, timer.ProgramId);
|
programInfo = GetProgramInfoFromCache(timer);
|
||||||
}
|
}
|
||||||
if (programInfo == null)
|
if (programInfo == null)
|
||||||
{
|
{
|
||||||
|
@ -686,7 +670,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
if (programInfo != null)
|
if (programInfo != null)
|
||||||
{
|
{
|
||||||
RecordingHelper.CopyProgramInfoToTimerInfo(programInfo, timer);
|
CopyProgramInfoToTimerInfo(programInfo, timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
timer.IsManual = true;
|
timer.IsManual = true;
|
||||||
|
@ -698,24 +682,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
info.Id = Guid.NewGuid().ToString("N");
|
info.Id = Guid.NewGuid().ToString("N");
|
||||||
|
|
||||||
List<ProgramInfo> epgData;
|
|
||||||
if (info.RecordAnyChannel)
|
|
||||||
{
|
|
||||||
var channels = await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false);
|
|
||||||
var channelIds = channels.Select(i => i.Id).ToList();
|
|
||||||
epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
epgData = GetEpgDataForChannel(info.ChannelId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// populate info.seriesID
|
// populate info.seriesID
|
||||||
var program = epgData.FirstOrDefault(i => string.Equals(i.Id, info.ProgramId, StringComparison.OrdinalIgnoreCase));
|
var program = GetProgramInfoFromCache(info.ProgramId);
|
||||||
|
|
||||||
if (program != null)
|
if (program != null)
|
||||||
{
|
{
|
||||||
info.SeriesId = program.SeriesId;
|
info.SeriesId = program.ExternalSeriesId;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -750,7 +722,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
_timerProvider.AddOrUpdate(timer, false);
|
_timerProvider.AddOrUpdate(timer, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
await UpdateTimersForSeriesTimer(epgData, info, true, false).ConfigureAwait(false);
|
await UpdateTimersForSeriesTimer(info, true, false).ConfigureAwait(false);
|
||||||
|
|
||||||
return info.Id;
|
return info.Id;
|
||||||
}
|
}
|
||||||
|
@ -779,19 +751,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
_seriesTimerProvider.Update(instance);
|
_seriesTimerProvider.Update(instance);
|
||||||
|
|
||||||
List<ProgramInfo> epgData;
|
await UpdateTimersForSeriesTimer(instance, true, true).ConfigureAwait(false);
|
||||||
if (instance.RecordAnyChannel)
|
|
||||||
{
|
|
||||||
var channels = await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false);
|
|
||||||
var channelIds = channels.Select(i => i.Id).ToList();
|
|
||||||
epgData = channelIds.SelectMany(GetEpgDataForChannel).ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
epgData = GetEpgDataForChannel(instance.ChannelId);
|
|
||||||
}
|
|
||||||
|
|
||||||
await UpdateTimersForSeriesTimer(epgData, instance, true, true).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -962,23 +922,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
return Task.FromResult((IEnumerable<SeriesTimerInfo>)_seriesTimerProvider.GetAll());
|
return Task.FromResult((IEnumerable<SeriesTimerInfo>)_seriesTimerProvider.GetAll());
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return await GetProgramsAsyncInternal(channelId, startDateUtc, endDateUtc, cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error getting programs", ex);
|
|
||||||
return GetEpgDataForChannel(channelId).Where(i => i.StartDate <= endDateUtc && i.EndDate >= startDateUtc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsListingProviderEnabledForTuner(ListingsProviderInfo info, string tunerHostId)
|
private bool IsListingProviderEnabledForTuner(ListingsProviderInfo info, string tunerHostId)
|
||||||
{
|
{
|
||||||
if (info.EnableAllTuners)
|
if (info.EnableAllTuners)
|
||||||
|
@ -994,7 +937,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
return info.EnabledTuners.Contains(tunerHostId, StringComparer.OrdinalIgnoreCase);
|
return info.EnabledTuners.Contains(tunerHostId, StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IEnumerable<ProgramInfo>> GetProgramsAsyncInternal(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
|
public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false);
|
var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false);
|
||||||
var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase));
|
var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
@ -1037,8 +980,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
if (programs.Count > 0)
|
if (programs.Count > 0)
|
||||||
{
|
{
|
||||||
SaveEpgDataForChannel(channelId, programs);
|
|
||||||
|
|
||||||
return programs;
|
return programs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1464,11 +1405,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
throw new ArgumentNullException("timer");
|
throw new ArgumentNullException("timer");
|
||||||
}
|
}
|
||||||
|
|
||||||
ProgramInfo programInfo = null;
|
LiveTvProgram programInfo = null;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(timer.ProgramId))
|
if (!string.IsNullOrWhiteSpace(timer.ProgramId))
|
||||||
{
|
{
|
||||||
programInfo = GetProgramInfoFromCache(timer.ChannelId, timer.ProgramId);
|
programInfo = GetProgramInfoFromCache(timer);
|
||||||
}
|
}
|
||||||
if (programInfo == null)
|
if (programInfo == null)
|
||||||
{
|
{
|
||||||
|
@ -1478,8 +1419,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
if (programInfo != null)
|
if (programInfo != null)
|
||||||
{
|
{
|
||||||
RecordingHelper.CopyProgramInfoToTimerInfo(programInfo, timer);
|
CopyProgramInfoToTimerInfo(programInfo, timer);
|
||||||
activeRecordingInfo.Program = programInfo;
|
//activeRecordingInfo.Program = programInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
string seriesPath = null;
|
string seriesPath = null;
|
||||||
|
@ -2336,18 +2277,49 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProgramInfo GetProgramInfoFromCache(string channelId, string programId)
|
private LiveTvProgram GetProgramInfoFromCache(string programId)
|
||||||
{
|
{
|
||||||
var epgData = GetEpgDataForChannel(channelId);
|
var query = new InternalItemsQuery
|
||||||
return epgData.FirstOrDefault(p => string.Equals(p.Id, programId, StringComparison.OrdinalIgnoreCase));
|
{
|
||||||
|
ItemIds = new[] { _liveTvManager.GetInternalProgramId(Name, programId).ToString("N") },
|
||||||
|
Limit = 1,
|
||||||
|
DtoOptions = new DtoOptions()
|
||||||
|
};
|
||||||
|
|
||||||
|
return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProgramInfo GetProgramInfoFromCache(string channelId, DateTime startDateUtc)
|
private LiveTvProgram GetProgramInfoFromCache(TimerInfo timer)
|
||||||
{
|
{
|
||||||
var epgData = GetEpgDataForChannel(channelId);
|
return GetProgramInfoFromCache(timer.ProgramId, timer.ChannelId);
|
||||||
var startDateTicks = startDateUtc.Ticks;
|
}
|
||||||
// Find the first program that starts within 3 minutes
|
|
||||||
return epgData.FirstOrDefault(p => Math.Abs(startDateTicks - p.StartDate.Ticks) <= TimeSpan.FromMinutes(3).Ticks);
|
private LiveTvProgram GetProgramInfoFromCache(string programId, string channelId)
|
||||||
|
{
|
||||||
|
return GetProgramInfoFromCache(programId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LiveTvProgram GetProgramInfoFromCache(string channelId, DateTime startDateUtc)
|
||||||
|
{
|
||||||
|
var query = new InternalItemsQuery
|
||||||
|
{
|
||||||
|
IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
|
||||||
|
Limit = 1,
|
||||||
|
DtoOptions = new DtoOptions(true)
|
||||||
|
{
|
||||||
|
EnableImages = false
|
||||||
|
},
|
||||||
|
MinStartDate = startDateUtc.AddMinutes(-3),
|
||||||
|
MaxStartDate = startDateUtc.AddMinutes(3),
|
||||||
|
OrderBy = new[] { new Tuple<string, SortOrder>(ItemSortBy.StartDate, SortOrder.Ascending) }
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(channelId))
|
||||||
|
{
|
||||||
|
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, channelId).ToString("N") };
|
||||||
|
}
|
||||||
|
|
||||||
|
return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
private LiveTvOptions GetConfiguration()
|
private LiveTvOptions GetConfiguration()
|
||||||
|
@ -2421,9 +2393,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateTimersForSeriesTimer(List<ProgramInfo> epgData, SeriesTimerInfo seriesTimer, bool updateTimerSettings, bool deleteInvalidTimers)
|
private async Task UpdateTimersForSeriesTimer(SeriesTimerInfo seriesTimer, bool updateTimerSettings, bool deleteInvalidTimers)
|
||||||
{
|
{
|
||||||
var allTimers = GetTimersForSeries(seriesTimer, epgData)
|
var allTimers = GetTimersForSeries(seriesTimer)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var registration = await _liveTvManager.GetRegistrationInfo("seriesrecordings").ConfigureAwait(false);
|
var registration = await _liveTvManager.GetRegistrationInfo("seriesrecordings").ConfigureAwait(false);
|
||||||
|
@ -2520,23 +2492,160 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer, IEnumerable<ProgramInfo> allPrograms)
|
private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer)
|
||||||
{
|
{
|
||||||
if (seriesTimer == null)
|
if (seriesTimer == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("seriesTimer");
|
throw new ArgumentNullException("seriesTimer");
|
||||||
}
|
}
|
||||||
if (allPrograms == null)
|
|
||||||
|
if (string.IsNullOrWhiteSpace(seriesTimer.SeriesId))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("allPrograms");
|
return new List<TimerInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exclude programs that have already ended
|
var query = new InternalItemsQuery
|
||||||
allPrograms = allPrograms.Where(i => i.EndDate > DateTime.UtcNow);
|
{
|
||||||
|
IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
|
||||||
|
ExternalSeriesId = seriesTimer.SeriesId,
|
||||||
|
DtoOptions = new DtoOptions(true)
|
||||||
|
{
|
||||||
|
EnableImages = false
|
||||||
|
},
|
||||||
|
MinEndDate = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
|
||||||
allPrograms = GetProgramsForSeries(seriesTimer, allPrograms);
|
if (!seriesTimer.RecordAnyChannel)
|
||||||
|
{
|
||||||
|
query.ChannelIds = new[] { _liveTvManager.GetInternalChannelId(Name, seriesTimer.ChannelId).ToString("N") };
|
||||||
|
}
|
||||||
|
|
||||||
return allPrograms.Select(i => RecordingHelper.CreateTimer(i, seriesTimer));
|
var tempChannelCache = new Dictionary<string, LiveTvChannel>();
|
||||||
|
|
||||||
|
return _libraryManager.GetItemList(query).Cast<LiveTvProgram>().Select(i => CreateTimer(i, seriesTimer, tempChannelCache));
|
||||||
|
}
|
||||||
|
|
||||||
|
private TimerInfo CreateTimer(LiveTvProgram parent, SeriesTimerInfo seriesTimer, Dictionary<string, LiveTvChannel> tempChannelCache)
|
||||||
|
{
|
||||||
|
string channelId = seriesTimer.RecordAnyChannel ? null : seriesTimer.ChannelId;
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(channelId) && !string.IsNullOrWhiteSpace(parent.ChannelId))
|
||||||
|
{
|
||||||
|
LiveTvChannel channel;
|
||||||
|
|
||||||
|
if (!tempChannelCache.TryGetValue(parent.ChannelId, out channel))
|
||||||
|
{
|
||||||
|
channel = _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
|
{
|
||||||
|
IncludeItemTypes = new string[] { typeof(LiveTvChannel).Name },
|
||||||
|
ItemIds = new[] { parent.ChannelId },
|
||||||
|
DtoOptions = new DtoOptions()
|
||||||
|
|
||||||
|
}).Cast<LiveTvChannel>().FirstOrDefault();
|
||||||
|
|
||||||
|
if (channel != null && !string.IsNullOrWhiteSpace(channel.ExternalId))
|
||||||
|
{
|
||||||
|
tempChannelCache[parent.ChannelId] = channel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel != null || tempChannelCache.TryGetValue(parent.ChannelId, out channel))
|
||||||
|
{
|
||||||
|
channelId = channel.ExternalId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var timer = new TimerInfo
|
||||||
|
{
|
||||||
|
ChannelId = channelId,
|
||||||
|
Id = (seriesTimer.Id + parent.ExternalId).GetMD5().ToString("N"),
|
||||||
|
StartDate = parent.StartDate,
|
||||||
|
EndDate = parent.EndDate.Value,
|
||||||
|
ProgramId = parent.ExternalId,
|
||||||
|
PrePaddingSeconds = seriesTimer.PrePaddingSeconds,
|
||||||
|
PostPaddingSeconds = seriesTimer.PostPaddingSeconds,
|
||||||
|
IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired,
|
||||||
|
IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired,
|
||||||
|
KeepUntil = seriesTimer.KeepUntil,
|
||||||
|
Priority = seriesTimer.Priority,
|
||||||
|
Name = parent.Name,
|
||||||
|
Overview = parent.Overview,
|
||||||
|
SeriesId = parent.ExternalSeriesId,
|
||||||
|
SeriesTimerId = seriesTimer.Id,
|
||||||
|
ShowId = parent.ShowId
|
||||||
|
};
|
||||||
|
|
||||||
|
CopyProgramInfoToTimerInfo(parent, timer, tempChannelCache);
|
||||||
|
|
||||||
|
return timer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyProgramInfoToTimerInfo(LiveTvProgram programInfo, TimerInfo timerInfo)
|
||||||
|
{
|
||||||
|
var tempChannelCache = new Dictionary<string, LiveTvChannel>();
|
||||||
|
CopyProgramInfoToTimerInfo(programInfo, timerInfo, tempChannelCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyProgramInfoToTimerInfo(LiveTvProgram programInfo, TimerInfo timerInfo, Dictionary<string, LiveTvChannel> tempChannelCache)
|
||||||
|
{
|
||||||
|
string channelId = null;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(programInfo.ChannelId))
|
||||||
|
{
|
||||||
|
LiveTvChannel channel;
|
||||||
|
|
||||||
|
if (!tempChannelCache.TryGetValue(programInfo.ChannelId, out channel))
|
||||||
|
{
|
||||||
|
channel = _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
|
{
|
||||||
|
IncludeItemTypes = new string[] { typeof(LiveTvChannel).Name },
|
||||||
|
ItemIds = new[] { programInfo.ChannelId },
|
||||||
|
DtoOptions = new DtoOptions()
|
||||||
|
|
||||||
|
}).Cast<LiveTvChannel>().FirstOrDefault();
|
||||||
|
|
||||||
|
if (channel != null && !string.IsNullOrWhiteSpace(channel.ExternalId))
|
||||||
|
{
|
||||||
|
tempChannelCache[programInfo.ChannelId] = channel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel != null || tempChannelCache.TryGetValue(programInfo.ChannelId, out channel))
|
||||||
|
{
|
||||||
|
channelId = channel.ExternalId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timerInfo.Name = programInfo.Name;
|
||||||
|
timerInfo.StartDate = programInfo.StartDate;
|
||||||
|
timerInfo.EndDate = programInfo.EndDate.Value;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(channelId))
|
||||||
|
{
|
||||||
|
timerInfo.ChannelId = channelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
timerInfo.SeasonNumber = programInfo.ParentIndexNumber;
|
||||||
|
timerInfo.EpisodeNumber = programInfo.IndexNumber;
|
||||||
|
timerInfo.IsMovie = programInfo.IsMovie;
|
||||||
|
timerInfo.IsKids = programInfo.IsKids;
|
||||||
|
timerInfo.IsNews = programInfo.IsNews;
|
||||||
|
timerInfo.IsSports = programInfo.IsSports;
|
||||||
|
timerInfo.ProductionYear = programInfo.ProductionYear;
|
||||||
|
timerInfo.EpisodeTitle = programInfo.EpisodeTitle;
|
||||||
|
timerInfo.OriginalAirDate = programInfo.PremiereDate;
|
||||||
|
timerInfo.IsProgramSeries = programInfo.IsSeries;
|
||||||
|
|
||||||
|
timerInfo.IsSeries = programInfo.IsSeries;
|
||||||
|
timerInfo.IsLive = programInfo.IsLive;
|
||||||
|
timerInfo.IsPremiere = programInfo.IsPremiere;
|
||||||
|
|
||||||
|
timerInfo.HomePageUrl = programInfo.HomePageUrl;
|
||||||
|
timerInfo.CommunityRating = programInfo.CommunityRating;
|
||||||
|
timerInfo.Overview = programInfo.Overview;
|
||||||
|
timerInfo.OfficialRating = programInfo.OfficialRating;
|
||||||
|
timerInfo.IsRepeat = programInfo.IsRepeat;
|
||||||
|
timerInfo.SeriesId = programInfo.ExternalSeriesId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsProgramAlreadyInLibrary(TimerInfo program)
|
private bool IsProgramAlreadyInLibrary(TimerInfo program)
|
||||||
|
@ -2577,47 +2686,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<ProgramInfo> GetProgramsForSeries(SeriesTimerInfo seriesTimer, IEnumerable<ProgramInfo> allPrograms)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(seriesTimer.SeriesId))
|
|
||||||
{
|
|
||||||
_logger.Error("seriesTimer.SeriesId is null. Cannot find programs for series");
|
|
||||||
return new List<ProgramInfo>();
|
|
||||||
}
|
|
||||||
|
|
||||||
return allPrograms.Where(i => string.Equals(i.SeriesId, seriesTimer.SeriesId, StringComparison.OrdinalIgnoreCase));
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetChannelEpgCachePath(string channelId)
|
|
||||||
{
|
|
||||||
return Path.Combine(_config.CommonApplicationPaths.CachePath, "embytvepg", channelId + ".json");
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly object _epgLock = new object();
|
|
||||||
private void SaveEpgDataForChannel(string channelId, List<ProgramInfo> epgData)
|
|
||||||
{
|
|
||||||
var path = GetChannelEpgCachePath(channelId);
|
|
||||||
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
|
|
||||||
lock (_epgLock)
|
|
||||||
{
|
|
||||||
_jsonSerializer.SerializeToFile(epgData, path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private List<ProgramInfo> GetEpgDataForChannel(string channelId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
lock (_epgLock)
|
|
||||||
{
|
|
||||||
return _jsonSerializer.DeserializeFromFile<List<ProgramInfo>>(GetChannelEpgCachePath(channelId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return new List<ProgramInfo>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Controller.LiveTv;
|
||||||
using MediaBrowser.Controller.LiveTv;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using MediaBrowser.Model.LiveTv;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
|
@ -13,63 +11,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
return timer.StartDate.AddSeconds(-timer.PrePaddingSeconds);
|
return timer.StartDate.AddSeconds(-timer.PrePaddingSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TimerInfo CreateTimer(ProgramInfo parent, SeriesTimerInfo seriesTimer)
|
|
||||||
{
|
|
||||||
var timer = new TimerInfo
|
|
||||||
{
|
|
||||||
ChannelId = parent.ChannelId,
|
|
||||||
Id = (seriesTimer.Id + parent.Id).GetMD5().ToString("N"),
|
|
||||||
StartDate = parent.StartDate,
|
|
||||||
EndDate = parent.EndDate,
|
|
||||||
ProgramId = parent.Id,
|
|
||||||
PrePaddingSeconds = seriesTimer.PrePaddingSeconds,
|
|
||||||
PostPaddingSeconds = seriesTimer.PostPaddingSeconds,
|
|
||||||
IsPostPaddingRequired = seriesTimer.IsPostPaddingRequired,
|
|
||||||
IsPrePaddingRequired = seriesTimer.IsPrePaddingRequired,
|
|
||||||
KeepUntil = seriesTimer.KeepUntil,
|
|
||||||
Priority = seriesTimer.Priority,
|
|
||||||
Name = parent.Name,
|
|
||||||
Overview = parent.Overview,
|
|
||||||
SeriesId = parent.SeriesId,
|
|
||||||
SeriesTimerId = seriesTimer.Id,
|
|
||||||
ShowId = parent.ShowId
|
|
||||||
};
|
|
||||||
|
|
||||||
CopyProgramInfoToTimerInfo(parent, timer);
|
|
||||||
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void CopyProgramInfoToTimerInfo(ProgramInfo programInfo, TimerInfo timerInfo)
|
|
||||||
{
|
|
||||||
timerInfo.Name = programInfo.Name;
|
|
||||||
timerInfo.StartDate = programInfo.StartDate;
|
|
||||||
timerInfo.EndDate = programInfo.EndDate;
|
|
||||||
timerInfo.ChannelId = programInfo.ChannelId;
|
|
||||||
|
|
||||||
timerInfo.SeasonNumber = programInfo.SeasonNumber;
|
|
||||||
timerInfo.EpisodeNumber = programInfo.EpisodeNumber;
|
|
||||||
timerInfo.IsMovie = programInfo.IsMovie;
|
|
||||||
timerInfo.IsKids = programInfo.IsKids;
|
|
||||||
timerInfo.IsNews = programInfo.IsNews;
|
|
||||||
timerInfo.IsSports = programInfo.IsSports;
|
|
||||||
timerInfo.ProductionYear = programInfo.ProductionYear;
|
|
||||||
timerInfo.EpisodeTitle = programInfo.EpisodeTitle;
|
|
||||||
timerInfo.OriginalAirDate = programInfo.OriginalAirDate;
|
|
||||||
timerInfo.IsProgramSeries = programInfo.IsSeries;
|
|
||||||
|
|
||||||
timerInfo.IsSeries = programInfo.IsSeries;
|
|
||||||
timerInfo.IsLive = programInfo.IsLive;
|
|
||||||
timerInfo.IsPremiere = programInfo.IsPremiere;
|
|
||||||
|
|
||||||
timerInfo.HomePageUrl = programInfo.HomePageUrl;
|
|
||||||
timerInfo.CommunityRating = programInfo.CommunityRating;
|
|
||||||
timerInfo.Overview = programInfo.Overview;
|
|
||||||
timerInfo.OfficialRating = programInfo.OfficialRating;
|
|
||||||
timerInfo.IsRepeat = programInfo.IsRepeat;
|
|
||||||
timerInfo.SeriesId = programInfo.SeriesId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetRecordingName(TimerInfo info)
|
public static string GetRecordingName(TimerInfo info)
|
||||||
{
|
{
|
||||||
var name = info.Name;
|
var name = info.Name;
|
||||||
|
|
|
@ -9,14 +9,12 @@ using MediaBrowser.Model.Entities;
|
||||||
using MediaBrowser.Model.LiveTv;
|
using MediaBrowser.Model.LiveTv;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MediaBrowser.Controller.Entities.TV;
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
using MediaBrowser.Model.Dto;
|
using MediaBrowser.Model.Dto;
|
||||||
using MediaBrowser.Model.Extensions;
|
using MediaBrowser.Model.Extensions;
|
||||||
using MediaBrowser.Model.Querying;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.LiveTv
|
namespace Emby.Server.Implementations.LiveTv
|
||||||
{
|
{
|
||||||
|
@ -25,15 +23,13 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IImageProcessor _imageProcessor;
|
private readonly IImageProcessor _imageProcessor;
|
||||||
|
|
||||||
private readonly IUserDataManager _userDataManager;
|
|
||||||
private readonly IDtoService _dtoService;
|
private readonly IDtoService _dtoService;
|
||||||
private readonly IApplicationHost _appHost;
|
private readonly IApplicationHost _appHost;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
|
||||||
public LiveTvDtoService(IDtoService dtoService, IUserDataManager userDataManager, IImageProcessor imageProcessor, ILogger logger, IApplicationHost appHost, ILibraryManager libraryManager)
|
public LiveTvDtoService(IDtoService dtoService, IImageProcessor imageProcessor, ILogger logger, IApplicationHost appHost, ILibraryManager libraryManager)
|
||||||
{
|
{
|
||||||
_dtoService = dtoService;
|
_dtoService = dtoService;
|
||||||
_userDataManager = userDataManager;
|
|
||||||
_imageProcessor = imageProcessor;
|
_imageProcessor = imageProcessor;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
|
|
@ -99,7 +99,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
_dtoService = dtoService;
|
_dtoService = dtoService;
|
||||||
_userDataManager = userDataManager;
|
_userDataManager = userDataManager;
|
||||||
|
|
||||||
_tvDtoService = new LiveTvDtoService(dtoService, userDataManager, imageProcessor, logger, appHost, _libraryManager);
|
_tvDtoService = new LiveTvDtoService(dtoService, imageProcessor, logger, appHost, _libraryManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -600,6 +600,12 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!string.Equals(info.ShowId, item.ShowId, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
item.ShowId = info.ShowId;
|
||||||
|
forceUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
var seriesId = info.SeriesId;
|
var seriesId = info.SeriesId;
|
||||||
|
|
||||||
if (!item.ParentId.Equals(channel.Id))
|
if (!item.ParentId.Equals(channel.Id))
|
||||||
|
@ -3143,5 +3149,15 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
var provider = _listingProviders.First(i => string.Equals(i.Type, info.Type, StringComparison.OrdinalIgnoreCase));
|
var provider = _listingProviders.First(i => string.Equals(i.Type, info.Type, StringComparison.OrdinalIgnoreCase));
|
||||||
return provider.GetChannels(info, cancellationToken);
|
return provider.GetChannels(info, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Guid GetInternalChannelId(string serviceName, string externalId)
|
||||||
|
{
|
||||||
|
return _tvDtoService.GetInternalChannelId(serviceName, externalId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Guid GetInternalProgramId(string serviceName, string externalId)
|
||||||
|
{
|
||||||
|
return _tvDtoService.GetInternalProgramId(serviceName, externalId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -42,7 +42,6 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public TimerInfo Timer { get; set; }
|
public TimerInfo Timer { get; set; }
|
||||||
public ProgramInfo Program { get; set; }
|
|
||||||
public CancellationTokenSource CancellationTokenSource { get; set; }
|
public CancellationTokenSource CancellationTokenSource { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,9 @@ namespace MediaBrowser.Controller.LiveTv
|
||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
public string EpisodeTitle { get; set; }
|
public string EpisodeTitle { get; set; }
|
||||||
|
|
||||||
|
[IgnoreDataMember]
|
||||||
|
public string ShowId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether this instance is movie.
|
/// Gets or sets a value indicating whether this instance is movie.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -24,8 +24,5 @@ namespace MediaBrowser.Model.Net
|
||||||
/// Sends a UDP message to a particular end point (uni or multicast).
|
/// Sends a UDP message to a particular end point (uni or multicast).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Task SendToAsync(byte[] buffer, int offset, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
|
Task SendToAsync(byte[] buffer, int offset, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
|
||||||
|
|
||||||
IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, AsyncCallback callback, object state);
|
|
||||||
int EndSendTo(IAsyncResult result);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -12,9 +12,8 @@
|
||||||
<AssemblyName>RSSDP</AssemblyName>
|
<AssemblyName>RSSDP</AssemblyName>
|
||||||
<DefaultLanguage>en-US</DefaultLanguage>
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<TargetFrameworkProfile />
|
||||||
<TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
|
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
@ -77,8 +76,18 @@
|
||||||
<Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
|
<Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
|
||||||
<Name>MediaBrowser.Model</Name>
|
<Name>MediaBrowser.Model</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Target Name="EmitMSBuildWarning" BeforeTargets="Build">
|
|
||||||
<Warning Text="Packages containing MSBuild targets and props files cannot be fully installed in projects targeting multiple frameworks. The MSBuild targets and props files have been ignored." />
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
|
@ -1,3 +1,3 @@
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("3.2.30.9")]
|
[assembly: AssemblyVersion("3.2.30.10")]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user