HtmlMediaElement<TResource>
abstract class HtmlMediaElement<TResource> : HtmlElement, IHtmlMediaElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IMediaController, ILoadableElement where TResource : IMediaInfo
Represents the abstract base for HTML media (audio / video) elements.
using AngleSharp.Dom.Css;
using AngleSharp.Dom.Media;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Network;
using AngleSharp.Network.RequestProcessors;
using AngleSharp.Services;
using AngleSharp.Services.Media;
using System;
namespace AngleSharp.Dom.Html
{
internal abstract class HtmlMediaElement<TResource> : HtmlElement, IHtmlMediaElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IMediaController, ILoadableElement where TResource : IMediaInfo
{
private readonly MediaRequestProcessor<TResource> _request;
private ITextTrackList _texts;
public IDownload CurrentDownload {
get {
if (_request == null)
return null;
return _request.Download;
}
}
public string Source {
get {
return this.GetUrlAttribute(AttributeNames.Src);
}
set {
this.SetOwnAttribute(AttributeNames.Src, value);
}
}
public string CrossOrigin {
get {
return this.GetOwnAttribute(AttributeNames.CrossOrigin);
}
set {
this.SetOwnAttribute(AttributeNames.CrossOrigin, value);
}
}
public string Preload {
get {
return this.GetOwnAttribute(AttributeNames.Preload);
}
set {
this.SetOwnAttribute(AttributeNames.Preload, value);
}
}
public MediaNetworkState NetworkState {
get {
if (_request == null)
return MediaNetworkState.Empty;
return _request.NetworkState;
}
}
public TResource Media {
get {
if (_request == null)
return default(TResource);
return _request.Resource;
}
}
public MediaReadyState ReadyState => Controller?.ReadyState ?? MediaReadyState.Nothing;
public bool IsSeeking { get; set; }
public string CurrentSource => Source;
public double Duration => Controller?.Duration ?? 0;
public double CurrentTime {
get {
return Controller?.CurrentTime ?? 0;
}
set {
IMediaController controller = Controller;
if (controller != null)
controller.CurrentTime = value;
}
}
public bool IsAutoplay {
get {
return this.HasOwnAttribute(AttributeNames.Autoplay);
}
set {
this.SetOwnAttribute(AttributeNames.Autoplay, value ? string.Empty : null);
}
}
public bool IsLoop {
get {
return this.HasOwnAttribute(AttributeNames.Loop);
}
set {
this.SetOwnAttribute(AttributeNames.Loop, value ? string.Empty : null);
}
}
public bool IsShowingControls {
get {
return this.HasOwnAttribute(AttributeNames.Controls);
}
set {
this.SetOwnAttribute(AttributeNames.Controls, value ? string.Empty : null);
}
}
public bool IsDefaultMuted {
get {
return this.HasOwnAttribute(AttributeNames.Muted);
}
set {
this.SetOwnAttribute(AttributeNames.Muted, value ? string.Empty : null);
}
}
public bool IsPaused {
get {
if (PlaybackState == MediaControllerPlaybackState.Waiting)
return (int)ReadyState >= 2;
return false;
}
}
public bool IsEnded => PlaybackState == MediaControllerPlaybackState.Ended;
public DateTime StartDate => DateTime.Today;
public ITimeRanges BufferedTime => Controller?.BufferedTime;
public ITimeRanges SeekableTime => Controller?.SeekableTime;
public ITimeRanges PlayedTime => Controller?.PlayedTime;
public string MediaGroup {
get {
return this.GetOwnAttribute(AttributeNames.MediaGroup);
}
set {
this.SetOwnAttribute(AttributeNames.MediaGroup, value);
}
}
public double Volume {
get {
return Controller?.Volume ?? 1;
}
set {
IMediaController controller = Controller;
if (controller != null)
controller.Volume = value;
}
}
public bool IsMuted {
get {
return Controller?.IsMuted ?? false;
}
set {
IMediaController controller = Controller;
if (controller != null)
controller.IsMuted = value;
}
}
public IMediaController Controller {
get {
if (_request == null || _request.Resource == null)
return null;
return _request.Resource.Controller;
}
}
public double DefaultPlaybackRate {
get {
return Controller?.DefaultPlaybackRate ?? 1;
}
set {
IMediaController controller = Controller;
if (controller != null)
controller.DefaultPlaybackRate = value;
}
}
public double PlaybackRate {
get {
return Controller?.PlaybackRate ?? 1;
}
set {
IMediaController controller = Controller;
if (controller != null)
controller.PlaybackRate = value;
}
}
public MediaControllerPlaybackState PlaybackState => Controller?.PlaybackState ?? MediaControllerPlaybackState.Waiting;
public IMediaError Error { get; set; }
public virtual IAudioTrackList AudioTracks => null;
public virtual IVideoTrackList VideoTracks => null;
public ITextTrackList TextTracks {
get {
return _texts;
}
protected set {
_texts = value;
}
}
public event DomEventHandler Emptied {
add {
AddEventListener(EventNames.Emptied, value, false);
}
remove {
RemoveEventListener(EventNames.Emptied, value, false);
}
}
public event DomEventHandler LoadedMetadata {
add {
AddEventListener(EventNames.LoadedMetaData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedMetaData, value, false);
}
}
public event DomEventHandler LoadedData {
add {
AddEventListener(EventNames.LoadedData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedData, value, false);
}
}
public event DomEventHandler CanPlay {
add {
AddEventListener(EventNames.CanPlay, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlay, value, false);
}
}
public event DomEventHandler CanPlayThrough {
add {
AddEventListener(EventNames.CanPlayThrough, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlayThrough, value, false);
}
}
public event DomEventHandler Ended {
add {
AddEventListener(EventNames.Ended, value, false);
}
remove {
RemoveEventListener(EventNames.Ended, value, false);
}
}
public event DomEventHandler Waiting {
add {
AddEventListener(EventNames.Waiting, value, false);
}
remove {
RemoveEventListener(EventNames.Waiting, value, false);
}
}
public event DomEventHandler DurationChanged {
add {
AddEventListener(EventNames.DurationChange, value, false);
}
remove {
RemoveEventListener(EventNames.DurationChange, value, false);
}
}
public event DomEventHandler TimeUpdated {
add {
AddEventListener(EventNames.TimeUpdate, value, false);
}
remove {
RemoveEventListener(EventNames.TimeUpdate, value, false);
}
}
public event DomEventHandler Paused {
add {
AddEventListener(EventNames.Pause, value, false);
}
remove {
RemoveEventListener(EventNames.Pause, value, false);
}
}
public event DomEventHandler Played {
add {
AddEventListener(EventNames.Play, value, false);
}
remove {
RemoveEventListener(EventNames.Play, value, false);
}
}
public event DomEventHandler Playing {
add {
AddEventListener(EventNames.Playing, value, false);
}
remove {
RemoveEventListener(EventNames.Playing, value, false);
}
}
public event DomEventHandler RateChanged {
add {
AddEventListener(EventNames.RateChange, value, false);
}
remove {
RemoveEventListener(EventNames.RateChange, value, false);
}
}
public event DomEventHandler VolumeChanged {
add {
AddEventListener(EventNames.VolumeChange, value, false);
}
remove {
RemoveEventListener(EventNames.VolumeChange, value, false);
}
}
public HtmlMediaElement(Document owner, string name, string prefix)
: base(owner, name, prefix, NodeFlags.None)
{
_request = MediaRequestProcessor<TResource>.Create(this);
}
public void Load()
{
string currentSource = CurrentSource;
UpdateSource(currentSource);
}
public void Play()
{
Controller?.Play();
}
public void Pause()
{
Controller?.Pause();
}
public string CanPlayType(string type)
{
IResourceService<TResource> resourceService = AngleSharp.Extensions.ConfigurationExtensions.GetResourceService<TResource>(base.Owner.Options, type);
if (resourceService == null)
return string.Empty;
return "maybe";
}
public ITextTrack AddTextTrack(string kind, string label = null, string language = null)
{
return null;
}
internal override void SetupElement()
{
base.SetupElement();
string ownAttribute = this.GetOwnAttribute(AttributeNames.Src);
RegisterAttributeObserver(AttributeNames.Src, UpdateSource);
if (ownAttribute != null)
UpdateSource(ownAttribute);
}
private void UpdateSource(string value)
{
Url url = new Url(value);
this.Process(_request, url);
}
}
}