Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hls Web support #1246

Open
wants to merge 2 commits into
base: minor
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions just_audio_web/lib/hlsjs.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// @JS()
// library hls.js;

import 'dart:js_interop';
import 'package:web/web.dart' as web;

@JS()
@staticInterop
class Hls {
external factory Hls(HlsConfig config);
external static bool isSupported();
}

extension HlsExtension on Hls {
external void stopLoad();
external void loadSource(String videoSrc);
external void attachMedia(web.HTMLElement video);
external void on(String event, JSFunction callback);
external HlsConfig config;
}

@JS()
@anonymous
@staticInterop
class HlsConfig {
external factory HlsConfig({JSFunction xhrSetup});
}

extension HlsConfigExtension on HlsConfig {
external JSFunction get xhrSetup;
}

class ErrorData {
late final String type;
late final String details;
late final bool fatal;

ErrorData(dynamic errorData) {
type = errorData.type as String;
details = errorData.details as String;
fatal = errorData.fatal as bool;
}
}
35 changes: 35 additions & 0 deletions just_audio_web/lib/hlsjs_loader.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'dart:async';
import 'dart:js_interop';
import 'package:web/web.dart';

import 'hlsjs.dart';

const hlsjsCdnUrl = "https://cdn.jsdelivr.net/npm/hls.js@1";

Future<void>? _loadHlsFuture;

Future<void> _loadHls() async {
var completer = Completer<void>();
var script = document.createElement('script');
script.setAttribute('src', hlsjsCdnUrl);
script.setAttribute('async', '');
script.addEventListener('load', (void _){completer.complete();}.toJS);
script.addEventListener('error', (void _){completer.completeError("Error loading Hls.js");}.toJS);
document.head!.append(script);
return completer.future;
}

Future<void> loadHls() async {
_loadHlsFuture ??= _loadHls();
return _loadHlsFuture;
}

void attachHlsjs(HTMLAudioElement element, String url){
if (Hls.isSupported()) {
var hls = Hls(HlsConfig());
hls.loadSource(url);
hls.attachMedia(element);
} else {
element.src = url;
}
}
11 changes: 9 additions & 2 deletions just_audio_web/lib/just_audio_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
import 'package:just_audio_platform_interface/just_audio_platform_interface.dart';
import 'package:just_audio_web/hlsjs_loader.dart';
import 'package:web/web.dart';

/// The web implementation of [JustAudioPlatform].
Expand Down Expand Up @@ -258,9 +259,15 @@ class Html5AudioPlayer extends JustAudioPlayer {
final Uri uri, final Duration? initialPosition) async {
transition(ProcessingStateMessage.loading);
final src = uri.toString();
if (src != _audioElement.src) {
var isHls = this._audioSourcePlayer is HlsAudioSourcePlayer;;
if (isHls || src != _audioElement.src) {
_durationCompleter = Completer<dynamic>();
_audioElement.src = src;
if (isHls){
await loadHls();
attachHlsjs(_audioElement, src);
} else {
_audioElement.src = src;
}
_audioElement.playbackRate = _speed;
_audioElement.preload = 'auto';
_audioElement.load();
Expand Down