added xspf parser
moved files to better namespaces added example playlistfiles codereformat
This commit is contained in:
@@ -4,12 +4,14 @@ using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Tv7Playlist.Core.Parsers
|
||||
namespace Tv7Playlist.Core.Parsers.M3u
|
||||
{
|
||||
public class M3UParser : IPlaylistParser
|
||||
{
|
||||
private const string ExtInfStartTag = "#EXTINF:";
|
||||
private const string ExtFileStartTag = "#EXTM3U";
|
||||
private const string ExtFileStartTag = "#EXTM3U";
|
||||
private const int IdStartNumber = 1000;
|
||||
private const int IdIncrementNumber = 5;
|
||||
|
||||
private readonly ILogger<M3UParser> _logger;
|
||||
|
||||
@@ -47,12 +49,12 @@ namespace Tv7Playlist.Core.Parsers
|
||||
}
|
||||
|
||||
var tracks = new List<ParsedTrack>(300);
|
||||
var currentId = 1000;
|
||||
var currentId = IdStartNumber;
|
||||
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
await ParseTracksAsync(reader, tracks, currentId);
|
||||
currentId++;
|
||||
currentId+=IdIncrementNumber;
|
||||
}
|
||||
|
||||
return tracks;
|
46
Tv7Playlist.Core/Parsers/Xspf/Playlist.cs
Normal file
46
Tv7Playlist.Core/Parsers/Xspf/Playlist.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Tv7Playlist.Core.Parsers.Xspf
|
||||
{
|
||||
/// <remarks>
|
||||
/// <?xml version="1.0" encoding="UTF-8"?>
|
||||
/// <playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
|
||||
/// <title>TV7 Playlist</title>
|
||||
/// <trackList>
|
||||
/// <track>
|
||||
/// <title>SRF1 HD</title>
|
||||
/// <location>udp://@239.77.0.77:5000</location>
|
||||
/// <extension application="http://www.videolan.org/vlc/playlist/0">
|
||||
/// <vlc:id>1000</vlc:id>
|
||||
/// <vlc:option>network-caching=1000</vlc:option>
|
||||
/// </extension>
|
||||
/// </track>
|
||||
/// <track>
|
||||
/// <title>SRFzwei HD</title>
|
||||
/// <location>udp://@239.77.0.78:5000</location>
|
||||
/// <extension application="http://www.videolan.org/vlc/playlist/0">
|
||||
/// <vlc:id>1005</vlc:id>
|
||||
/// <vlc:option>network-caching=1000</vlc:option>
|
||||
/// </extension>
|
||||
/// </track>
|
||||
/// </trackList>
|
||||
/// </playlist>
|
||||
/// ///
|
||||
/// </remarks>
|
||||
[Serializable]
|
||||
[DesignerCategory("code")]
|
||||
[XmlType(AnonymousType = true, Namespace = "http://xspf.org/ns/0/")]
|
||||
[XmlRoot(Namespace = "http://xspf.org/ns/0/", IsNullable = false, ElementName = "playlist")]
|
||||
public class Playlist
|
||||
{
|
||||
[XmlElement("title")] public string Title { get; set; }
|
||||
|
||||
[XmlArrayItem("track", IsNullable = false)]
|
||||
[XmlArray("trackList")]
|
||||
public PlaylistTrack[] TrackList { get; set; }
|
||||
|
||||
[XmlAttribute("version")] public byte Version { get; set; }
|
||||
}
|
||||
}
|
18
Tv7Playlist.Core/Parsers/Xspf/PlaylistTrack.cs
Normal file
18
Tv7Playlist.Core/Parsers/Xspf/PlaylistTrack.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Tv7Playlist.Core.Parsers.Xspf
|
||||
{
|
||||
[Serializable]
|
||||
[DesignerCategory("code")]
|
||||
[XmlType(AnonymousType = true, Namespace = "http://xspf.org/ns/0/")]
|
||||
public class PlaylistTrack
|
||||
{
|
||||
[XmlElement("title")] public string Title { get; set; }
|
||||
|
||||
[XmlElement("location")] public string Location { get; set; }
|
||||
|
||||
[XmlElement("extension")] public PlaylistTrackExtension Extension { get; set; }
|
||||
}
|
||||
}
|
20
Tv7Playlist.Core/Parsers/Xspf/PlaylistTrackExtension.cs
Normal file
20
Tv7Playlist.Core/Parsers/Xspf/PlaylistTrackExtension.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Tv7Playlist.Core.Parsers.Xspf
|
||||
{
|
||||
[Serializable]
|
||||
[DesignerCategory("code")]
|
||||
[XmlType(AnonymousType = true, Namespace = "http://xspf.org/ns/0/")]
|
||||
public class PlaylistTrackExtension
|
||||
{
|
||||
[XmlElement("id", Namespace = "http://www.videolan.org/vlc/playlist/ns/0/")]
|
||||
public ushort Id { get; set; }
|
||||
|
||||
[XmlElement("option", Namespace = "http://www.videolan.org/vlc/playlist/ns/0/")]
|
||||
public string Option { get; set; }
|
||||
|
||||
[XmlAttribute("application")] public string Application { get; set; }
|
||||
}
|
||||
}
|
45
Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs
Normal file
45
Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using System.Xml.Schema;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Tv7Playlist.Core.Parsers.Xspf
|
||||
{
|
||||
public class XspfParser : IPlaylistParser
|
||||
{
|
||||
public Task<IReadOnlyCollection<ParsedTrack>> ParseFromStream(Stream stream)
|
||||
{
|
||||
var deserializedList = DeserializePlaylist(stream);
|
||||
|
||||
var tracks = deserializedList.TrackList.Select(t => new ParsedTrack(t.Extension.Id, t.Title, t.Location))
|
||||
.ToList();
|
||||
|
||||
return Task.FromResult((IReadOnlyCollection<ParsedTrack>) tracks);
|
||||
}
|
||||
|
||||
private static Playlist DeserializePlaylist(Stream stream)
|
||||
{
|
||||
var serializer = new XmlSerializer(typeof(Playlist));
|
||||
var xmlReaderSettings = GetXmlReaderSettings();
|
||||
|
||||
using (var reader = XmlReader.Create(stream, xmlReaderSettings))
|
||||
{
|
||||
var deserializedList = (Playlist) serializer.Deserialize(reader);
|
||||
return deserializedList;
|
||||
}
|
||||
}
|
||||
|
||||
private static XmlReaderSettings GetXmlReaderSettings()
|
||||
{
|
||||
var xmlReaderSettings = new XmlReaderSettings
|
||||
{
|
||||
IgnoreProcessingInstructions = true,
|
||||
ValidationFlags = XmlSchemaValidationFlags.None
|
||||
};
|
||||
return xmlReaderSettings;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user