2019-09-05 02:04:20 +00:00
|
|
|
|
using Roadie.Dlna.Server;
|
|
|
|
|
using Roadie.Dlna.Utility;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
namespace Roadie.Dlna.Services
|
|
|
|
|
{
|
|
|
|
|
[Serializable]
|
|
|
|
|
public sealed class Track : IMediaAudioResource
|
|
|
|
|
{
|
|
|
|
|
private byte[] FileData = null;
|
|
|
|
|
|
|
|
|
|
public IMediaCoverResource Cover { get; }
|
|
|
|
|
public string Id { get; set; }
|
|
|
|
|
public DateTime InfoDate { get; }
|
|
|
|
|
public long? InfoSize { get; }
|
|
|
|
|
public DlnaMediaTypes MediaType { get; }
|
|
|
|
|
|
|
|
|
|
public string MetaAlbum { get; }
|
|
|
|
|
public string MetaArtist { get; }
|
|
|
|
|
public string MetaDescription { get; }
|
|
|
|
|
public TimeSpan? MetaDuration { get; }
|
|
|
|
|
public string MetaGenre { get; }
|
|
|
|
|
public string MetaPerformer { get; }
|
|
|
|
|
public int? MetaReleaseYear { get; }
|
|
|
|
|
public int? MetaTrack { get; }
|
|
|
|
|
public string Path { get; }
|
|
|
|
|
public string PN { get; }
|
|
|
|
|
|
|
|
|
|
public IHeaders Properties
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
var rv = new RawHeaders { { "Title", Title }, { "MediaType", MediaType.ToString() }, { "Type", Type.ToString() } };
|
|
|
|
|
if (InfoSize.HasValue)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("SizeRaw", InfoSize.ToString());
|
|
|
|
|
rv.Add("Size", InfoSize.Value.FormatFileSize());
|
|
|
|
|
}
|
|
|
|
|
rv.Add("Date", InfoDate.ToString(CultureInfo.InvariantCulture));
|
|
|
|
|
rv.Add("DateO", InfoDate.ToString("o"));
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (Cover != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("HasCover", "true");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
2019-11-28 17:38:26 +00:00
|
|
|
|
Trace.WriteLine($"Failed to access CachedCover Ex [{ ex }]", "Warning");
|
2019-09-05 02:04:20 +00:00
|
|
|
|
}
|
|
|
|
|
if (MetaAlbum != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Album", MetaAlbum);
|
|
|
|
|
}
|
|
|
|
|
if (MetaArtist != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Artist", MetaArtist);
|
|
|
|
|
}
|
|
|
|
|
if (MetaDescription != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Description", MetaDescription);
|
|
|
|
|
}
|
|
|
|
|
if (MetaDuration != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Duration", MetaDuration.Value.ToString("g"));
|
|
|
|
|
}
|
|
|
|
|
if (MetaGenre != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Genre", MetaGenre);
|
|
|
|
|
}
|
|
|
|
|
if (MetaPerformer != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Performer", MetaPerformer);
|
|
|
|
|
}
|
|
|
|
|
if (MetaTrack != null)
|
|
|
|
|
{
|
|
|
|
|
rv.Add("Track", MetaTrack.Value.ToString());
|
|
|
|
|
}
|
|
|
|
|
return rv;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Title { get; }
|
|
|
|
|
public DlnaMime Type { get; }
|
|
|
|
|
|
|
|
|
|
public Track(string id, string artistName, string releaseTitle, short mediaNumber,
|
|
|
|
|
string title, string genre, string trackArtistName,
|
|
|
|
|
int trackNumber, int? releaseYear, TimeSpan duration,
|
|
|
|
|
string description, DateTime infoDate, byte[] coverData, byte[] fileData = null)
|
|
|
|
|
{
|
|
|
|
|
Id = id;
|
|
|
|
|
Title = $"[{ trackNumber.ToString().PadLeft(3, '0') }] { title }";
|
|
|
|
|
MetaArtist = artistName;
|
|
|
|
|
MetaAlbum = releaseTitle;
|
|
|
|
|
if (mediaNumber > 1)
|
|
|
|
|
{
|
|
|
|
|
MetaAlbum = $"{ mediaNumber.ToString().PadLeft(2, '0') } { releaseTitle}";
|
|
|
|
|
}
|
|
|
|
|
MetaDescription = description;
|
|
|
|
|
MetaDuration = duration;
|
|
|
|
|
MetaGenre = genre;
|
|
|
|
|
MetaPerformer = trackArtistName;
|
|
|
|
|
MetaReleaseYear = releaseYear;
|
|
|
|
|
MetaTrack = trackNumber;
|
|
|
|
|
InfoDate = infoDate;
|
|
|
|
|
if (fileData != null)
|
|
|
|
|
{
|
|
|
|
|
FileData = fileData;
|
|
|
|
|
InfoSize = fileData.Length;
|
|
|
|
|
}
|
|
|
|
|
MediaType = DlnaMediaTypes.Audio;
|
|
|
|
|
Type = DlnaMime.AudioMP3;
|
|
|
|
|
if (coverData != null)
|
|
|
|
|
{
|
|
|
|
|
Cover = new CoverArt(coverData, 320, 320);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int CompareTo(IMediaItem other) => throw new NotImplementedException();
|
|
|
|
|
|
|
|
|
|
public Stream CreateContentStream() => new MemoryStream(FileData);
|
|
|
|
|
|
|
|
|
|
public bool Equals(IMediaItem other) => throw new NotImplementedException();
|
|
|
|
|
|
|
|
|
|
public string ToComparableTitle() => throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
}
|