diff --git a/lib/controller/audio_handler.dart b/lib/controller/audio_handler.dart index 6215fd43..689c5eb3 100644 --- a/lib/controller/audio_handler.dart +++ b/lib/controller/audio_handler.dart @@ -478,11 +478,14 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { WaveformController.inst.generateWaveform(tr); Future setPls() async { - final dur = await setAudioSource(tr.toAudioSource(currentIndex, currentQueue.length)); + final dur = await setAudioSource( + tr.toAudioSource(currentIndex, currentQueue.length), + startPlaying: startPlaying, + ); if (tr.duration == 0) { tr.duration = dur?.inSeconds ?? 0; - refreshNotification(currentItem); } + refreshNotification(currentItem); } try { @@ -503,7 +506,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { _playErrorRemainingSecondsToSkip.value--; if (_playErrorRemainingSecondsToSkip.value <= 0) { NamidaNavigator.inst.closeDialog(); - Player.inst.next(); + skipToNext(); timer.cancel(); } }, @@ -527,12 +530,12 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { // -- The whole idea of pausing and playing is due to the bug where [headset buttons/android next gesture] // -- sometimes don't get detected. await Future.wait([ - onPauseRaw(), + // onPauseRaw(), tryRestoringLastPosition(tr), ]); if (startPlaying) { - setVolume(settings.playerVolume.value); + setVolume(userPlayerVolume); await _waitForAllBuffers(); await _playAudioThenVideo(); } @@ -611,6 +614,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { final cachedAudio = stream?.getCachedFile(videoId); if (cachedAudio != null && useCache) { await setAudioSource(AudioSource.file(cachedAudio.path, tag: mediaItem)); + refreshNotification(); } else if (stream != null && stream.url != null) { if (wasPlaying) { await Future.wait([ @@ -630,6 +634,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { }, ), ); + refreshNotification(); } try { @@ -725,7 +730,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { Future plsplsplsPlay(bool waitForBuffer, bool wasPlayingFromCache, bool sourceChanged) async { if (startPlaying) { - setVolume(settings.playerVolume.value); + setVolume(userPlayerVolume); if (waitForBuffer) await _waitForAllBuffers(); await _playAudioThenVideo(); settings.wakelockMode.value.toggleOn(currentVideoStream.value != null || currentCachedVideo.value != null); @@ -862,6 +867,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { ), ), ]); + refreshNotification(); } } catch (e) { if (item != currentVideo) return; // race avoidance when playing multiple videos @@ -954,6 +960,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { langaugeName: cachedAudio.langaugeName, file: cachedAudio.file, ); + refreshNotification(); return (audioDetails, cachedVideo); } else if (cachedAudio != null && canPlayAudioOnly) { // -- play audio only @@ -966,6 +973,7 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { langaugeName: cachedAudio.langaugeName, file: cachedAudio.file, ); + refreshNotification(); return (audioDetails, null); } return (null, null); @@ -1080,6 +1088,15 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { ); } + @override + bool get enableCrossFade => settings.enableCrossFade.value; + + @override + int get defaultCrossFadeMilliseconds => settings.crossFadeDurationMS.value; + + @override + int get defaultCrossFadeTriggerStartOffsetSeconds => settings.crossFadeAutoTriggerSeconds.value; + @override bool get displayFavouriteButtonInNotification => settings.displayFavouriteButtonInNotification.value; @@ -1138,14 +1155,10 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { } @override - Future play() async { - await onPlay(); - } + Future play() async => await onPlay(); @override - Future pause() async { - await onPause(); - } + Future pause() async => await onPause(); Future togglePlayPause() async { if (isPlaying) { @@ -1157,8 +1170,6 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { @override Future seek(Duration position) async { - final wasPlaying = isPlaying; - Future plsSeek() async => await onSeek(position); Future plsPause() async { @@ -1170,10 +1181,12 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { await currentItem?._execute( selectable: (finalItem) async { - await plsPause(); + // await plsPause(); await plsSeek(); + refreshVideoPosition(false); }, youtubeID: (finalItem) async { + final wasPlaying = isPlaying; await plsPause(); if (_nextSeekCanSetAudioCache) { // -- try putting cache version if it was cached @@ -1183,11 +1196,10 @@ class NamidaAudioVideoHandler extends BasicAudioHandler { _isCurrentAudioFromCache = true; } await plsSeek(); + await _waitForAllBuffers(); + if (wasPlaying) await _playAudioThenVideo(); }, ); - - await _waitForAllBuffers(); - if (wasPlaying) await _playAudioThenVideo(); } @override diff --git a/lib/controller/settings_controller.dart b/lib/controller/settings_controller.dart index 63f5ddd6..964ad173 100644 --- a/lib/controller/settings_controller.dart +++ b/lib/controller/settings_controller.dart @@ -137,7 +137,10 @@ class SettingsController { final RxInt playerPlayFadeDurInMilli = 300.obs; final RxInt playerPauseFadeDurInMilli = 300.obs; final RxInt minTrackDurationToRestoreLastPosInMinutes = 5.obs; + final RxBool enableCrossFade = true.obs; final RxInt lastPlayedTrackIndex = 0.obs; + final RxInt crossFadeDurationMS = 500.obs; + final RxInt crossFadeAutoTriggerSeconds = 5.obs; final RxBool displayFavouriteButtonInNotification = false.obs; final RxBool enableSearchCleanup = true.obs; final RxBool enableBottomNavBar = true.obs; @@ -386,7 +389,10 @@ class SettingsController { playerPlayFadeDurInMilli.value = json['playerPlayFadeDurInMilli'] ?? playerPlayFadeDurInMilli.value; playerPauseFadeDurInMilli.value = json['playerPauseFadeDurInMilli'] as int? ?? playerPauseFadeDurInMilli.value; minTrackDurationToRestoreLastPosInMinutes.value = json['minTrackDurationToRestoreLastPosInMinutes'] ?? minTrackDurationToRestoreLastPosInMinutes.value; + enableCrossFade.value = json['enableCrossFade'] ?? enableCrossFade.value; lastPlayedTrackIndex.value = json['lastPlayedTrackIndex'] ?? lastPlayedTrackIndex.value; + crossFadeDurationMS.value = json['crossFadeDurationMS'] ?? crossFadeDurationMS.value; + crossFadeAutoTriggerSeconds.value = json['crossFadeAutoTriggerSeconds'] ?? crossFadeAutoTriggerSeconds.value; displayFavouriteButtonInNotification.value = json['displayFavouriteButtonInNotification'] ?? displayFavouriteButtonInNotification.value; enableSearchCleanup.value = json['enableSearchCleanup'] ?? enableSearchCleanup.value; enableBottomNavBar.value = json['enableBottomNavBar'] ?? enableBottomNavBar.value; @@ -584,7 +590,10 @@ class SettingsController { 'playerPlayFadeDurInMilli': playerPlayFadeDurInMilli.value, 'playerPauseFadeDurInMilli': playerPauseFadeDurInMilli.value, 'minTrackDurationToRestoreLastPosInMinutes': minTrackDurationToRestoreLastPosInMinutes.value, + 'enableCrossFade': enableCrossFade.value, 'lastPlayedTrackIndex': lastPlayedTrackIndex.value, + 'crossFadeDurationMS': crossFadeDurationMS.value, + 'crossFadeAutoTriggerSeconds': crossFadeAutoTriggerSeconds.value, 'displayFavouriteButtonInNotification': displayFavouriteButtonInNotification.value, 'enableSearchCleanup': enableSearchCleanup.value, 'enableBottomNavBar': enableBottomNavBar.value, @@ -753,7 +762,10 @@ class SettingsController { int? playerPlayFadeDurInMilli, int? playerPauseFadeDurInMilli, int? minTrackDurationToRestoreLastPosInMinutes, + bool? enableCrossFade, int? lastPlayedTrackIndex, + int? crossFadeDurationMS, + int? crossFadeAutoTriggerSeconds, bool? displayFavouriteButtonInNotification, bool? enableSearchCleanup, bool? enableBottomNavBar, @@ -1142,9 +1154,18 @@ class SettingsController { if (minTrackDurationToRestoreLastPosInMinutes != null) { this.minTrackDurationToRestoreLastPosInMinutes.value = minTrackDurationToRestoreLastPosInMinutes; } + if (enableCrossFade != null) { + this.enableCrossFade.value = enableCrossFade; + } if (lastPlayedTrackIndex != null) { this.lastPlayedTrackIndex.value = lastPlayedTrackIndex; } + if (crossFadeDurationMS != null) { + this.crossFadeDurationMS.value = crossFadeDurationMS; + } + if (crossFadeAutoTriggerSeconds != null) { + this.crossFadeAutoTriggerSeconds.value = crossFadeAutoTriggerSeconds; + } if (displayFavouriteButtonInNotification != null) { this.displayFavouriteButtonInNotification.value = displayFavouriteButtonInNotification; } diff --git a/lib/core/translations/keys.dart b/lib/core/translations/keys.dart index f540750f..b7f2d558 100644 --- a/lib/core/translations/keys.dart +++ b/lib/core/translations/keys.dart @@ -101,6 +101,9 @@ class LanguageKeys { late String CREATE; late String CREATED_BACKUP_SUCCESSFULLY_SUB; late String CREATED_BACKUP_SUCCESSFULLY; + late String CROSSFADE_DURATION; + late String CROSSFADE_TRIGGER_SECONDS; + late String CROSSFADE_TRIGGER_SECONDS_DISABLED; late String CUSTOM; late String CUSTOMIZATIONS_SUBTITLE; late String CUSTOMIZATIONS; @@ -159,6 +162,7 @@ class LanguageKeys { late String ENABLE_BLUR_EFFECT; late String ENABLE_BOTTOM_NAV_BAR_SUBTITLE; late String ENABLE_BOTTOM_NAV_BAR; + late String ENABLE_CROSSFADE_EFFECT; late String ENABLE_FADE_EFFECT_ON_PLAY_PAUSE; late String ENABLE_FOLDERS_HIERARCHY; late String ENABLE_GLOW_EFFECT; @@ -245,6 +249,8 @@ class LanguageKeys { late String IF_NOT_PLAYING; late String IGNORES; late String IGNORE_BATTERY_OPTIMIZATIONS_SUBTITLE; + late String IMMERSIVE_MODE; + late String IMMERSIVE_MODE_SUBTITLE; late String IMPORT_ALL; late String IMPORT_LAST_FM_HISTORY_GUIDE; late String IMPORT_LAST_FM_HISTORY; diff --git a/lib/core/translations/language.dart b/lib/core/translations/language.dart index 36811449..88cc02ec 100644 --- a/lib/core/translations/language.dart +++ b/lib/core/translations/language.dart @@ -168,6 +168,9 @@ class Language extends LanguageKeys { CREATE = getKey("CREATE"); CREATED_BACKUP_SUCCESSFULLY_SUB = getKey("CREATED_BACKUP_SUCCESSFULLY_SUB"); CREATED_BACKUP_SUCCESSFULLY = getKey("CREATED_BACKUP_SUCCESSFULLY"); + CROSSFADE_DURATION = getKey("CROSSFADE_DURATION"); + CROSSFADE_TRIGGER_SECONDS = getKey("CROSSFADE_TRIGGER_SECONDS"); + CROSSFADE_TRIGGER_SECONDS_DISABLED = getKey("CROSSFADE_TRIGGER_SECONDS_DISABLED"); CUSTOM = getKey("CUSTOM"); CUSTOMIZATIONS_SUBTITLE = getKey("CUSTOMIZATIONS_SUBTITLE"); CUSTOMIZATIONS = getKey("CUSTOMIZATIONS"); @@ -226,6 +229,7 @@ class Language extends LanguageKeys { ENABLE_BLUR_EFFECT = getKey("ENABLE_BLUR_EFFECT"); ENABLE_BOTTOM_NAV_BAR_SUBTITLE = getKey("ENABLE_BOTTOM_NAV_BAR_SUBTITLE"); ENABLE_BOTTOM_NAV_BAR = getKey("ENABLE_BOTTOM_NAV_BAR"); + ENABLE_CROSSFADE_EFFECT = getKey("ENABLE_CROSSFADE_EFFECT"); ENABLE_FADE_EFFECT_ON_PLAY_PAUSE = getKey("ENABLE_FADE_EFFECT_ON_PLAY_PAUSE"); ENABLE_FOLDERS_HIERARCHY = getKey("ENABLE_FOLDERS_HIERARCHY"); ENABLE_GLOW_EFFECT = getKey("ENABLE_GLOW_EFFECT"); @@ -755,6 +759,13 @@ class Language extends LanguageKeys { + + + + + + + diff --git a/lib/ui/widgets/custom_widgets.dart b/lib/ui/widgets/custom_widgets.dart index a11ea701..b580781a 100644 --- a/lib/ui/widgets/custom_widgets.dart +++ b/lib/ui/widgets/custom_widgets.dart @@ -846,6 +846,7 @@ class NamidaExpansionTile extends StatelessWidget { final bool initiallyExpanded; final Widget? trailing; final ValueChanged? onExpansionChanged; + final bool normalRightPadding; const NamidaExpansionTile({ super.key, @@ -862,6 +863,7 @@ class NamidaExpansionTile extends StatelessWidget { this.initiallyExpanded = false, this.trailing, this.onExpansionChanged, + this.normalRightPadding = false, }); @override @@ -873,7 +875,7 @@ class NamidaExpansionTile extends StatelessWidget { initiallyExpanded: initiallyExpanded, onExpansionChanged: onExpansionChanged, expandedAlignment: Alignment.centerLeft, - tilePadding: const EdgeInsets.only(left: 16.0, right: 12.0), + tilePadding: EdgeInsets.only(left: 16.0, right: normalRightPadding ? 16.0 : 12.0), leading: leading ?? Icon( icon, @@ -1216,7 +1218,7 @@ class NamidaWheelSlider extends StatelessWidget { this.perspective = 0.01, required this.totalCount, required this.initValue, - required this.itemSize, + this.itemSize = 5.0, this.squeeze = 1.0, this.isInfinite = false, required this.onValueChanged, diff --git a/lib/ui/widgets/settings/playback_settings.dart b/lib/ui/widgets/settings/playback_settings.dart index d12666c4..4d30828b 100644 --- a/lib/ui/widgets/settings/playback_settings.dart +++ b/lib/ui/widgets/settings/playback_settings.dart @@ -227,37 +227,15 @@ class PlaybackSettings extends StatelessWidget { }, ), ), - CustomListTile( - title: lang.KILL_PLAYER_AFTER_DISMISSING_APP, - icon: Broken.forbidden_2, - trailingRaw: NamidaPopupWrapper( - children: [ - ...KillAppMode.values.map( - (e) => Obx( - () => NamidaInkWell( - margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 2.0), - padding: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 6.0), - borderRadius: 6.0, - bgColor: settings.killPlayerAfterDismissingAppMode.value == e ? context.theme.cardColor : null, - child: Text( - e.toText(), - style: context.textTheme.displayMedium?.copyWith(fontSize: 14.0.multipliedFontScale), - ), - onTap: () { - settings.save(killPlayerAfterDismissingAppMode: e); - NamidaNavigator.inst.popMenu(handleClosing: false); - Navigator.of(context).pop(); - }, - ), - ), - ), - ], - child: Obx( - () => Text( - settings.killPlayerAfterDismissingAppMode.value.toText(), - style: context.textTheme.displaySmall, - ), - ), + Obx( + () => CustomListTile( + title: lang.KILL_PLAYER_AFTER_DISMISSING_APP, + icon: Broken.forbidden_2, + onTap: () { + final element = settings.killPlayerAfterDismissingAppMode.value.nextElement(KillAppMode.values); + settings.save(killPlayerAfterDismissingAppMode: element); + }, + trailingText: settings.killPlayerAfterDismissingAppMode.value.toText(), ), ), Obx( @@ -283,55 +261,120 @@ class PlaybackSettings extends StatelessWidget { value: settings.playerSkipSilenceEnabled.value, ), ), - Obx( - () => CustomSwitchListTile( - leading: const StackedIcon( - baseIcon: Broken.play, - secondaryIcon: Broken.pause, - ), - title: lang.ENABLE_FADE_EFFECT_ON_PLAY_PAUSE, - onChanged: (value) { - settings.save(enableVolumeFadeOnPlayPause: !value); - Player.inst.setVolume(settings.playerVolume.value); - }, - value: settings.enableVolumeFadeOnPlayPause.value, + // -- Crossfade + NamidaExpansionTile( + normalRightPadding: true, + initiallyExpanded: settings.enableCrossFade.value, + leading: const StackedIcon( + baseIcon: Broken.play, + secondaryIcon: Broken.pause, ), - ), - Obx( - () => CustomListTile( - enabled: settings.enableVolumeFadeOnPlayPause.value, - icon: Broken.play, - title: lang.PLAY_FADE_DURATION, - trailing: NamidaWheelSlider( - totalCount: 1900 ~/ 50, - initValue: settings.playerPlayFadeDurInMilli.value ~/ 50, - itemSize: 2, - squeeze: 0.4, - onValueChanged: (val) { - final v = (val * 50 + 100); - settings.save(playerPlayFadeDurInMilli: v); + childrenPadding: const EdgeInsets.symmetric(horizontal: 12.0), + iconColor: context.defaultIconColor(), + titleText: lang.ENABLE_CROSSFADE_EFFECT, + onExpansionChanged: (value) { + settings.save(enableCrossFade: value); + }, + trailing: Obx(() => CustomSwitch(active: settings.enableCrossFade.value)), + children: [ + Obx( + () { + const stepper = 100; + const minVal = 100; + return CustomListTile( + enabled: settings.enableCrossFade.value, + icon: Broken.play, + title: lang.CROSSFADE_DURATION, + trailing: NamidaWheelSlider( + totalCount: (10000 - minVal) ~/ stepper, + initValue: settings.crossFadeDurationMS.value ~/ stepper, + itemSize: 5, + squeeze: 1, + onValueChanged: (val) { + final v = (val * stepper + minVal); + settings.save(crossFadeDurationMS: v); + }, + text: settings.crossFadeDurationMS.value >= 1000 ? "${settings.crossFadeDurationMS.value / 1000}s" : "${settings.crossFadeDurationMS.value}ms", + ), + ); }, - text: "${settings.playerPlayFadeDurInMilli.value}ms", ), - ), - ), - Obx( - () => CustomListTile( - enabled: settings.enableVolumeFadeOnPlayPause.value, - icon: Broken.pause, - title: lang.PAUSE_FADE_DURATION, - trailing: NamidaWheelSlider( - totalCount: 1900 ~/ 50, - initValue: settings.playerPauseFadeDurInMilli.value ~/ 50, - itemSize: 2, - squeeze: 0.4, - onValueChanged: (val) { - final v = (val * 50 + 100); - settings.save(playerPauseFadeDurInMilli: v); + Obx( + () { + final val = settings.crossFadeAutoTriggerSeconds.value; + return CustomListTile( + enabled: settings.enableCrossFade.value, + icon: Broken.pause, + title: val == 0 ? lang.CROSSFADE_TRIGGER_SECONDS_DISABLED : lang.CROSSFADE_TRIGGER_SECONDS.replaceFirst('_SECONDS_', "$val"), + trailing: NamidaWheelSlider( + totalCount: 30, + initValue: val, + itemSize: 7, + squeeze: 1.4, + onValueChanged: (val) { + settings.save(crossFadeAutoTriggerSeconds: val); + }, + text: "${val}s", + ), + ); }, - text: "${settings.playerPauseFadeDurInMilli.value}ms", ), + ], + ), + // -- Play/Pause Fade + NamidaExpansionTile( + normalRightPadding: true, + initiallyExpanded: settings.enableVolumeFadeOnPlayPause.value, + leading: const StackedIcon( + baseIcon: Broken.play, + secondaryIcon: Broken.pause, ), + childrenPadding: const EdgeInsets.symmetric(horizontal: 12.0), + iconColor: context.defaultIconColor(), + titleText: lang.ENABLE_FADE_EFFECT_ON_PLAY_PAUSE, + onExpansionChanged: (value) { + settings.save(enableVolumeFadeOnPlayPause: value); + Player.inst.setVolume(settings.playerVolume.value); + }, + trailing: Obx(() => CustomSwitch(active: settings.enableVolumeFadeOnPlayPause.value)), + children: [ + Obx( + () => CustomListTile( + enabled: settings.enableVolumeFadeOnPlayPause.value, + icon: Broken.play, + title: lang.PLAY_FADE_DURATION, + trailing: NamidaWheelSlider( + totalCount: 1900 ~/ 50, + initValue: settings.playerPlayFadeDurInMilli.value ~/ 50, + itemSize: 2, + squeeze: 0.4, + onValueChanged: (val) { + final v = (val * 50 + 100); + settings.save(playerPlayFadeDurInMilli: v); + }, + text: "${settings.playerPlayFadeDurInMilli.value}ms", + ), + ), + ), + Obx( + () => CustomListTile( + enabled: settings.enableVolumeFadeOnPlayPause.value, + icon: Broken.pause, + title: lang.PAUSE_FADE_DURATION, + trailing: NamidaWheelSlider( + totalCount: 1900 ~/ 50, + initValue: settings.playerPauseFadeDurInMilli.value ~/ 50, + itemSize: 2, + squeeze: 0.4, + onValueChanged: (val) { + final v = (val * 50 + 100); + settings.save(playerPauseFadeDurInMilli: v); + }, + text: "${settings.playerPauseFadeDurInMilli.value}ms", + ), + ), + ), + ], ), Obx( () => CustomSwitchListTile( diff --git a/pubspec.lock b/pubspec.lock index 167e8779..62bc3f5d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,8 +70,8 @@ packages: dependency: "direct main" description: path: "." - ref: abe0dc1bf5582047da8dc62f0049765be5182f18 - resolved-ref: abe0dc1bf5582047da8dc62f0049765be5182f18 + ref: "4864b79a8a3550a1053ac875f0f8f1be16b987ed" + resolved-ref: "4864b79a8a3550a1053ac875f0f8f1be16b987ed" url: "https://github.com/namidaco/basic_audio_handler" source: git version: "0.0.1" @@ -128,10 +128,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.17.2" connectivity_plus: dependency: "direct main" description: @@ -682,18 +682,18 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: @@ -875,8 +875,8 @@ packages: dependency: "direct main" description: path: "." - ref: f0a76aaf72d668db9bcb8e3289357ea9e065e852 - resolved-ref: f0a76aaf72d668db9bcb8e3289357ea9e065e852 + ref: "8b1927af4781cb4a3b5e828053d42f404c79b947" + resolved-ref: "8b1927af4781cb4a3b5e828053d42f404c79b947" url: "https://github.com/MSOB7YY/picture_in_picture" source: git version: "0.0.1" @@ -1011,10 +1011,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" sqflite: dependency: transitive description: @@ -1091,10 +1091,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.6.0" timezone: dependency: transitive description: @@ -1268,6 +1268,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" wheel_chooser: dependency: transitive description: @@ -1317,5 +1325,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.5 <4.0.0" + dart: ">=3.1.4 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2c7214a9..e1e4dea0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -88,7 +88,7 @@ dependencies: basic_audio_handler: git: url: https://github.com/namidaco/basic_audio_handler - ref: abe0dc1bf5582047da8dc62f0049765be5182f18 + ref: 4864b79a8a3550a1053ac875f0f8f1be16b987ed # ---- Video Indexing & Playback ---- video_player: