/*
* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Native = Interop.MediaControllerPlaylist;
namespace Tizen.Multimedia.Remoting
{
///
/// Represents metadata for media control.
///
/// 4
public class MediaControlMetadata
{
///
/// Initializes a new instance of the class.
///
/// 4
public MediaControlMetadata()
{
}
internal MediaControlMetadata(IntPtr handle)
{
// If native framework return null handle,
// it means server doesn't set metadata yet and it's not error.
// So we need to return empty metadata instance as native framework does.
if (handle == IntPtr.Zero)
{
return;
}
Title = Native.GetMetadata(handle, MediaControllerNativeAttribute.Title);
Artist = Native.GetMetadata(handle, MediaControllerNativeAttribute.Artist);
Album = Native.GetMetadata(handle, MediaControllerNativeAttribute.Album);
Author = Native.GetMetadata(handle, MediaControllerNativeAttribute.Author);
Genre = Native.GetMetadata(handle, MediaControllerNativeAttribute.Genre);
Duration = Native.GetMetadata(handle, MediaControllerNativeAttribute.Duration);
Date = Native.GetMetadata(handle, MediaControllerNativeAttribute.Date);
Copyright = Native.GetMetadata(handle, MediaControllerNativeAttribute.Copyright);
Description = Native.GetMetadata(handle, MediaControllerNativeAttribute.Description);
TrackNumber = Native.GetMetadata(handle, MediaControllerNativeAttribute.TrackNumber);
AlbumArtPath = Native.GetMetadata(handle, MediaControllerNativeAttribute.Picture);
EncodedSeason = Native.GetMetadata(handle, MediaControllerNativeAttribute.Season);
EncodedEpisode = Native.GetMetadata(handle, MediaControllerNativeAttribute.Episode);
EncodedResolution = Native.GetMetadata(handle, MediaControllerNativeAttribute.Resolution);
}
///
/// Gets or sets the title.
///
/// 4
public string Title { get; set; }
///
/// Gets or sets the artist.
///
/// 4
public string Artist { get; set; }
///
/// Gets or sets the album.
///
/// 4
public string Album { get; set; }
///
/// Gets or sets the author.
///
/// 4
public string Author { get; set; }
///
/// Gets or sets the genre.
///
/// 4
public string Genre { get; set; }
///
/// Gets or sets the duration.
///
/// 4
public string Duration { get; set; }
///
/// Gets or sets the date.
///
/// 4
public string Date { get; set; }
///
/// Gets or sets the copyright.
///
/// 4
public string Copyright { get; set; }
///
/// Gets or sets the description.
///
/// 4
public string Description { get; set; }
///
/// Gets or sets the track number.
///
/// 4
public string TrackNumber { get; set; }
///
/// Gets or sets the path of the album art.
///
/// 4
public string AlbumArtPath { get; set; }
///
/// Gets or sets the season information.
///
///
/// 6
public SeriesInformation Season
{
get => DecodeSeason(EncodedSeason);
set => EncodedSeason = EncodeSeason(value);
}
///
/// Gets or sets the episode information.
///
///
/// 6
public SeriesInformation Episode
{
get => DecodeEpisode(EncodedEpisode);
set => EncodedEpisode = EncodeEpisode(value);
}
///
/// Gets or sets the content resolution.
///
///
/// 6
public Size Resolution
{
get => DecodeResolution(EncodedResolution);
set => EncodedResolution = EncodeResolution(value.Width, value.Height);
}
// Developers who use Tizen Native API must encode strings to set or get metadata of media
// such as season, episode, and resolution. It is inconvenient.
// TizenFX supports for using normal strings and using encoded strings internally.
internal string EncodedSeason { get; private set; }
internal string EncodedEpisode { get; private set; }
internal string EncodedResolution { get; private set; }
private static string EncodeSeason(SeriesInformation information)
{
Native.EncodeSeason(information.Number, information.Title, out string encodedSeason).
ThrowIfError("Failed to encode season");
return encodedSeason;
}
private static string EncodeEpisode(SeriesInformation information)
{
Native.EncodeEpisode(information.Number, information.Title, out string encodedEpisode).
ThrowIfError("Failed to encode episode");
return encodedEpisode;
}
private static string EncodeResolution(int width, int height)
{
Native.EncodeResolution((uint)width, (uint)height, out string encodedResolution).
ThrowIfError("Failed to encode resolution");
return encodedResolution;
}
private static SeriesInformation DecodeSeason(string encodedSeason)
{
int number = 0;
string title = null;
if (encodedSeason != null)
{
Native.DecodeSeason(encodedSeason, out number, out title).
ThrowIfError("Failed to decode season");
}
return new SeriesInformation(number, title);
}
private static SeriesInformation DecodeEpisode(string encodedEpisode)
{
int number = 0;
string title = null;
if (encodedEpisode != null)
{
Native.DecodeEpisode(encodedEpisode, out number, out title).
ThrowIfError("Failed to decode episode");
}
return new SeriesInformation(number, title);
}
private static Size DecodeResolution(string encodedResolution)
{
uint width = 0, height = 0;
if (encodedResolution != null)
{
Native.DecodeResolution(encodedResolution, out width, out height).
ThrowIfError("Failed to decode resolution");
}
return new Size((int)width, (int)height);
}
}
///
/// Represents properties for the video series information.
///
/// 6
public class SeriesInformation
{
///
/// Initializes a new instance of the class.
///
/// The order of this video in entire series.
/// The title.
/// 6
public SeriesInformation(int number, string title)
{
Number = number;
Title = title;
}
///
/// Gets or sets the order of this video in entire series.
///
/// 6
public int Number { get; }
///
/// Gets or sets the title.
///
/// 6
public string Title { get; }
///
/// Returns a string that represents the current object.
///
/// A string that represents the current object.
/// 6
public override string ToString() => $"Number={Number.ToString()}, Title={Title}";
}
}