mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-09-06 11:34:57 +02:00
add rtsp classes
This commit is contained in:
parent
d8cf48ae41
commit
edd9ad6d63
6 changed files with 634 additions and 1 deletions
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
Copyright (C) <2007-2016> <Kay Diefenthal>
|
||||
|
||||
SatIp.RtspSample is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
SatIp.RtspSample is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with SatIp.RtspSample. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.SatIp
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard RTSP request methods.
|
||||
/// </summary>
|
||||
public sealed class RtspMethod
|
||||
{
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return (_name != null ? _name.GetHashCode() : 0);
|
||||
}
|
||||
|
||||
private readonly string _name;
|
||||
private static readonly IDictionary<string, RtspMethod> _values = new Dictionary<string, RtspMethod>();
|
||||
|
||||
public static readonly RtspMethod Describe = new RtspMethod("DESCRIBE");
|
||||
public static readonly RtspMethod Announce = new RtspMethod("ANNOUNCE");
|
||||
public static readonly RtspMethod GetParameter = new RtspMethod("GET_PARAMETER");
|
||||
public static readonly RtspMethod Options = new RtspMethod("OPTIONS");
|
||||
public static readonly RtspMethod Pause = new RtspMethod("PAUSE");
|
||||
public static readonly RtspMethod Play = new RtspMethod("PLAY");
|
||||
public static readonly RtspMethod Record = new RtspMethod("RECORD");
|
||||
public static readonly RtspMethod Redirect = new RtspMethod("REDIRECT");
|
||||
public static readonly RtspMethod Setup = new RtspMethod("SETUP");
|
||||
public static readonly RtspMethod SetParameter = new RtspMethod("SET_PARAMETER");
|
||||
public static readonly RtspMethod Teardown = new RtspMethod("TEARDOWN");
|
||||
|
||||
private RtspMethod(string name)
|
||||
{
|
||||
_name = name;
|
||||
_values.Add(name, this);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
var method = obj as RtspMethod;
|
||||
if (method != null && this == method)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static ICollection<RtspMethod> Values
|
||||
{
|
||||
get { return _values.Values; }
|
||||
}
|
||||
|
||||
public static explicit operator RtspMethod(string name)
|
||||
{
|
||||
RtspMethod value;
|
||||
if (!_values.TryGetValue(name, out value))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static implicit operator string(RtspMethod method)
|
||||
{
|
||||
return method._name;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
Copyright (C) <2007-2016> <Kay Diefenthal>
|
||||
|
||||
SatIp.RtspSample is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
SatIp.RtspSample is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with SatIp.RtspSample. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.SatIp
|
||||
{
|
||||
/// <summary>
|
||||
/// A simple class that can be used to serialise RTSP requests.
|
||||
/// </summary>
|
||||
public class RtspRequest
|
||||
{
|
||||
private readonly RtspMethod _method;
|
||||
private readonly string _uri;
|
||||
private readonly int _majorVersion;
|
||||
private readonly int _minorVersion;
|
||||
private IDictionary<string, string> _headers = new Dictionary<string, string>();
|
||||
private string _body = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise a new instance of the <see cref="RtspRequest"/> class.
|
||||
/// </summary>
|
||||
/// <param name="method">The request method.</param>
|
||||
/// <param name="uri">The request URI</param>
|
||||
/// <param name="majorVersion">The major version number.</param>
|
||||
/// <param name="minorVersion">The minor version number.</param>
|
||||
public RtspRequest(RtspMethod method, string uri, int majorVersion, int minorVersion)
|
||||
{
|
||||
_method = method;
|
||||
_uri = uri;
|
||||
_majorVersion = majorVersion;
|
||||
_minorVersion = minorVersion;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the request method.
|
||||
/// </summary>
|
||||
public RtspMethod Method
|
||||
{
|
||||
get
|
||||
{
|
||||
return _method;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the request URI.
|
||||
/// </summary>
|
||||
public string Uri
|
||||
{
|
||||
get
|
||||
{
|
||||
return _uri;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the request major version number.
|
||||
/// </summary>
|
||||
public int MajorVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return _majorVersion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the request minor version number.
|
||||
/// </summary>
|
||||
public int MinorVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return _minorVersion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get or set the request headers.
|
||||
/// </summary>
|
||||
public IDictionary<string, string> Headers
|
||||
{
|
||||
get
|
||||
{
|
||||
return _headers;
|
||||
}
|
||||
set
|
||||
{
|
||||
_headers = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get or set the request body.
|
||||
/// </summary>
|
||||
public string Body
|
||||
{
|
||||
get
|
||||
{
|
||||
return _body;
|
||||
}
|
||||
set
|
||||
{
|
||||
_body = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Serialise this request.
|
||||
/// </summary>
|
||||
/// <returns>raw request bytes</returns>
|
||||
public byte[] Serialise()
|
||||
{
|
||||
var request = new StringBuilder();
|
||||
request.AppendFormat("{0} {1} RTSP/{2}.{3}\r\n", _method, _uri, _majorVersion, _minorVersion);
|
||||
foreach (var header in _headers)
|
||||
{
|
||||
request.AppendFormat("{0}: {1}\r\n", header.Key, header.Value);
|
||||
}
|
||||
request.AppendFormat("\r\n{0}", _body);
|
||||
return Encoding.UTF8.GetBytes(request.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
Copyright (C) <2007-2016> <Kay Diefenthal>
|
||||
|
||||
SatIp.RtspSample is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
SatIp.RtspSample is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with SatIp.RtspSample. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.SatIp
|
||||
{
|
||||
/// <summary>
|
||||
/// A simple class that can be used to deserialise RTSP responses.
|
||||
/// </summary>
|
||||
public class RtspResponse
|
||||
{
|
||||
private static readonly Regex RegexStatusLine = new Regex(@"RTSP/(\d+)\.(\d+)\s+(\d+)\s+([^.]+?)\r\n(.*)", RegexOptions.Singleline);
|
||||
|
||||
private int _majorVersion = 1;
|
||||
private int _minorVersion;
|
||||
private RtspStatusCode _statusCode;
|
||||
private string _reasonPhrase;
|
||||
private IDictionary<string, string> _headers;
|
||||
private string _body;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise a new instance of the <see cref="RtspResponse"/> class.
|
||||
/// </summary>
|
||||
private RtspResponse()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response major version number.
|
||||
/// </summary>
|
||||
public int MajorVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return _majorVersion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response minor version number.
|
||||
/// </summary>
|
||||
public int MinorVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return _minorVersion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response status code.
|
||||
/// </summary>
|
||||
public RtspStatusCode StatusCode
|
||||
{
|
||||
get
|
||||
{
|
||||
return _statusCode;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response reason phrase.
|
||||
/// </summary>
|
||||
public string ReasonPhrase
|
||||
{
|
||||
get
|
||||
{
|
||||
return _reasonPhrase;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response headers.
|
||||
/// </summary>
|
||||
public IDictionary<string, string> Headers
|
||||
{
|
||||
get
|
||||
{
|
||||
return _headers;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the response body.
|
||||
/// </summary>
|
||||
public string Body
|
||||
{
|
||||
get
|
||||
{
|
||||
return _body;
|
||||
}
|
||||
set
|
||||
{
|
||||
_body = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserialise/parse an RTSP response.
|
||||
/// </summary>
|
||||
/// <param name="responseBytes">The raw response bytes.</param>
|
||||
/// <param name="responseByteCount">The number of valid bytes in the response.</param>
|
||||
/// <returns>a response object</returns>
|
||||
public static RtspResponse Deserialise(byte[] responseBytes, int responseByteCount)
|
||||
{
|
||||
var response = new RtspResponse();
|
||||
var responseString = Encoding.UTF8.GetString(responseBytes, 0, responseByteCount);
|
||||
|
||||
var m = RegexStatusLine.Match(responseString);
|
||||
if (m.Success)
|
||||
{
|
||||
response._majorVersion = int.Parse(m.Groups[1].Captures[0].Value);
|
||||
response._minorVersion = int.Parse(m.Groups[2].Captures[0].Value);
|
||||
response._statusCode = (RtspStatusCode)int.Parse(m.Groups[3].Captures[0].Value);
|
||||
response._reasonPhrase = m.Groups[4].Captures[0].Value;
|
||||
responseString = m.Groups[5].Captures[0].Value;
|
||||
}
|
||||
|
||||
var sections = responseString.Split(new[] { "\r\n\r\n" }, StringSplitOptions.None);
|
||||
response._body = sections[1];
|
||||
var headers = sections[0].Split(new[] { "\r\n" }, StringSplitOptions.None);
|
||||
response._headers = new Dictionary<string, string>();
|
||||
foreach (var headerInfo in headers.Select(header => header.Split(':')))
|
||||
{
|
||||
response._headers.Add(headerInfo[0], headerInfo[1].Trim());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
Copyright (C) <2007-2016> <Kay Diefenthal>
|
||||
|
||||
SatIp.RtspSample is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
SatIp.RtspSample is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with SatIp.RtspSample. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp.SatIp
|
||||
{
|
||||
/// <summary>
|
||||
/// Standard RTSP status codes.
|
||||
/// </summary>
|
||||
public enum RtspStatusCode
|
||||
{
|
||||
/// <summary>
|
||||
/// 100 continue
|
||||
/// </summary>
|
||||
Continue = 100,
|
||||
|
||||
/// <summary>
|
||||
/// 200 OK
|
||||
/// </summary>
|
||||
[Description("Okay")]
|
||||
Ok = 200,
|
||||
/// <summary>
|
||||
/// 201 created
|
||||
/// </summary>
|
||||
Created = 201,
|
||||
|
||||
/// <summary>
|
||||
/// 250 low on storage space
|
||||
/// </summary>
|
||||
[Description("Low On Storage Space")]
|
||||
LowOnStorageSpace = 250,
|
||||
|
||||
/// <summary>
|
||||
/// 300 multiple choices
|
||||
/// </summary>
|
||||
[Description("Multiple Choices")]
|
||||
MultipleChoices = 300,
|
||||
/// <summary>
|
||||
/// 301 moved permanently
|
||||
/// </summary>
|
||||
[Description("Moved Permanently")]
|
||||
MovedPermanently = 301,
|
||||
/// <summary>
|
||||
/// 302 moved temporarily
|
||||
/// </summary>
|
||||
[Description("Moved Temporarily")]
|
||||
MovedTemporarily = 302,
|
||||
/// <summary>
|
||||
/// 303 see other
|
||||
/// </summary>
|
||||
[Description("See Other")]
|
||||
SeeOther = 303,
|
||||
/// <summary>
|
||||
/// 304 not modified
|
||||
/// </summary>
|
||||
[Description("Not Modified")]
|
||||
NotModified = 304,
|
||||
/// <summary>
|
||||
/// 305 use proxy
|
||||
/// </summary>
|
||||
[Description("Use Proxy")]
|
||||
UseProxy = 305,
|
||||
|
||||
/// <summary>
|
||||
/// 400 bad request
|
||||
/// </summary>
|
||||
[Description("Bad Request")]
|
||||
BadRequest = 400,
|
||||
/// <summary>
|
||||
/// 401 unauthorised
|
||||
/// </summary>
|
||||
Unauthorised = 401,
|
||||
/// <summary>
|
||||
/// 402 payment required
|
||||
/// </summary>
|
||||
[Description("Payment Required")]
|
||||
PaymentRequired = 402,
|
||||
/// <summary>
|
||||
/// 403 forbidden
|
||||
/// </summary>
|
||||
Forbidden = 403,
|
||||
/// <summary>
|
||||
/// 404 not found
|
||||
/// </summary>
|
||||
[Description("Not Found")]
|
||||
NotFound = 404,
|
||||
/// <summary>
|
||||
/// 405 method not allowed
|
||||
/// </summary>
|
||||
[Description("Method Not Allowed")]
|
||||
MethodNotAllowed = 405,
|
||||
/// <summary>
|
||||
/// 406 not acceptable
|
||||
/// </summary>
|
||||
[Description("Not Acceptable")]
|
||||
NotAcceptable = 406,
|
||||
/// <summary>
|
||||
/// 407 proxy authentication required
|
||||
/// </summary>
|
||||
[Description("Proxy Authentication Required")]
|
||||
ProxyAuthenticationRequred = 407,
|
||||
/// <summary>
|
||||
/// 408 request time-out
|
||||
/// </summary>
|
||||
[Description("Request Time-Out")]
|
||||
RequestTimeOut = 408,
|
||||
|
||||
/// <summary>
|
||||
/// 410 gone
|
||||
/// </summary>
|
||||
Gone = 410,
|
||||
/// <summary>
|
||||
/// 411 length required
|
||||
/// </summary>
|
||||
[Description("Length Required")]
|
||||
LengthRequired = 411,
|
||||
/// <summary>
|
||||
/// 412 precondition failed
|
||||
/// </summary>
|
||||
[Description("Precondition Failed")]
|
||||
PreconditionFailed = 412,
|
||||
/// <summary>
|
||||
/// 413 request entity too large
|
||||
/// </summary>
|
||||
[Description("Request Entity Too Large")]
|
||||
RequestEntityTooLarge = 413,
|
||||
/// <summary>
|
||||
/// 414 request URI too large
|
||||
/// </summary>
|
||||
[Description("Request URI Too Large")]
|
||||
RequestUriTooLarge = 414,
|
||||
/// <summary>
|
||||
/// 415 unsupported media type
|
||||
/// </summary>
|
||||
[Description("Unsupported Media Type")]
|
||||
UnsupportedMediaType = 415,
|
||||
|
||||
/// <summary>
|
||||
/// 451 parameter not understood
|
||||
/// </summary>
|
||||
[Description("Parameter Not Understood")]
|
||||
ParameterNotUnderstood = 451,
|
||||
/// <summary>
|
||||
/// 452 conference not found
|
||||
/// </summary>
|
||||
[Description("Conference Not Found")]
|
||||
ConferenceNotFound = 452,
|
||||
/// <summary>
|
||||
/// 453 not enough bandwidth
|
||||
/// </summary>
|
||||
[Description("Not Enough Bandwidth")]
|
||||
NotEnoughBandwidth = 453,
|
||||
/// <summary>
|
||||
/// 454 session not found
|
||||
/// </summary>
|
||||
[Description("Session Not Found")]
|
||||
SessionNotFound = 454,
|
||||
/// <summary>
|
||||
/// 455 method not valid in this state
|
||||
/// </summary>
|
||||
[Description("Method Not Valid In This State")]
|
||||
MethodNotValidInThisState = 455,
|
||||
/// <summary>
|
||||
/// 456 header field not valid for this resource
|
||||
/// </summary>
|
||||
[Description("Header Field Not Valid For This Resource")]
|
||||
HeaderFieldNotValidForThisResource = 456,
|
||||
/// <summary>
|
||||
/// 457 invalid range
|
||||
/// </summary>
|
||||
[Description("Invalid Range")]
|
||||
InvalidRange = 457,
|
||||
/// <summary>
|
||||
/// 458 parameter is read-only
|
||||
/// </summary>
|
||||
[Description("Parameter Is Read-Only")]
|
||||
ParameterIsReadOnly = 458,
|
||||
/// <summary>
|
||||
/// 459 aggregate operation not allowed
|
||||
/// </summary>
|
||||
[Description("Aggregate Operation Not Allowed")]
|
||||
AggregateOperationNotAllowed = 459,
|
||||
/// <summary>
|
||||
/// 460 only aggregate operation allowed
|
||||
/// </summary>
|
||||
[Description("Only Aggregate Operation Allowed")]
|
||||
OnlyAggregateOperationAllowed = 460,
|
||||
/// <summary>
|
||||
/// 461 unsupported transport
|
||||
/// </summary>
|
||||
[Description("Unsupported Transport")]
|
||||
UnsupportedTransport = 461,
|
||||
/// <summary>
|
||||
/// 462 destination unreachable
|
||||
/// </summary>
|
||||
[Description("Destination Unreachable")]
|
||||
DestinationUnreachable = 462,
|
||||
|
||||
/// <summary>
|
||||
/// 500 internal server error
|
||||
/// </summary>
|
||||
[Description("Internal Server Error")]
|
||||
InternalServerError = 500,
|
||||
/// <summary>
|
||||
/// 501 not implemented
|
||||
/// </summary>
|
||||
[Description("Not Implemented")]
|
||||
NotImplemented = 501,
|
||||
/// <summary>
|
||||
/// 502 bad gateway
|
||||
/// </summary>
|
||||
[Description("Bad Gateway")]
|
||||
BadGateway = 502,
|
||||
/// <summary>
|
||||
/// 503 service unavailable
|
||||
/// </summary>
|
||||
[Description("Service Unavailable")]
|
||||
ServiceUnavailable = 503,
|
||||
/// <summary>
|
||||
/// 504 gateway time-out
|
||||
/// </summary>
|
||||
[Description("Gateway Time-Out")]
|
||||
GatewayTimeOut = 504,
|
||||
/// <summary>
|
||||
/// 505 RTSP version not supported
|
||||
/// </summary>
|
||||
[Description("RTSP Version Not Supported")]
|
||||
RtspVersionNotSupported = 505,
|
||||
|
||||
/// <summary>
|
||||
/// 551 option not supported
|
||||
/// </summary>
|
||||
[Description("Option Not Supported")]
|
||||
OptionNotSupported = 551
|
||||
}
|
||||
}
|
|
@ -235,7 +235,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
var result = new SatIpTunerHostInfo
|
||||
{
|
||||
Url = url,
|
||||
|
|
|
@ -248,6 +248,10 @@
|
|||
<Compile Include="LiveTv\RecordingImageProvider.cs" />
|
||||
<Compile Include="LiveTv\RefreshChannelsScheduledTask.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\ChannelScan.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\Rtsp\RtspMethod.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\Rtsp\RtspRequest.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\Rtsp\RtspResponse.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\Rtsp\RtspStatusCode.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\SatIpHost.cs" />
|
||||
<Compile Include="LiveTv\TunerHosts\SatIp\SatIpDiscovery.cs" />
|
||||
<Compile Include="Localization\LocalizationManager.cs" />
|
||||
|
|
Loading…
Reference in a new issue