// Do not edit. This file is generated.
// MoonBit type: HTMLMediaElement
// Specifications: html.idl

///|
/// [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
#external
pub type HTMLMediaElement

///|
pub impl TJsValue for HTMLMediaElement with to_js(self : HTMLMediaElement) -> JsValue = "%identity"

///|
pub impl FromJsAny for HTMLMediaElement with from_js_any(value : JsAny) -> HTMLMediaElement = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// Prefer `try_into()` for checked downcasts.
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : THTMLMediaElement] HTMLMediaElement::into(
  self : HTMLMediaElement,
) -> T = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// WARNING: If the underlying JS value is not of type T, this will silently
/// produce a value with incorrect type, leading to undefined behavior.
pub fn[T : THTMLMediaElement] HTMLMediaElement::unsafe_into(
  self : HTMLMediaElement,
) -> T = "%identity"

///|
pub impl HasConstructor for HTMLMediaElement with constructor_name() {
  "HTMLMediaElement"
}

///|
/// Checked downcast — returns None if the JS value is not an instance of T.
pub fn[T : THTMLMediaElement + HasConstructor] HTMLMediaElement::try_into(
  self : HTMLMediaElement,
) -> T? {
  if js_instanceof(TJsValue::to_js(self), T::constructor_name()) {
    Some(self.unsafe_into())
  } else {
    None
  }
}

///|
pub impl THTMLMediaElement for HTMLMediaElement

///|
pub impl THTMLElement for HTMLMediaElement

///|
pub impl TElement for HTMLMediaElement

///|
pub impl TNode for HTMLMediaElement

///|
pub impl TEventTarget for HTMLMediaElement

///|
pub const HTML_MEDIA_ELEMENT_NETWORK_EMPTY : UInt = 0

///|
pub const HTML_MEDIA_ELEMENT_NETWORK_IDLE : UInt = 1

///|
pub const HTML_MEDIA_ELEMENT_NETWORK_LOADING : UInt = 2

///|
pub const HTML_MEDIA_ELEMENT_NETWORK_NO_SOURCE : UInt = 3

///|
pub const HTML_MEDIA_ELEMENT_HAVE_NOTHING : UInt = 0

///|
pub const HTML_MEDIA_ELEMENT_HAVE_METADATA : UInt = 1

///|
pub const HTML_MEDIA_ELEMENT_HAVE_CURRENT_DATA : UInt = 2

///|
pub const HTML_MEDIA_ELEMENT_HAVE_FUTURE_DATA : UInt = 3

///|
pub const HTML_MEDIA_ELEMENT_HAVE_ENOUGH_DATA : UInt = 4

///|
/// [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement) interface.
pub trait THTMLMediaElement: THTMLElement {
  error(self : Self) -> MediaError = _
  src(self : Self) -> String = _
  set_src(self : Self, src : String) -> Unit = _
  src_object(self : Self) -> MediaProvider = _
  set_src_object(self : Self, src_object : &TMediaProvider) -> Unit = _
  current_src(self : Self) -> String = _
  cross_origin(self : Self) -> String = _
  set_cross_origin(self : Self, cross_origin : String) -> Unit = _
  network_state(self : Self) -> UInt = _
  preload(self : Self) -> String = _
  set_preload(self : Self, preload : String) -> Unit = _
  buffered(self : Self) -> TimeRanges = _
  load(self : Self) -> Unit = _
  can_play_type(self : Self, type_ : String) -> CanPlayTypeResult = _
  ready_state(self : Self) -> UInt = _
  seeking(self : Self) -> Bool = _
  current_time(self : Self) -> Double = _
  set_current_time(self : Self, current_time : Double) -> Unit = _
  fast_seek(self : Self, time : Double) -> Unit = _
  duration(self : Self) -> Double = _
  get_start_date(self : Self) -> JsValue = _
  paused(self : Self) -> Bool = _
  default_playback_rate(self : Self) -> Double = _
  set_default_playback_rate(self : Self, default_playback_rate : Double) -> Unit = _
  playback_rate(self : Self) -> Double = _
  set_playback_rate(self : Self, playback_rate : Double) -> Unit = _
  preserves_pitch(self : Self) -> Bool = _
  set_preserves_pitch(self : Self, preserves_pitch : Bool) -> Unit = _
  played(self : Self) -> TimeRanges = _
  seekable(self : Self) -> TimeRanges = _
  ended(self : Self) -> Bool = _
  autoplay(self : Self) -> Bool = _
  set_autoplay(self : Self, autoplay : Bool) -> Unit = _
  loop_(self : Self) -> Bool = _
  set_loop_(self : Self, loop_ : Bool) -> Unit = _
  play(self : Self) -> JsPromise[JsValue] = _
  pause(self : Self) -> Unit = _
  controls(self : Self) -> Bool = _
  set_controls(self : Self, controls : Bool) -> Unit = _
  volume(self : Self) -> Double = _
  set_volume(self : Self, volume : Double) -> Unit = _
  muted(self : Self) -> Bool = _
  set_muted(self : Self, muted : Bool) -> Unit = _
  default_muted(self : Self) -> Bool = _
  set_default_muted(self : Self, default_muted : Bool) -> Unit = _
  audio_tracks(self : Self) -> AudioTrackList = _
  video_tracks(self : Self) -> VideoTrackList = _
  text_tracks(self : Self) -> TextTrackList = _
  add_text_track(
    self : Self,
    kind : TextTrackKind,
    label? : String,
    language? : String,
  ) -> TextTrack = _
}

///|
/// [HTMLMediaElement.error](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error)
impl THTMLMediaElement with error(self : Self) -> MediaError {
  html_media_element_error_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src)
impl THTMLMediaElement with src(self : Self) -> String {
  html_media_element_src_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src)
impl THTMLMediaElement with set_src(self : Self, src : String) -> Unit {
  html_media_element_set_src_ffi(TJsValue::to_js(self), TJsValue::to_js(src))
}

///|
/// [HTMLMediaElement.srcObject](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject)
impl THTMLMediaElement with src_object(self : Self) -> MediaProvider {
  html_media_element_src_object_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.srcObject](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject)
impl THTMLMediaElement with set_src_object(
  self : Self,
  src_object : &TMediaProvider,
) -> Unit {
  html_media_element_set_src_object_ffi(
    TJsValue::to_js(self),
    src_object.to_js(),
  )
}

///|
/// [HTMLMediaElement.currentSrc](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentSrc)
impl THTMLMediaElement with current_src(self : Self) -> String {
  html_media_element_current_src_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.crossOrigin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/crossOrigin)
impl THTMLMediaElement with cross_origin(self : Self) -> String {
  html_media_element_cross_origin_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.crossOrigin](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/crossOrigin)
impl THTMLMediaElement with set_cross_origin(self : Self, cross_origin : String) -> Unit {
  html_media_element_set_cross_origin_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(cross_origin),
  )
}

///|
/// [HTMLMediaElement.networkState](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/networkState)
impl THTMLMediaElement with network_state(self : Self) -> UInt {
  html_media_element_network_state_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.preload](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/preload)
impl THTMLMediaElement with preload(self : Self) -> String {
  html_media_element_preload_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.preload](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/preload)
impl THTMLMediaElement with set_preload(self : Self, preload : String) -> Unit {
  html_media_element_set_preload_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(preload),
  )
}

///|
/// [HTMLMediaElement.buffered](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered)
impl THTMLMediaElement with buffered(self : Self) -> TimeRanges {
  html_media_element_buffered_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.load](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load)
impl THTMLMediaElement with load(self : Self) -> Unit {
  html_media_element_load_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.canPlayType](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType)
impl THTMLMediaElement with can_play_type(self : Self, type_ : String) -> CanPlayTypeResult {
  html_media_element_can_play_type_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(type_),
  )
}

///|
/// [HTMLMediaElement.readyState](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState)
impl THTMLMediaElement with ready_state(self : Self) -> UInt {
  html_media_element_ready_state_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.seeking](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeking)
impl THTMLMediaElement with seeking(self : Self) -> Bool {
  html_media_element_seeking_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.currentTime](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentTime)
impl THTMLMediaElement with current_time(self : Self) -> Double {
  html_media_element_current_time_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.currentTime](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentTime)
impl THTMLMediaElement with set_current_time(self : Self, current_time : Double) -> Unit {
  html_media_element_set_current_time_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(current_time),
  )
}

///|
/// [HTMLMediaElement.fastSeek](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/fastSeek)
impl THTMLMediaElement with fast_seek(self : Self, time : Double) -> Unit {
  html_media_element_fast_seek_ffi(TJsValue::to_js(self), TJsValue::to_js(time))
}

///|
/// [HTMLMediaElement.duration](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/duration)
impl THTMLMediaElement with duration(self : Self) -> Double {
  html_media_element_duration_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.getStartDate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/getStartDate)
impl THTMLMediaElement with get_start_date(self : Self) -> JsValue {
  html_media_element_get_start_date_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.paused](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/paused)
impl THTMLMediaElement with paused(self : Self) -> Bool {
  html_media_element_paused_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.defaultPlaybackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/defaultPlaybackRate)
impl THTMLMediaElement with default_playback_rate(self : Self) -> Double {
  html_media_element_default_playback_rate_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.defaultPlaybackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/defaultPlaybackRate)
impl THTMLMediaElement with set_default_playback_rate(
  self : Self,
  default_playback_rate : Double,
) -> Unit {
  html_media_element_set_default_playback_rate_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(default_playback_rate),
  )
}

///|
/// [HTMLMediaElement.playbackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate)
impl THTMLMediaElement with playback_rate(self : Self) -> Double {
  html_media_element_playback_rate_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.playbackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate)
impl THTMLMediaElement with set_playback_rate(
  self : Self,
  playback_rate : Double,
) -> Unit {
  html_media_element_set_playback_rate_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(playback_rate),
  )
}

///|
/// [HTMLMediaElement.preservesPitch](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/preservesPitch)
impl THTMLMediaElement with preserves_pitch(self : Self) -> Bool {
  html_media_element_preserves_pitch_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.preservesPitch](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/preservesPitch)
impl THTMLMediaElement with set_preserves_pitch(
  self : Self,
  preserves_pitch : Bool,
) -> Unit {
  html_media_element_set_preserves_pitch_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(preserves_pitch),
  )
}

///|
/// [HTMLMediaElement.played](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/played)
impl THTMLMediaElement with played(self : Self) -> TimeRanges {
  html_media_element_played_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.seekable](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekable)
impl THTMLMediaElement with seekable(self : Self) -> TimeRanges {
  html_media_element_seekable_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.ended](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ended)
impl THTMLMediaElement with ended(self : Self) -> Bool {
  html_media_element_ended_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.autoplay](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/autoplay)
impl THTMLMediaElement with autoplay(self : Self) -> Bool {
  html_media_element_autoplay_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.autoplay](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/autoplay)
impl THTMLMediaElement with set_autoplay(self : Self, autoplay : Bool) -> Unit {
  html_media_element_set_autoplay_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(autoplay),
  )
}

///|
/// [HTMLMediaElement.loop](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loop)
impl THTMLMediaElement with loop_(self : Self) -> Bool {
  html_media_element_loop_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.loop](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loop)
impl THTMLMediaElement with set_loop_(self : Self, loop_ : Bool) -> Unit {
  html_media_element_set_loop_ffi(TJsValue::to_js(self), TJsValue::to_js(loop_))
}

///|
/// [HTMLMediaElement.play](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play)
impl THTMLMediaElement with play(self : Self) -> JsPromise[JsValue] {
  html_media_element_play_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.pause](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause)
impl THTMLMediaElement with pause(self : Self) -> Unit {
  html_media_element_pause_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.controls](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/controls)
impl THTMLMediaElement with controls(self : Self) -> Bool {
  html_media_element_controls_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.controls](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/controls)
impl THTMLMediaElement with set_controls(self : Self, controls : Bool) -> Unit {
  html_media_element_set_controls_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(controls),
  )
}

///|
/// [HTMLMediaElement.volume](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volume)
impl THTMLMediaElement with volume(self : Self) -> Double {
  html_media_element_volume_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.volume](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volume)
impl THTMLMediaElement with set_volume(self : Self, volume : Double) -> Unit {
  html_media_element_set_volume_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(volume),
  )
}

///|
/// [HTMLMediaElement.muted](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/muted)
impl THTMLMediaElement with muted(self : Self) -> Bool {
  html_media_element_muted_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.muted](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/muted)
impl THTMLMediaElement with set_muted(self : Self, muted : Bool) -> Unit {
  html_media_element_set_muted_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(muted),
  )
}

///|
/// [HTMLMediaElement.defaultMuted](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/defaultMuted)
impl THTMLMediaElement with default_muted(self : Self) -> Bool {
  html_media_element_default_muted_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.defaultMuted](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/defaultMuted)
impl THTMLMediaElement with set_default_muted(self : Self, default_muted : Bool) -> Unit {
  html_media_element_set_default_muted_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(default_muted),
  )
}

///|
/// [HTMLMediaElement.audioTracks](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/audioTracks)
impl THTMLMediaElement with audio_tracks(self : Self) -> AudioTrackList {
  html_media_element_audio_tracks_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.videoTracks](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/videoTracks)
impl THTMLMediaElement with video_tracks(self : Self) -> VideoTrackList {
  html_media_element_video_tracks_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.textTracks](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/textTracks)
impl THTMLMediaElement with text_tracks(self : Self) -> TextTrackList {
  html_media_element_text_tracks_ffi(TJsValue::to_js(self))
}

///|
/// [HTMLMediaElement.addTextTrack](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/addTextTrack)
impl THTMLMediaElement with add_text_track(
  self : Self,
  kind : TextTrackKind,
  label? : String,
  language? : String,
) -> TextTrack {
  html_media_element_add_text_track_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(kind),
    opt_to_js(label),
    opt_to_js(language),
  )
}

///|
#cfg(target="js")
extern "js" fn html_media_element_error_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.error"

///|
#cfg(target="js")
fn html_media_element_error_ffi(obj : JsValue) -> MediaError {
  html_media_element_error_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_src_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.src"

///|
#cfg(target="js")
fn html_media_element_src_ffi(obj : JsValue) -> String {
  html_media_element_src_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_src_ffi(
  obj : JsValue,
  src : JsValue,
) -> Unit = "(obj, src) => { obj.src = src; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_src_object_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.srcObject"

///|
#cfg(target="js")
fn html_media_element_src_object_ffi(obj : JsValue) -> MediaProvider {
  html_media_element_src_object_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_src_object_ffi(
  obj : JsValue,
  src_object : JsValue,
) -> Unit = "(obj, srcObject) => { obj.srcObject = srcObject; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_current_src_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.currentSrc"

///|
#cfg(target="js")
fn html_media_element_current_src_ffi(obj : JsValue) -> String {
  html_media_element_current_src_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_cross_origin_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.crossOrigin"

///|
#cfg(target="js")
fn html_media_element_cross_origin_ffi(obj : JsValue) -> String {
  html_media_element_cross_origin_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_cross_origin_ffi(
  obj : JsValue,
  cross_origin : JsValue,
) -> Unit = "(obj, crossOrigin) => { obj.crossOrigin = crossOrigin; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_network_state_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.networkState"

///|
#cfg(target="js")
fn html_media_element_network_state_ffi(obj : JsValue) -> UInt {
  html_media_element_network_state_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_preload_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.preload"

///|
#cfg(target="js")
fn html_media_element_preload_ffi(obj : JsValue) -> String {
  html_media_element_preload_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_preload_ffi(
  obj : JsValue,
  preload : JsValue,
) -> Unit = "(obj, preload) => { obj.preload = preload; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_buffered_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.buffered"

///|
#cfg(target="js")
fn html_media_element_buffered_ffi(obj : JsValue) -> TimeRanges {
  html_media_element_buffered_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_load_ffi(obj : JsValue) -> Unit = "(obj) => obj.load()"

///|
#cfg(target="js")
extern "js" fn html_media_element_can_play_type_ffi_js(
  obj : JsValue,
  type_ : JsValue,
) -> JsValue = "(obj, type_) => obj.canPlayType(type_)"

///|
#cfg(target="js")
fn html_media_element_can_play_type_ffi(
  obj : JsValue,
  type_ : JsValue,
) -> CanPlayTypeResult {
  CanPlayTypeResult::from_unchecked(
    html_media_element_can_play_type_ffi_js(obj, type_).unsafe_cast(),
  )
}

///|
#cfg(target="js")
extern "js" fn html_media_element_ready_state_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.readyState"

///|
#cfg(target="js")
fn html_media_element_ready_state_ffi(obj : JsValue) -> UInt {
  html_media_element_ready_state_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_seeking_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.seeking"

///|
#cfg(target="js")
fn html_media_element_seeking_ffi(obj : JsValue) -> Bool {
  html_media_element_seeking_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_current_time_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.currentTime"

///|
#cfg(target="js")
fn html_media_element_current_time_ffi(obj : JsValue) -> Double {
  html_media_element_current_time_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_current_time_ffi(
  obj : JsValue,
  current_time : JsValue,
) -> Unit = "(obj, currentTime) => { obj.currentTime = currentTime; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_fast_seek_ffi(
  obj : JsValue,
  time : JsValue,
) -> Unit = "(obj, time) => obj.fastSeek(time)"

///|
#cfg(target="js")
extern "js" fn html_media_element_duration_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.duration"

///|
#cfg(target="js")
fn html_media_element_duration_ffi(obj : JsValue) -> Double {
  html_media_element_duration_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_get_start_date_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.getStartDate()"

///|
#cfg(target="js")
fn html_media_element_get_start_date_ffi(obj : JsValue) -> JsValue {
  html_media_element_get_start_date_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_paused_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.paused"

///|
#cfg(target="js")
fn html_media_element_paused_ffi(obj : JsValue) -> Bool {
  html_media_element_paused_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_default_playback_rate_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.defaultPlaybackRate"

///|
#cfg(target="js")
fn html_media_element_default_playback_rate_ffi(obj : JsValue) -> Double {
  html_media_element_default_playback_rate_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_default_playback_rate_ffi(
  obj : JsValue,
  default_playback_rate : JsValue,
) -> Unit = "(obj, defaultPlaybackRate) => { obj.defaultPlaybackRate = defaultPlaybackRate; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_playback_rate_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.playbackRate"

///|
#cfg(target="js")
fn html_media_element_playback_rate_ffi(obj : JsValue) -> Double {
  html_media_element_playback_rate_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_playback_rate_ffi(
  obj : JsValue,
  playback_rate : JsValue,
) -> Unit = "(obj, playbackRate) => { obj.playbackRate = playbackRate; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_preserves_pitch_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.preservesPitch"

///|
#cfg(target="js")
fn html_media_element_preserves_pitch_ffi(obj : JsValue) -> Bool {
  html_media_element_preserves_pitch_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_preserves_pitch_ffi(
  obj : JsValue,
  preserves_pitch : JsValue,
) -> Unit = "(obj, preservesPitch) => { obj.preservesPitch = preservesPitch; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_played_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.played"

///|
#cfg(target="js")
fn html_media_element_played_ffi(obj : JsValue) -> TimeRanges {
  html_media_element_played_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_seekable_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.seekable"

///|
#cfg(target="js")
fn html_media_element_seekable_ffi(obj : JsValue) -> TimeRanges {
  html_media_element_seekable_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_ended_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.ended"

///|
#cfg(target="js")
fn html_media_element_ended_ffi(obj : JsValue) -> Bool {
  html_media_element_ended_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_autoplay_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.autoplay"

///|
#cfg(target="js")
fn html_media_element_autoplay_ffi(obj : JsValue) -> Bool {
  html_media_element_autoplay_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_autoplay_ffi(
  obj : JsValue,
  autoplay : JsValue,
) -> Unit = "(obj, autoplay) => { obj.autoplay = autoplay; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_loop_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.loop"

///|
#cfg(target="js")
fn html_media_element_loop_ffi(obj : JsValue) -> Bool {
  html_media_element_loop_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_loop_ffi(
  obj : JsValue,
  loop_ : JsValue,
) -> Unit = "(obj, loop) => { obj.loop = loop; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_play_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.play()"

///|
#cfg(target="js")
fn html_media_element_play_ffi(obj : JsValue) -> JsPromise[JsValue] {
  html_media_element_play_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_pause_ffi(obj : JsValue) -> Unit = "(obj) => obj.pause()"

///|
#cfg(target="js")
extern "js" fn html_media_element_controls_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.controls"

///|
#cfg(target="js")
fn html_media_element_controls_ffi(obj : JsValue) -> Bool {
  html_media_element_controls_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_controls_ffi(
  obj : JsValue,
  controls : JsValue,
) -> Unit = "(obj, controls) => { obj.controls = controls; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_volume_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.volume"

///|
#cfg(target="js")
fn html_media_element_volume_ffi(obj : JsValue) -> Double {
  html_media_element_volume_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_volume_ffi(
  obj : JsValue,
  volume : JsValue,
) -> Unit = "(obj, volume) => { obj.volume = volume; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_muted_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.muted"

///|
#cfg(target="js")
fn html_media_element_muted_ffi(obj : JsValue) -> Bool {
  html_media_element_muted_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_muted_ffi(
  obj : JsValue,
  muted : JsValue,
) -> Unit = "(obj, muted) => { obj.muted = muted; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_default_muted_ffi_js(
  obj : JsValue,
) -> JsValue = "(obj) => obj.defaultMuted"

///|
#cfg(target="js")
fn html_media_element_default_muted_ffi(obj : JsValue) -> Bool {
  html_media_element_default_muted_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_set_default_muted_ffi(
  obj : JsValue,
  default_muted : JsValue,
) -> Unit = "(obj, defaultMuted) => { obj.defaultMuted = defaultMuted; }"

///|
#cfg(target="js")
extern "js" fn html_media_element_audio_tracks_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.audioTracks"

///|
#cfg(target="js")
fn html_media_element_audio_tracks_ffi(obj : JsValue) -> AudioTrackList {
  html_media_element_audio_tracks_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_video_tracks_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.videoTracks"

///|
#cfg(target="js")
fn html_media_element_video_tracks_ffi(obj : JsValue) -> VideoTrackList {
  html_media_element_video_tracks_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_text_tracks_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.textTracks"

///|
#cfg(target="js")
fn html_media_element_text_tracks_ffi(obj : JsValue) -> TextTrackList {
  html_media_element_text_tracks_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn html_media_element_add_text_track_ffi_js(
  obj : JsValue,
  kind : JsValue,
  label : JsValue,
  language : JsValue,
) -> JsValue = "(obj, kind, label, language) => obj.addTextTrack(kind, label, language)"

///|
#cfg(target="js")
fn html_media_element_add_text_track_ffi(
  obj : JsValue,
  kind : JsValue,
  label : JsValue,
  language : JsValue,
) -> TextTrack {
  html_media_element_add_text_track_ffi_js(obj, kind, label, language).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn html_media_element_error_ffi(obj : JsValue) -> MediaError = "webapi_HTMLMediaElement" "get_error"

///|
#cfg(target="wasm-gc")
fn html_media_element_src_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "get_src"

///|
#cfg(target="wasm-gc")
fn html_media_element_src_ffi(obj : JsValue) -> String {
  jsvalue_to_string(html_media_element_src_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn html_media_element_set_src_ffi(obj : JsValue, src : JsValue) -> Unit = "webapi_HTMLMediaElement" "set_src"

///|
#cfg(target="wasm-gc")
fn html_media_element_src_object_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "get_srcObject"

///|
#cfg(target="wasm-gc")
fn html_media_element_src_object_ffi(obj : JsValue) -> MediaProvider {
  html_media_element_src_object_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn html_media_element_set_src_object_ffi(
  obj : JsValue,
  src_object : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_srcObject"

///|
#cfg(target="wasm-gc")
fn html_media_element_current_src_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "get_currentSrc"

///|
#cfg(target="wasm-gc")
fn html_media_element_current_src_ffi(obj : JsValue) -> String {
  jsvalue_to_string(html_media_element_current_src_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn html_media_element_cross_origin_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "get_crossOrigin"

///|
#cfg(target="wasm-gc")
fn html_media_element_cross_origin_ffi(obj : JsValue) -> String {
  jsvalue_to_string(html_media_element_cross_origin_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn html_media_element_set_cross_origin_ffi(
  obj : JsValue,
  cross_origin : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_crossOrigin"

///|
#cfg(target="wasm-gc")
fn html_media_element_network_state_ffi(obj : JsValue) -> UInt = "webapi_HTMLMediaElement" "get_networkState"

///|
#cfg(target="wasm-gc")
fn html_media_element_preload_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "get_preload"

///|
#cfg(target="wasm-gc")
fn html_media_element_preload_ffi(obj : JsValue) -> String {
  jsvalue_to_string(html_media_element_preload_ffi_wasm(obj))
}

///|
#cfg(target="wasm-gc")
fn html_media_element_set_preload_ffi(obj : JsValue, preload : JsValue) -> Unit = "webapi_HTMLMediaElement" "set_preload"

///|
#cfg(target="wasm-gc")
fn html_media_element_buffered_ffi(obj : JsValue) -> TimeRanges = "webapi_HTMLMediaElement" "get_buffered"

///|
#cfg(target="wasm-gc")
fn html_media_element_load_ffi(obj : JsValue) -> Unit = "webapi_HTMLMediaElement" "load"

///|
#cfg(target="wasm-gc")
fn html_media_element_can_play_type_ffi_wasm(
  obj : JsValue,
  type_ : JsValue,
) -> JsValue = "webapi_HTMLMediaElement" "canPlayType"

///|
#cfg(target="wasm-gc")
fn html_media_element_can_play_type_ffi(
  obj : JsValue,
  type_ : JsValue,
) -> CanPlayTypeResult {
  CanPlayTypeResult::from_unchecked(
    jsvalue_to_string(html_media_element_can_play_type_ffi_wasm(obj, type_)),
  )
}

///|
#cfg(target="wasm-gc")
fn html_media_element_ready_state_ffi(obj : JsValue) -> UInt = "webapi_HTMLMediaElement" "get_readyState"

///|
#cfg(target="wasm-gc")
fn html_media_element_seeking_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_seeking"

///|
#cfg(target="wasm-gc")
fn html_media_element_current_time_ffi(obj : JsValue) -> Double = "webapi_HTMLMediaElement" "get_currentTime"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_current_time_ffi(
  obj : JsValue,
  current_time : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_currentTime"

///|
#cfg(target="wasm-gc")
fn html_media_element_fast_seek_ffi(obj : JsValue, time : JsValue) -> Unit = "webapi_HTMLMediaElement" "fastSeek"

///|
#cfg(target="wasm-gc")
fn html_media_element_duration_ffi(obj : JsValue) -> Double = "webapi_HTMLMediaElement" "get_duration"

///|
#cfg(target="wasm-gc")
fn html_media_element_get_start_date_ffi(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "getStartDate"

///|
#cfg(target="wasm-gc")
fn html_media_element_paused_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_paused"

///|
#cfg(target="wasm-gc")
fn html_media_element_default_playback_rate_ffi(obj : JsValue) -> Double = "webapi_HTMLMediaElement" "get_defaultPlaybackRate"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_default_playback_rate_ffi(
  obj : JsValue,
  default_playback_rate : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_defaultPlaybackRate"

///|
#cfg(target="wasm-gc")
fn html_media_element_playback_rate_ffi(obj : JsValue) -> Double = "webapi_HTMLMediaElement" "get_playbackRate"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_playback_rate_ffi(
  obj : JsValue,
  playback_rate : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_playbackRate"

///|
#cfg(target="wasm-gc")
fn html_media_element_preserves_pitch_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_preservesPitch"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_preserves_pitch_ffi(
  obj : JsValue,
  preserves_pitch : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_preservesPitch"

///|
#cfg(target="wasm-gc")
fn html_media_element_played_ffi(obj : JsValue) -> TimeRanges = "webapi_HTMLMediaElement" "get_played"

///|
#cfg(target="wasm-gc")
fn html_media_element_seekable_ffi(obj : JsValue) -> TimeRanges = "webapi_HTMLMediaElement" "get_seekable"

///|
#cfg(target="wasm-gc")
fn html_media_element_ended_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_ended"

///|
#cfg(target="wasm-gc")
fn html_media_element_autoplay_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_autoplay"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_autoplay_ffi(
  obj : JsValue,
  autoplay : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_autoplay"

///|
#cfg(target="wasm-gc")
fn html_media_element_loop_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_loop"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_loop_ffi(obj : JsValue, loop_ : JsValue) -> Unit = "webapi_HTMLMediaElement" "set_loop"

///|
#cfg(target="wasm-gc")
fn html_media_element_play_ffi_wasm(obj : JsValue) -> JsValue = "webapi_HTMLMediaElement" "play"

///|
#cfg(target="wasm-gc")
fn html_media_element_play_ffi(obj : JsValue) -> JsPromise[JsValue] {
  html_media_element_play_ffi_wasm(obj).unsafe_cast()
}

///|
#cfg(target="wasm-gc")
fn html_media_element_pause_ffi(obj : JsValue) -> Unit = "webapi_HTMLMediaElement" "pause"

///|
#cfg(target="wasm-gc")
fn html_media_element_controls_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_controls"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_controls_ffi(
  obj : JsValue,
  controls : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_controls"

///|
#cfg(target="wasm-gc")
fn html_media_element_volume_ffi(obj : JsValue) -> Double = "webapi_HTMLMediaElement" "get_volume"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_volume_ffi(obj : JsValue, volume : JsValue) -> Unit = "webapi_HTMLMediaElement" "set_volume"

///|
#cfg(target="wasm-gc")
fn html_media_element_muted_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_muted"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_muted_ffi(obj : JsValue, muted : JsValue) -> Unit = "webapi_HTMLMediaElement" "set_muted"

///|
#cfg(target="wasm-gc")
fn html_media_element_default_muted_ffi(obj : JsValue) -> Bool = "webapi_HTMLMediaElement" "get_defaultMuted"

///|
#cfg(target="wasm-gc")
fn html_media_element_set_default_muted_ffi(
  obj : JsValue,
  default_muted : JsValue,
) -> Unit = "webapi_HTMLMediaElement" "set_defaultMuted"

///|
#cfg(target="wasm-gc")
fn html_media_element_audio_tracks_ffi(obj : JsValue) -> AudioTrackList = "webapi_HTMLMediaElement" "get_audioTracks"

///|
#cfg(target="wasm-gc")
fn html_media_element_video_tracks_ffi(obj : JsValue) -> VideoTrackList = "webapi_HTMLMediaElement" "get_videoTracks"

///|
#cfg(target="wasm-gc")
fn html_media_element_text_tracks_ffi(obj : JsValue) -> TextTrackList = "webapi_HTMLMediaElement" "get_textTracks"

///|
#cfg(target="wasm-gc")
fn html_media_element_add_text_track_ffi(
  obj : JsValue,
  kind : JsValue,
  label : JsValue,
  language : JsValue,
) -> TextTrack = "webapi_HTMLMediaElement" "addTextTrack"