added xspf parser

moved files to better namespaces
added example playlistfiles
codereformat
This commit is contained in:
2018-12-16 00:30:31 +01:00
parent 858a694eeb
commit a42814029a
9 changed files with 2312 additions and 18 deletions

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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;
}
}
}