mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-17 03:33:46 +01:00
Move LiveTv tests to separate project
This commit is contained in:
@@ -1,156 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun;
|
||||
using MediaBrowser.Model.LiveTv;
|
||||
using Moq;
|
||||
using Moq.Protected;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
public class HdHomerunHostTests
|
||||
{
|
||||
private readonly Fixture _fixture;
|
||||
private readonly HdHomerunHost _hdHomerunHost;
|
||||
|
||||
public HdHomerunHostTests()
|
||||
{
|
||||
var messageHandler = new Mock<HttpMessageHandler>();
|
||||
messageHandler.Protected()
|
||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
||||
.Returns<HttpRequestMessage, CancellationToken>(
|
||||
(m, _) =>
|
||||
{
|
||||
return Task.FromResult(new HttpResponseMessage()
|
||||
{
|
||||
Content = new StreamContent(File.OpenRead(Path.Combine("Test Data/LiveTv", m.RequestUri!.Host, m.RequestUri.Segments[^1])))
|
||||
});
|
||||
});
|
||||
|
||||
var http = new Mock<IHttpClientFactory>();
|
||||
http.Setup(x => x.CreateClient(It.IsAny<string>()))
|
||||
.Returns(new HttpClient(messageHandler.Object));
|
||||
_fixture = new Fixture();
|
||||
_fixture.Customize(new AutoMoqCustomization
|
||||
{
|
||||
ConfigureMembers = true
|
||||
}).Inject(http);
|
||||
_hdHomerunHost = _fixture.Create<HdHomerunHost>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetModelInfo_Valid_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "192.168.1.182"
|
||||
};
|
||||
|
||||
var modelInfo = await _hdHomerunHost.GetModelInfo(host, true, CancellationToken.None);
|
||||
Assert.Equal("HDHomeRun PRIME", modelInfo.FriendlyName);
|
||||
Assert.Equal("HDHR3-CC", modelInfo.ModelNumber);
|
||||
Assert.Equal("hdhomerun3_cablecard", modelInfo.FirmwareName);
|
||||
Assert.Equal("20160630atest2", modelInfo.FirmwareVersion);
|
||||
Assert.Equal("FFFFFFFF", modelInfo.DeviceID);
|
||||
Assert.Equal("FFFFFFFF", modelInfo.DeviceAuth);
|
||||
Assert.Equal(3, modelInfo.TunerCount);
|
||||
Assert.Equal("http://192.168.1.182:80", modelInfo.BaseURL);
|
||||
Assert.Equal("http://192.168.1.182:80/lineup.json", modelInfo.LineupURL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetModelInfo_Legacy_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "10.10.10.100"
|
||||
};
|
||||
|
||||
var modelInfo = await _hdHomerunHost.GetModelInfo(host, true, CancellationToken.None);
|
||||
Assert.Equal("HDHomeRun DUAL", modelInfo.FriendlyName);
|
||||
Assert.Equal("HDHR3-US", modelInfo.ModelNumber);
|
||||
Assert.Equal("hdhomerun3_atsc", modelInfo.FirmwareName);
|
||||
Assert.Equal("20200225", modelInfo.FirmwareVersion);
|
||||
Assert.Equal("10xxxxx5", modelInfo.DeviceID);
|
||||
Assert.Null(modelInfo.DeviceAuth);
|
||||
Assert.Equal(2, modelInfo.TunerCount);
|
||||
Assert.Equal("http://10.10.10.100:80", modelInfo.BaseURL);
|
||||
Assert.Null(modelInfo.LineupURL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetModelInfo_EmptyUrl_ArgumentException()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = string.Empty
|
||||
};
|
||||
|
||||
await Assert.ThrowsAsync<ArgumentException>(() => _hdHomerunHost.GetModelInfo(host, true, CancellationToken.None));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetLineup_Valid_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "192.168.1.182"
|
||||
};
|
||||
|
||||
var channels = await _hdHomerunHost.GetLineup(host, CancellationToken.None);
|
||||
Assert.Equal(6, channels.Count);
|
||||
Assert.Equal("4.1", channels[0].GuideNumber);
|
||||
Assert.Equal("WCMH-DT", channels[0].GuideName);
|
||||
Assert.True(channels[0].HD);
|
||||
Assert.True(channels[0].Favorite);
|
||||
Assert.Equal("http://192.168.1.111:5004/auto/v4.1", channels[0].URL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetLineup_Legacy_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "10.10.10.100"
|
||||
};
|
||||
|
||||
// Placeholder json is invalid, just need to make sure we can reach it
|
||||
await Assert.ThrowsAsync<JsonException>(() => _hdHomerunHost.GetLineup(host, CancellationToken.None));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetLineup_ImportFavoritesOnly_Success()
|
||||
{
|
||||
var host = new TunerHostInfo()
|
||||
{
|
||||
Url = "192.168.1.182",
|
||||
ImportFavoritesOnly = true
|
||||
};
|
||||
|
||||
var channels = await _hdHomerunHost.GetLineup(host, CancellationToken.None);
|
||||
Assert.Single(channels);
|
||||
Assert.Equal("4.1", channels[0].GuideNumber);
|
||||
Assert.Equal("WCMH-DT", channels[0].GuideName);
|
||||
Assert.True(channels[0].HD);
|
||||
Assert.True(channels[0].Favorite);
|
||||
Assert.Equal("http://192.168.1.111:5004/auto/v4.1", channels[0].URL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TryGetTunerHostInfo_Valid_Success()
|
||||
{
|
||||
var host = await _hdHomerunHost.TryGetTunerHostInfo("192.168.1.182", CancellationToken.None);
|
||||
Assert.Equal(_hdHomerunHost.Type, host.Type);
|
||||
Assert.Equal("192.168.1.182", host.Url);
|
||||
Assert.Equal("HDHomeRun PRIME", host.FriendlyName);
|
||||
Assert.Equal("FFFFFFFF", host.DeviceId);
|
||||
Assert.Equal(3, host.TunerCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,326 +0,0 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
public class HdHomerunManagerTests
|
||||
{
|
||||
[Fact]
|
||||
public void WriteNullTerminatedString_Empty_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> expected = stackalloc byte[]
|
||||
{
|
||||
1, 0
|
||||
};
|
||||
|
||||
Span<byte> buffer = stackalloc byte[128];
|
||||
int len = HdHomerunManager.WriteNullTerminatedString(buffer, string.Empty);
|
||||
|
||||
Assert.Equal(
|
||||
Convert.ToHexString(expected),
|
||||
Convert.ToHexString(buffer.Slice(0, len)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteNullTerminatedString_Valid_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> expected = stackalloc byte[]
|
||||
{
|
||||
10, (byte)'T', (byte)'h', (byte)'e', (byte)' ', (byte)'q', (byte)'u', (byte)'i', (byte)'c', (byte)'k', 0
|
||||
};
|
||||
|
||||
Span<byte> buffer = stackalloc byte[128];
|
||||
int len = HdHomerunManager.WriteNullTerminatedString(buffer, "The quick");
|
||||
|
||||
Assert.Equal(
|
||||
Convert.ToHexString(expected),
|
||||
Convert.ToHexString(buffer.Slice(0, len)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteGetMessage_Valid_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> expected = stackalloc byte[]
|
||||
{
|
||||
0, 4,
|
||||
0, 12,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
0xc0, 0xc9, 0x87, 0x33
|
||||
};
|
||||
|
||||
Span<byte> buffer = stackalloc byte[128];
|
||||
int len = HdHomerunManager.WriteGetMessage(buffer, 0, "N");
|
||||
|
||||
Assert.Equal(
|
||||
Convert.ToHexString(expected),
|
||||
Convert.ToHexString(buffer.Slice(0, len)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteSetMessage_NoLockKey_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> expected = stackalloc byte[]
|
||||
{
|
||||
0, 4,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xa9, 0x49, 0xd0, 0x68
|
||||
};
|
||||
|
||||
Span<byte> buffer = stackalloc byte[128];
|
||||
int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", null);
|
||||
|
||||
Assert.Equal(
|
||||
Convert.ToHexString(expected),
|
||||
Convert.ToHexString(buffer.Slice(0, len)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteSetMessage_LockKey_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> expected = stackalloc byte[]
|
||||
{
|
||||
0, 4,
|
||||
0, 26,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
21,
|
||||
4, 0x00, 0x01, 0x38, 0xd5,
|
||||
0x8e, 0xb6, 0x06, 0x82
|
||||
};
|
||||
|
||||
Span<byte> buffer = stackalloc byte[128];
|
||||
int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", 80085);
|
||||
|
||||
Assert.Equal(
|
||||
Convert.ToHexString(expected),
|
||||
Convert.ToHexString(buffer.Slice(0, len)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_Valid_Success()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x7d, 0xa3, 0xa3, 0xf3
|
||||
};
|
||||
|
||||
Assert.True(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out var value));
|
||||
Assert.Equal("value", Encoding.UTF8.GetString(value));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_InvalidCrc_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x7d, 0xa3, 0xa3, 0xf4
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_InvalidPacketType_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 4,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xa9, 0x49, 0xd0, 0x68
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_InvalidPacket_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
0x7d, 0xa3, 0xa3
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_TooSmallMessageLength_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 19,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x25, 0x25, 0x44, 0x9a
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_TooLargeMessageLength_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 21,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xe3, 0x20, 0x79, 0x6c
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_TooLargeNameLength_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
20, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xe1, 0x8e, 0x9c, 0x74
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_InvalidGetSetNameTag_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
4,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xee, 0x05, 0xe7, 0x12
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_InvalidGetSetValueTag_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
3,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x64, 0xaa, 0x66, 0xf9
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryGetReturnValueOfGetSet_TooLargeValueLength_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
7, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0xc9, 0xa8, 0xd4, 0x55
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyReturnValueOfGetSet_Valid_True()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x7d, 0xa3, 0xa3, 0xf3
|
||||
};
|
||||
|
||||
Assert.True(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyReturnValueOfGetSet_WrongValue_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 5,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x7d, 0xa3, 0xa3, 0xf3
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "none"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyReturnValueOfGetSet_InvalidPacket_False()
|
||||
{
|
||||
ReadOnlySpan<byte> packet = new byte[]
|
||||
{
|
||||
0, 4,
|
||||
0, 20,
|
||||
3,
|
||||
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
|
||||
4,
|
||||
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
|
||||
0x7d, 0xa3, 0xa3, 0xf3
|
||||
};
|
||||
|
||||
Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using Emby.Server.Implementations.LiveTv.Listings;
|
||||
using MediaBrowser.Model.LiveTv;
|
||||
using Moq;
|
||||
using Moq.Protected;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv.Listings;
|
||||
|
||||
public class XmlTvListingsProviderTests
|
||||
{
|
||||
private readonly Fixture _fixture;
|
||||
private readonly XmlTvListingsProvider _xmlTvListingsProvider;
|
||||
|
||||
public XmlTvListingsProviderTests()
|
||||
{
|
||||
var messageHandler = new Mock<HttpMessageHandler>();
|
||||
messageHandler.Protected()
|
||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
||||
.Returns<HttpRequestMessage, CancellationToken>(
|
||||
(m, _) =>
|
||||
{
|
||||
return Task.FromResult(new HttpResponseMessage()
|
||||
{
|
||||
Content = new StreamContent(File.OpenRead(Path.Combine("Test Data/LiveTv/Listings/XmlTv", m.RequestUri!.Segments[^1])))
|
||||
});
|
||||
});
|
||||
|
||||
var http = new Mock<IHttpClientFactory>();
|
||||
http.Setup(x => x.CreateClient(It.IsAny<string>()))
|
||||
.Returns(new HttpClient(messageHandler.Object));
|
||||
_fixture = new Fixture();
|
||||
_fixture.Customize(new AutoMoqCustomization
|
||||
{
|
||||
ConfigureMembers = true
|
||||
}).Inject(http);
|
||||
_xmlTvListingsProvider = _fixture.Create<XmlTvListingsProvider>();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Test Data/LiveTv/Listings/XmlTv/notitle.xml")]
|
||||
[InlineData("https://example.com/notitle.xml")]
|
||||
public async Task GetProgramsAsync_NoTitle_Success(string path)
|
||||
{
|
||||
var info = new ListingsProviderInfo()
|
||||
{
|
||||
Path = path
|
||||
};
|
||||
|
||||
var startDate = new DateTime(2022, 11, 4);
|
||||
var programs = await _xmlTvListingsProvider.GetProgramsAsync(info, "3297", startDate, startDate.AddDays(1), CancellationToken.None);
|
||||
var programsList = programs.ToList();
|
||||
Assert.Single(programsList);
|
||||
var program = programsList[0];
|
||||
Assert.Null(program.Name);
|
||||
Assert.Null(program.SeriesId);
|
||||
Assert.Null(program.EpisodeTitle);
|
||||
Assert.True(program.IsSports);
|
||||
Assert.True(program.HasImage);
|
||||
Assert.Equal("https://domain.tld/image.png", program.ImageUrl);
|
||||
Assert.Equal("3297", program.ChannelId);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Test Data/LiveTv/Listings/XmlTv/emptycategory.xml")]
|
||||
[InlineData("https://example.com/emptycategory.xml")]
|
||||
public async Task GetProgramsAsync_EmptyCategories_Success(string path)
|
||||
{
|
||||
var info = new ListingsProviderInfo()
|
||||
{
|
||||
Path = path
|
||||
};
|
||||
|
||||
var startDate = new DateTime(2022, 11, 4);
|
||||
var programs = await _xmlTvListingsProvider.GetProgramsAsync(info, "3297", startDate, startDate.AddDays(1), CancellationToken.None);
|
||||
var programsList = programs.ToList();
|
||||
Assert.Single(programsList);
|
||||
var program = programsList[0];
|
||||
Assert.DoesNotContain(program.Genres, g => string.IsNullOrEmpty(g));
|
||||
Assert.Equal("3297", program.ChannelId);
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
using System;
|
||||
using Emby.Server.Implementations.LiveTv.EmbyTV;
|
||||
using MediaBrowser.Controller.LiveTv;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv
|
||||
{
|
||||
public static class RecordingHelperTests
|
||||
{
|
||||
public static TheoryData<string, TimerInfo> GetRecordingName_Success_TestData()
|
||||
{
|
||||
var data = new TheoryData<string, TimerInfo>();
|
||||
|
||||
data.Add(
|
||||
"The Incredibles 2020_04_20_21_06_00",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Incredibles",
|
||||
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
|
||||
IsMovie = true
|
||||
});
|
||||
|
||||
data.Add(
|
||||
"The Incredibles (2004)",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Incredibles",
|
||||
IsMovie = true,
|
||||
ProductionYear = 2004
|
||||
});
|
||||
data.Add(
|
||||
"The Big Bang Theory 2020_04_20_21_06_00",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
|
||||
IsProgramSeries = true,
|
||||
});
|
||||
data.Add(
|
||||
"The Big Bang Theory S12E10",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
SeasonNumber = 12,
|
||||
EpisodeNumber = 10
|
||||
});
|
||||
data.Add(
|
||||
"The Big Bang Theory S12E10 The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
SeasonNumber = 12,
|
||||
EpisodeNumber = 10,
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
});
|
||||
data.Add(
|
||||
"The Big Bang Theory 2018-12-06",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6, 0, 0, 0, DateTimeKind.Local)
|
||||
});
|
||||
|
||||
data.Add(
|
||||
"The Big Bang Theory 2018-12-06 - The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6, 0, 0, 0, DateTimeKind.Local),
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
});
|
||||
|
||||
data.Add(
|
||||
"The Big Bang Theory 2018_12_06_21_06_00 - The VCR Illumination",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "The Big Bang Theory",
|
||||
StartDate = new DateTime(2018, 12, 6, 21, 6, 0, DateTimeKind.Local),
|
||||
IsProgramSeries = true,
|
||||
OriginalAirDate = new DateTime(2018, 12, 6),
|
||||
EpisodeTitle = "The VCR Illumination"
|
||||
});
|
||||
|
||||
data.Add(
|
||||
"Lorem ipsum dolor sit amet: consect 2018_12_06_21_06_00",
|
||||
new TimerInfo
|
||||
{
|
||||
Name = "Lorem ipsum dolor sit amet: consect",
|
||||
IsProgramSeries = true,
|
||||
StartDate = new DateTime(2018, 12, 6, 21, 6, 0, DateTimeKind.Local),
|
||||
OriginalAirDate = new DateTime(2018, 12, 6),
|
||||
EpisodeTitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor"
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GetRecordingName_Success_TestData))]
|
||||
public static void GetRecordingName_Success(string expected, TimerInfo timerInfo)
|
||||
{
|
||||
Assert.Equal(expected, RecordingHelper.GetRecordingName(timerInfo));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,240 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using Emby.Server.Implementations.LiveTv.Listings.SchedulesDirectDtos;
|
||||
using Jellyfin.Extensions.Json;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.LiveTv.SchedulesDirect
|
||||
{
|
||||
public class SchedulesDirectDeserializeTests
|
||||
{
|
||||
private readonly JsonSerializerOptions _jsonOptions;
|
||||
|
||||
public SchedulesDirectDeserializeTests()
|
||||
{
|
||||
_jsonOptions = JsonDefaults.Options;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /token response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Token_Response_Live_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/token_live_response.json");
|
||||
var tokenDto = JsonSerializer.Deserialize<TokenDto>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(tokenDto);
|
||||
Assert.Equal(0, tokenDto!.Code);
|
||||
Assert.Equal("OK", tokenDto.Message);
|
||||
Assert.Equal("AWS-SD-web.1", tokenDto.ServerId);
|
||||
Assert.Equal(new DateTime(2016, 08, 23, 13, 55, 25, DateTimeKind.Utc), tokenDto.TokenTimestamp);
|
||||
Assert.Equal("f3fca79989cafe7dead71beefedc812b", tokenDto.Token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /token response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Token_Response_Offline_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/token_offline_response.json");
|
||||
var tokenDto = JsonSerializer.Deserialize<TokenDto>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(tokenDto);
|
||||
Assert.Equal(3_000, tokenDto!.Code);
|
||||
Assert.Equal("Server offline for maintenance.", tokenDto.Message);
|
||||
Assert.Equal("20141201.web.1", tokenDto.ServerId);
|
||||
Assert.Equal(new DateTime(2015, 04, 23, 00, 03, 32, DateTimeKind.Utc), tokenDto.TokenTimestamp);
|
||||
Assert.Equal("CAFEDEADBEEFCAFEDEADBEEFCAFEDEADBEEFCAFE", tokenDto.Token);
|
||||
Assert.Equal("SERVICE_OFFLINE", tokenDto.Response);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /schedules request.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Serialize_Schedule_Request_Success()
|
||||
{
|
||||
var expectedString = File.ReadAllText("Test Data/SchedulesDirect/schedules_request.json").Trim();
|
||||
|
||||
var requestObject = new RequestScheduleForChannelDto[]
|
||||
{
|
||||
new RequestScheduleForChannelDto
|
||||
{
|
||||
StationId = "20454",
|
||||
Date = new[]
|
||||
{
|
||||
"2015-03-13",
|
||||
"2015-03-17"
|
||||
}
|
||||
},
|
||||
new RequestScheduleForChannelDto
|
||||
{
|
||||
StationId = "10021",
|
||||
Date = new[]
|
||||
{
|
||||
"2015-03-12",
|
||||
"2015-03-13"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var requestString = JsonSerializer.Serialize(requestObject, _jsonOptions);
|
||||
Assert.Equal(expectedString, requestString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /schedules response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Schedule_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/schedules_response.json");
|
||||
var days = JsonSerializer.Deserialize<IReadOnlyList<DayDto>>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(days);
|
||||
Assert.Single(days);
|
||||
|
||||
var dayDto = days[0];
|
||||
Assert.Equal("20454", dayDto.StationId);
|
||||
Assert.Equal(2, dayDto.Programs.Count);
|
||||
|
||||
Assert.Equal("SH005371070000", dayDto.Programs[0].ProgramId);
|
||||
Assert.Equal(new DateTime(2015, 03, 03, 00, 00, 00, DateTimeKind.Utc), dayDto.Programs[0].AirDateTime);
|
||||
Assert.Equal(1_800, dayDto.Programs[0].Duration);
|
||||
Assert.Equal("Sy8HEMBPcuiAx3FBukUhKQ", dayDto.Programs[0].Md5);
|
||||
Assert.True(dayDto.Programs[0].New);
|
||||
Assert.Equal(2, dayDto.Programs[0].AudioProperties.Count);
|
||||
Assert.Equal("stereo", dayDto.Programs[0].AudioProperties[0]);
|
||||
Assert.Equal("cc", dayDto.Programs[0].AudioProperties[1]);
|
||||
Assert.Single(dayDto.Programs[0].VideoProperties);
|
||||
Assert.Equal("hdtv", dayDto.Programs[0].VideoProperties[0]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /programs response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Program_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/programs_response.json");
|
||||
var programDtos = JsonSerializer.Deserialize<IReadOnlyList<ProgramDetailsDto>>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(programDtos);
|
||||
Assert.Equal(2, programDtos!.Count);
|
||||
Assert.Equal("EP000000060003", programDtos[0].ProgramId);
|
||||
Assert.Single(programDtos[0].Titles);
|
||||
Assert.Equal("'Allo 'Allo!", programDtos[0].Titles[0].Title120);
|
||||
Assert.Equal("Series", programDtos[0].EventDetails?.SubType);
|
||||
Assert.Equal("en", programDtos[0].Descriptions?.Description1000[0].DescriptionLanguage);
|
||||
Assert.Equal("A disguised British Intelligence officer is sent to help the airmen.", programDtos[0].Descriptions?.Description1000[0].Description);
|
||||
Assert.Equal(new DateTime(1985, 11, 04), programDtos[0].OriginalAirDate);
|
||||
Assert.Single(programDtos[0].Genres);
|
||||
Assert.Equal("Sitcom", programDtos[0].Genres[0]);
|
||||
Assert.Equal("The Poloceman Cometh", programDtos[0].EpisodeTitle150);
|
||||
Assert.Equal(2, programDtos[0].Metadata[0].Gracenote?.Season);
|
||||
Assert.Equal(3, programDtos[0].Metadata[0].Gracenote?.Episode);
|
||||
Assert.Equal(13, programDtos[0].Cast.Count);
|
||||
Assert.Equal("383774", programDtos[0].Cast[0].PersonId);
|
||||
Assert.Equal("392649", programDtos[0].Cast[0].NameId);
|
||||
Assert.Equal("Gorden Kaye", programDtos[0].Cast[0].Name);
|
||||
Assert.Equal("Actor", programDtos[0].Cast[0].Role);
|
||||
Assert.Equal("01", programDtos[0].Cast[0].BillingOrder);
|
||||
Assert.Equal(3, programDtos[0].Crew.Count);
|
||||
Assert.Equal("354407", programDtos[0].Crew[0].PersonId);
|
||||
Assert.Equal("363281", programDtos[0].Crew[0].NameId);
|
||||
Assert.Equal("David Croft", programDtos[0].Crew[0].Name);
|
||||
Assert.Equal("Director", programDtos[0].Crew[0].Role);
|
||||
Assert.Equal("01", programDtos[0].Crew[0].BillingOrder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /metadata/programs response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Metadata_Programs_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/metadata_programs_response.json");
|
||||
var showImagesDtos = JsonSerializer.Deserialize<IReadOnlyList<ShowImagesDto>>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(showImagesDtos);
|
||||
Assert.Single(showImagesDtos!);
|
||||
Assert.Equal("SH00712240", showImagesDtos[0].ProgramId);
|
||||
Assert.Equal(4, showImagesDtos[0].Data.Count);
|
||||
Assert.Equal("135", showImagesDtos[0].Data[0].Width);
|
||||
Assert.Equal("180", showImagesDtos[0].Data[0].Height);
|
||||
Assert.Equal("assets/p282288_b_v2_aa.jpg", showImagesDtos[0].Data[0].Uri);
|
||||
Assert.Equal("Sm", showImagesDtos[0].Data[0].Size);
|
||||
Assert.Equal("3x4", showImagesDtos[0].Data[0].Aspect);
|
||||
Assert.Equal("Banner-L3", showImagesDtos[0].Data[0].Category);
|
||||
Assert.Equal("yes", showImagesDtos[0].Data[0].Text);
|
||||
Assert.Equal("true", showImagesDtos[0].Data[0].Primary);
|
||||
Assert.Equal("Series", showImagesDtos[0].Data[0].Tier);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /headends response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Headends_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/headends_response.json");
|
||||
var headendsDtos = JsonSerializer.Deserialize<IReadOnlyList<HeadendsDto>>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(headendsDtos);
|
||||
Assert.Equal(8, headendsDtos!.Count);
|
||||
Assert.Equal("CA00053", headendsDtos[0].Headend);
|
||||
Assert.Equal("Cable", headendsDtos[0].Transport);
|
||||
Assert.Equal("Beverly Hills", headendsDtos[0].Location);
|
||||
Assert.Equal(2, headendsDtos[0].Lineups.Count);
|
||||
Assert.Equal("Time Warner Cable - Cable", headendsDtos[0].Lineups[0].Name);
|
||||
Assert.Equal("USA-CA00053-DEFAULT", headendsDtos[0].Lineups[0].Lineup);
|
||||
Assert.Equal("/20141201/lineups/USA-CA00053-DEFAULT", headendsDtos[0].Lineups[0].Uri);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /lineups response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Lineups_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/lineups_response.json");
|
||||
var lineupsDto = JsonSerializer.Deserialize<LineupsDto>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(lineupsDto);
|
||||
Assert.Equal(0, lineupsDto!.Code);
|
||||
Assert.Equal("20141201.web.1", lineupsDto.ServerId);
|
||||
Assert.Equal(new DateTime(2015, 04, 17, 14, 22, 17, DateTimeKind.Utc), lineupsDto.LineupTimestamp);
|
||||
Assert.Equal(5, lineupsDto.Lineups.Count);
|
||||
Assert.Equal("GBR-0001317-DEFAULT", lineupsDto.Lineups[0].Lineup);
|
||||
Assert.Equal("Freeview - Carlton - LWT (Southeast)", lineupsDto.Lineups[0].Name);
|
||||
Assert.Equal("DVB-T", lineupsDto.Lineups[0].Transport);
|
||||
Assert.Equal("London", lineupsDto.Lineups[0].Location);
|
||||
Assert.Equal("/20141201/lineups/GBR-0001317-DEFAULT", lineupsDto.Lineups[0].Uri);
|
||||
|
||||
Assert.Equal("DELETED LINEUP", lineupsDto.Lineups[4].Name);
|
||||
Assert.True(lineupsDto.Lineups[4].IsDeleted);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// /lineup/:id response.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Deserialize_Lineup_Response_Success()
|
||||
{
|
||||
var bytes = File.ReadAllBytes("Test Data/SchedulesDirect/lineup_response.json");
|
||||
var channelDto = JsonSerializer.Deserialize<ChannelDto>(bytes, _jsonOptions);
|
||||
|
||||
Assert.NotNull(channelDto);
|
||||
Assert.Equal(2, channelDto!.Map.Count);
|
||||
Assert.Equal("24326", channelDto.Map[0].StationId);
|
||||
Assert.Equal("001", channelDto.Map[0].Channel);
|
||||
Assert.Equal("BBC ONE South", channelDto.Map[0].ProvderCallsign);
|
||||
Assert.Equal("1", channelDto.Map[0].LogicalChannelNumber);
|
||||
Assert.Equal("providerCallsign", channelDto.Map[0].MatchType);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{"FriendlyName":"HDHomeRun DUAL","ModelNumber":"HDHR3-US","Legacy":1,"FirmwareName":"hdhomerun3_atsc","FirmwareVersion":"20200225","DeviceID":"10xxxxx5","TunerCount":2,"BaseURL":"http://10.10.10.100:80"}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
@@ -1 +0,0 @@
|
||||
{"FriendlyName":"HDHomeRun PRIME","ModelNumber":"HDHR3-CC","FirmwareName":"hdhomerun3_cablecard","FirmwareVersion":"20160630atest2","DeviceID":"FFFFFFFF","DeviceAuth":"FFFFFFFF","TunerCount":3,"ConditionalAccess":1,"BaseURL":"http://192.168.1.182:80","LineupURL":"http://192.168.1.182:80/lineup.json"}
|
||||
@@ -1 +0,0 @@
|
||||
[ { "GuideNumber": "4.1", "GuideName": "WCMH-DT", "HD": 1, "Favorite": 1, "URL": "http://192.168.1.111:5004/auto/v4.1" }, { "GuideNumber": "4.2", "GuideName": "MeTV", "URL": "http://192.168.1.111:5004/auto/v4.2" }, { "GuideNumber": "4.3", "GuideName": "ION TV", "URL": "http://192.168.1.111:5004/auto/v4.3" }, { "GuideNumber": "6.1", "GuideName": "WSYX DT", "HD": 1, "URL": "http://192.168.1.111:5004/auto/v6.1" }, { "GuideNumber": "6.2", "GuideName": "MYTV", "URL": "http://192.168.1.111:5004/auto/v6.2" }, { "GuideNumber": "6.3", "GuideName": "ANTENNA", "URL": "http://192.168.1.111:5004/auto/v6.3" } ]
|
||||
@@ -1,6 +0,0 @@
|
||||
<tv date="20221104">
|
||||
<programme channel="3297" start="20221104130000 -0400" stop="20221105235959 -0400">
|
||||
<category lang="en" />
|
||||
<category lang="en">sports</category>
|
||||
</programme>
|
||||
</tv>
|
||||
@@ -1,10 +0,0 @@
|
||||
<tv date="20221104">
|
||||
<programme channel="3297" start="20221104130000 -0400" stop="20221105235959 -0400">
|
||||
<category lang="en">sports</category>
|
||||
<episode-num system="original-air-date">2022-11-04 13:00:00</episode-num>
|
||||
<icon height="" src="https://domain.tld/image.png" width=""/>
|
||||
<credits/>
|
||||
<video/>
|
||||
<date/>
|
||||
</programme>
|
||||
</tv>
|
||||
@@ -1 +0,0 @@
|
||||
[{"headend":"CA00053","transport":"Cable","location":"Beverly Hills","lineups":[{"name":"Time Warner Cable - Cable","lineup":"USA-CA00053-DEFAULT","uri":"/20141201/lineups/USA-CA00053-DEFAULT"},{"name":"Time Warner Cable - Digital","lineup":"USA-CA00053-X","uri":"/20141201/lineups/USA-CA00053-X"}]},{"headend":"CA61222","transport":"Cable","location":"Beverly Hills","lineups":[{"name":"Mulholland Estates - Cable","lineup":"USA-CA61222-DEFAULT","uri":"/20141201/lineups/USA-CA61222-DEFAULT"}]},{"headend":"CA66511","transport":"Cable","location":"Los Angeles","lineups":[{"name":"AT&T U-verse TV - Digital","lineup":"USA-CA66511-X","uri":"/20141201/lineups/USA-CA66511-X"}]},{"headend":"CA67309","transport":"Cable","location":"Westchester","lineups":[{"name":"Time Warner Cable Sherman Oaks - Cable","lineup":"USA-CA67309-DEFAULT","uri":"/20141201/lineups/USA-CA67309-DEFAULT"},{"name":"Time Warner Cable Sherman Oaks - Digital","lineup":"USA-CA67309-X","uri":"/20141201/lineups/USA-CA67309-X"}]},{"headend":"CA67310","transport":"Cable","location":"Eagle Rock","lineups":[{"name":"Time Warner Cable City of Los Angeles - Cable","lineup":"USA-CA67310-DEFAULT","uri":"/20141201/lineups/USA-CA67310-DEFAULT"},{"name":"Time Warner Cable City of Los Angeles - Digital","lineup":"USA-CA67310-X","uri":"/20141201/lineups/USA-CA67310-X"}]},{"headend":"DISH803","transport":"Satellite","location":"Los Angeles","lineups":[{"name":"DISH Los Angeles - Satellite","lineup":"USA-DISH803-DEFAULT","uri":"/20141201/lineups/USA-DISH803-DEFAULT"}]},{"headend":"DITV803","transport":"Satellite","location":"Los Angeles","lineups":[{"name":"DIRECTV Los Angeles - Satellite","lineup":"USA-DITV803-DEFAULT","uri":"/20141201/lineups/USA-DITV803-DEFAULT"}]},{"headend":"90210","transport":"Antenna","location":"90210","lineups":[{"name":"Antenna","lineup":"USA-OTA-90210","uri":"/20141201/lineups/USA-OTA-90210"}]}]
|
||||
@@ -1 +0,0 @@
|
||||
{"map":[{"stationID":"24326","channel":"001","providerCallsign":"BBC ONE South","logicalChannelNumber":"1","matchType":"providerCallsign"},{"stationID":"17154","channel":"002","providerCallsign":"BBC TWO","logicalChannelNumber":"2","matchType":"providerCallsign"}]}
|
||||
@@ -1 +0,0 @@
|
||||
{"code":0,"serverID":"20141201.web.1","datetime":"2015-04-17T14:22:17Z","lineups":[{"lineup":"GBR-0001317-DEFAULT","name":"Freeview - Carlton - LWT (Southeast)","transport":"DVB-T","location":"London","uri":"/20141201/lineups/GBR-0001317-DEFAULT"},{"lineup":"USA-IL57303-X","name":"Comcast Waukegan/Lake Forest Area - Digital","transport":"Cable","location":"Lake Forest","uri":"/20141201/lineups/USA-IL57303-X"},{"lineup":"USA-NY67791-X","name":"Verizon Fios Queens - Digital","transport":"Cable","location":"Fresh Meadows","uri":"/20141201/lineups/USA-NY67791-X"},{"lineup":"USA-OTA-60030","name":"Local Over the Air Broadcast","transport":"Antenna","location":"60030","uri":"/20141201/lineups/USA-OTA-60030"},{"lineup":"USA-WI61859-DEFAULT","name":"DELETED LINEUP","isDeleted":true}]}
|
||||
@@ -1 +0,0 @@
|
||||
[{"programID":"SH00712240","data":[{"width":"135","height":"180","uri":"assets/p282288_b_v2_aa.jpg","size":"Sm","aspect":"3x4","category":"Banner-L3","text":"yes","primary":"true","tier":"Series"},{"width":"720","height":"540","uri":"assets/p282288_b_h6_aa.jpg","size":"Lg","aspect":"4x3","category":"Banner-L3","text":"yes","primary":"true","tier":"Series"},{"width":"960","height":"1440","uri":"assets/p282288_b_v8_aa.jpg","size":"Ms","aspect":"2x3","category":"Banner-L3","text":"yes","primary":"true","tier":"Series"},{"width":"180","height":"135","uri":"assets/p282288_b_h5_aa.jpg","size":"Sm","aspect":"4x3","category":"Banner-L3","text":"yes","primary":"true","tier":"Series"}]}]
|
||||
@@ -1 +0,0 @@
|
||||
[{"programID":"EP000000060003","titles":[{"title120":"'Allo 'Allo!"}],"eventDetails":{"subType":"Series"},"descriptions":{"description1000":[{"descriptionLanguage":"en","description":"A disguised British Intelligence officer is sent to help the airmen."}]},"originalAirDate":"1985-11-04","genres":["Sitcom"],"episodeTitle150":"The Poloceman Cometh","metadata":[{"Gracenote":{"season":2,"episode":3}}],"cast":[{"personId":"383774","nameId":"392649","name":"Gorden Kaye","role":"Actor","billingOrder":"01"},{"personId":"246840","nameId":"250387","name":"Carmen Silvera","role":"Actor","billingOrder":"02"},{"personId":"376955","nameId":"385830","name":"Rose Hill","role":"Actor","billingOrder":"03"},{"personId":"259773","nameId":"263340","name":"Vicki Michelle","role":"Actor","billingOrder":"04"},{"personId":"353113","nameId":"361987","name":"Kirsten Cooke","role":"Actor","billingOrder":"05"},{"personId":"77787","nameId":"77787","name":"Richard Marner","role":"Actor","billingOrder":"06"},{"personId":"230921","nameId":"234193","name":"Guy Siner","role":"Actor","billingOrder":"07"},{"personId":"374934","nameId":"383809","name":"Kim Hartman","role":"Actor","billingOrder":"08"},{"personId":"369151","nameId":"378026","name":"Richard Gibson","role":"Actor","billingOrder":"09"},{"personId":"343690","nameId":"352564","name":"Arthur Bostrom","role":"Actor","billingOrder":"10"},{"personId":"352557","nameId":"361431","name":"John D. Collins","role":"Actor","billingOrder":"11"},{"personId":"605275","nameId":"627734","name":"Nicholas Frankau","role":"Actor","billingOrder":"12"},{"personId":"373394","nameId":"382269","name":"Jack Haig","role":"Actor","billingOrder":"13"}],"crew":[{"personId":"354407","nameId":"363281","name":"David Croft","role":"Director","billingOrder":"01"},{"personId":"354407","nameId":"363281","name":"David Croft","role":"Writer","billingOrder":"02"},{"personId":"105145","nameId":"105145","name":"Jeremy Lloyd","role":"Writer","billingOrder":"03"}],"showType":"Series","hasImageArtwork":true,"md5":"Jo5NKxoo44xRvBCAq8QT2A"},{"programID":"EP000000510142","titles":[{"title120":"A Different World"}],"eventDetails":{"subType":"Series"},"descriptions":{"description1000":[{"descriptionLanguage":"en","description":"Whitley and Dwayne tell new students about their honeymoon in Los Angeles."}]},"originalAirDate":"1992-09-24","genres":["Sitcom"],"episodeTitle150":"Honeymoon in L.A.","metadata":[{"Gracenote":{"season":6,"episode":1}}],"cast":[{"personId":"700","nameId":"700","name":"Jasmine Guy","role":"Actor","billingOrder":"01"},{"personId":"729","nameId":"729","name":"Kadeem Hardison","role":"Actor","billingOrder":"02"},{"personId":"120","nameId":"120","name":"Darryl M. Bell","role":"Actor","billingOrder":"03"},{"personId":"1729","nameId":"1729","name":"Cree Summer","role":"Actor","billingOrder":"04"},{"personId":"217","nameId":"217","name":"Charnele Brown","role":"Actor","billingOrder":"05"},{"personId":"1811","nameId":"1811","name":"Glynn Turman","role":"Actor","billingOrder":"06"},{"personId":"1232","nameId":"1232","name":"Lou Myers","role":"Actor","billingOrder":"07"},{"personId":"1363","nameId":"1363","name":"Jada Pinkett","role":"Guest Star","billingOrder":"08"},{"personId":"222967","nameId":"225536","name":"Ajai Sanders","role":"Guest Star","billingOrder":"09"},{"personId":"181744","nameId":"183292","name":"Karen Malina White","role":"Guest Star","billingOrder":"10"},{"personId":"305017","nameId":"318897","name":"Patrick Y. Malone","role":"Guest Star","billingOrder":"11"},{"personId":"9841","nameId":"9841","name":"Bumper Robinson","role":"Guest Star","billingOrder":"12"},{"personId":"426422","nameId":"435297","name":"Sister Souljah","role":"Guest Star","billingOrder":"13"},{"personId":"25","nameId":"25","name":"Debbie Allen","role":"Guest Star","billingOrder":"14"},{"personId":"668","nameId":"668","name":"Gilbert Gottfried","role":"Guest Star","billingOrder":"15"}],"showType":"Series","hasImageArtwork":true,"md5":"P5kz0QmCeYxIA+yL0H4DWw"}]
|
||||
@@ -1 +0,0 @@
|
||||
[{"stationID":"20454","date":["2015-03-13","2015-03-17"]},{"stationID":"10021","date":["2015-03-12","2015-03-13"]}]
|
||||
@@ -1 +0,0 @@
|
||||
[{"stationID":"20454","programs":[{"programID":"SH005371070000","airDateTime":"2015-03-03T00:00:00Z","duration":1800,"md5":"Sy8HEMBPcuiAx3FBukUhKQ","new":true,"audioProperties":["stereo","cc"],"videoProperties":["hdtv"]},{"programID":"EP000014577244","airDateTime":"2015-03-03T00:30:00Z","duration":1800,"md5":"25DNXVXO192JI7Y9vSW9lQ","new":true,"audioProperties":["stereo","cc"],"videoProperties":["hdtv"]}]}]
|
||||
@@ -1 +0,0 @@
|
||||
{"code":0,"message":"OK","serverID":"AWS-SD-web.1","datetime":"2016-08-23T13:55:25Z","token":"f3fca79989cafe7dead71beefedc812b"}
|
||||
@@ -1 +0,0 @@
|
||||
{"response":"SERVICE_OFFLINE","code":3000,"serverID":"20141201.web.1","message":"Server offline for maintenance.","datetime":"2015-04-23T00:03:32Z","token":"CAFEDEADBEEFCAFEDEADBEEFCAFEDEADBEEFCAFE"}
|
||||
Reference in New Issue
Block a user