Major improvements to UnifiedPlayer: 1. GetFrameImage() now works when paused for responsive UI updates 2. Play() method properly starts FFmpeg process 3. Frame display loop runs continuously for smooth video display 4. Disabled audio temporarily to fix video playback fundamentals 5. Simplified FFmpeg command to focus on video stream only Player now: - Generates video frames correctly - Shows video when paused - Has responsive progress tracking - Starts playback properly Next steps: Re-enable audio playback once video is stable
108 lines
3.0 KiB
Go
108 lines
3.0 KiB
Go
//go:build js && wasm
|
|
// +build js,wasm
|
|
|
|
package idb
|
|
|
|
import (
|
|
"syscall/js"
|
|
|
|
"github.com/hack-pad/safejs"
|
|
)
|
|
|
|
var (
|
|
jsIDBKeyRange safejs.Value
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
jsIDBKeyRange, err = safejs.Global().Get("IDBKeyRange")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// KeyRange represents a continuous interval over some data type that is used for keys. Records can be retrieved from ObjectStore and Index objects using keys or a range of keys.
|
|
type KeyRange struct {
|
|
jsKeyRange safejs.Value
|
|
}
|
|
|
|
func wrapKeyRange(jsKeyRange safejs.Value) *KeyRange {
|
|
return &KeyRange{jsKeyRange}
|
|
}
|
|
|
|
// NewKeyRangeBound creates a new key range with the specified upper and lower bounds.
|
|
// The bounds can be open (that is, the bounds exclude the endpoint values) or closed (that is, the bounds include the endpoint values).
|
|
func NewKeyRangeBound(lower, upper js.Value, lowerOpen, upperOpen bool) (*KeyRange, error) {
|
|
keyRange, err := jsIDBKeyRange.Call("bound", lower, upper, lowerOpen, upperOpen)
|
|
if err != nil {
|
|
return nil, tryAsDOMException(err)
|
|
}
|
|
return wrapKeyRange(keyRange), nil
|
|
}
|
|
|
|
// NewKeyRangeLowerBound creates a new key range with only a lower bound.
|
|
func NewKeyRangeLowerBound(lower js.Value, open bool) (*KeyRange, error) {
|
|
keyRange, err := jsIDBKeyRange.Call("lowerBound", lower, open)
|
|
if err != nil {
|
|
return nil, tryAsDOMException(err)
|
|
}
|
|
return wrapKeyRange(keyRange), nil
|
|
}
|
|
|
|
// NewKeyRangeUpperBound creates a new key range with only an upper bound.
|
|
func NewKeyRangeUpperBound(upper js.Value, open bool) (*KeyRange, error) {
|
|
keyRange, err := jsIDBKeyRange.Call("upperBound", upper, open)
|
|
if err != nil {
|
|
return nil, tryAsDOMException(err)
|
|
}
|
|
return wrapKeyRange(keyRange), nil
|
|
}
|
|
|
|
// NewKeyRangeOnly creates a new key range containing a single value.
|
|
func NewKeyRangeOnly(only js.Value) (*KeyRange, error) {
|
|
keyRange, err := jsIDBKeyRange.Call("only", only)
|
|
if err != nil {
|
|
return nil, tryAsDOMException(err)
|
|
}
|
|
return wrapKeyRange(keyRange), nil
|
|
}
|
|
|
|
// Lower returns the lower bound of the key range.
|
|
func (k *KeyRange) Lower() (js.Value, error) {
|
|
lower, err := k.jsKeyRange.Get("lower")
|
|
return safejs.Unsafe(lower), err
|
|
}
|
|
|
|
// Upper returns the upper bound of the key range.
|
|
func (k *KeyRange) Upper() (js.Value, error) {
|
|
upper, err := k.jsKeyRange.Get("upper")
|
|
return safejs.Unsafe(upper), err
|
|
}
|
|
|
|
// LowerOpen returns false if the lower-bound value is included in the key range.
|
|
func (k *KeyRange) LowerOpen() (bool, error) {
|
|
lowerOpen, err := k.jsKeyRange.Get("lowerOpen")
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return lowerOpen.Bool()
|
|
}
|
|
|
|
// UpperOpen returns false if the upper-bound value is included in the key range.
|
|
func (k *KeyRange) UpperOpen() (bool, error) {
|
|
upperOpen, err := k.jsKeyRange.Get("upperOpen")
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return upperOpen.Bool()
|
|
}
|
|
|
|
// Includes returns a boolean indicating whether a specified key is inside the key range.
|
|
func (k *KeyRange) Includes(key js.Value) (bool, error) {
|
|
includes, err := k.jsKeyRange.Call("includes", key)
|
|
if err != nil {
|
|
return false, tryAsDOMException(err)
|
|
}
|
|
return includes.Bool()
|
|
}
|