mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45:18 +00:00
Merge pull request #1758 from KRTirtho/refactor/cargokit-based-rust-plugins
refactor: cargokit based rust plugins
This commit is contained in:
commit
56ce84d748
4
.github/Dockerfile
vendored
4
.github/Dockerfile
vendored
@ -1,6 +1,6 @@
|
|||||||
ARG FLUTTER_VERSION
|
ARG FLUTTER_VERSION
|
||||||
|
|
||||||
FROM --platform=linux/arm64 krtirtho/flutter_distributor_arm64:${FLUTTER_VERSION}
|
FROM --platform=linux/arm64 krtirtho/flutter_distributor:${FLUTTER_VERSION}
|
||||||
|
|
||||||
ARG BUILD_VERSION
|
ARG BUILD_VERSION
|
||||||
|
|
||||||
@ -10,6 +10,8 @@ COPY . .
|
|||||||
|
|
||||||
RUN chown -R $(whoami) /app
|
RUN chown -R $(whoami) /app
|
||||||
|
|
||||||
|
RUN rustup target add aarch64-unknown-linux-gnu
|
||||||
|
|
||||||
RUN flutter pub get
|
RUN flutter pub get
|
||||||
|
|
||||||
RUN alias dpkg-deb="dpkg-deb --Zxz" &&\
|
RUN alias dpkg-deb="dpkg-deb --Zxz" &&\
|
||||||
|
23
.github/Dockerfile.flutter_distributor
vendored
23
.github/Dockerfile.flutter_distributor
vendored
@ -1,23 +0,0 @@
|
|||||||
FROM --platform=linux/arm64 ubuntu:22.04
|
|
||||||
|
|
||||||
ARG FLUTTER_VERSION
|
|
||||||
|
|
||||||
RUN apt-get clean &&\
|
|
||||||
apt-get update &&\
|
|
||||||
apt-get install -y bash curl file git unzip xz-utils zip libglu1-mesa cmake tar clang ninja-build pkg-config libgtk-3-dev make python3-pip python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace fuse libunwind-dev locate patchelf gir1.2-appindicator3-0.1 libappindicator3-1 libappindicator3-dev libsecret-1-0 libjsoncpp25 libsecret-1-dev libjsoncpp-dev libnotify-bin libnotify-dev mpv libmpv-dev rpm libwebkit2gtk-4.1-0 libwebkit2gtk-4.1-dev libsoup-3.0-0 libsoup-3.0-dev && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
WORKDIR /home/flutter
|
|
||||||
|
|
||||||
RUN git clone https://github.com/flutter/flutter.git -b ${FLUTTER_VERSION} --single-branch flutter-sdk
|
|
||||||
|
|
||||||
RUN flutter-sdk/bin/flutter precache
|
|
||||||
|
|
||||||
RUN flutter-sdk/bin/flutter config --no-analytics
|
|
||||||
|
|
||||||
ENV PATH="$PATH:/home/flutter/flutter-sdk/bin"
|
|
||||||
ENV PATH="$PATH:/home/flutter/flutter-sdk/bin/cache/dart-sdk/bin"
|
|
||||||
ENV PATH="$PATH:/home/flutter/.pub-cache/bin"
|
|
||||||
ENV PUB_CACHE="/home/flutter/.pub-cache"
|
|
||||||
|
|
||||||
RUN dart pub global activate flutter_distributor
|
|
10
.github/workflows/spotube-release-binary.yml
vendored
10
.github/workflows/spotube-release-binary.yml
vendored
@ -82,6 +82,11 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
if: ${{matrix.platform == 'linux_arm'}}
|
if: ${{matrix.platform == 'linux_arm'}}
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Setup Rust toolchain
|
||||||
|
if: ${{matrix.platform != 'linux_arm'}}
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
- name: Install ${{matrix.platform}} dependencies
|
- name: Install ${{matrix.platform}} dependencies
|
||||||
run: |
|
run: |
|
||||||
@ -94,6 +99,11 @@ jobs:
|
|||||||
echo '${{ secrets.KEYSTORE }}' | base64 --decode > android/app/upload-keystore.jks
|
echo '${{ secrets.KEYSTORE }}' | base64 --decode > android/app/upload-keystore.jks
|
||||||
echo '${{ secrets.KEY_PROPERTIES }}' > android/key.properties
|
echo '${{ secrets.KEY_PROPERTIES }}' > android/key.properties
|
||||||
|
|
||||||
|
- name: Unessary hosted tools
|
||||||
|
if: ${{matrix.platform == 'linux_arm'}}
|
||||||
|
run: |
|
||||||
|
sudo rm -rf /usr/share/dotnet
|
||||||
|
|
||||||
- name: Build ${{matrix.platform}} binaries
|
- name: Build ${{matrix.platform}} binaries
|
||||||
run: dart cli/cli.dart build ${{matrix.platform}}
|
run: dart cli/cli.dart build ${{matrix.platform}}
|
||||||
env:
|
env:
|
||||||
|
@ -58,6 +58,11 @@ class InstallDependenciesCommand extends Command {
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case "ios":
|
case "ios":
|
||||||
|
await shell.run(
|
||||||
|
"""
|
||||||
|
rustup target add aarch64-apple-ios
|
||||||
|
""",
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
case "android":
|
case "android":
|
||||||
await shell.run(
|
await shell.run(
|
||||||
|
@ -12,6 +12,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:local_notifier/local_notifier.dart';
|
import 'package:local_notifier/local_notifier.dart';
|
||||||
import 'package:media_kit/media_kit.dart';
|
import 'package:media_kit/media_kit.dart';
|
||||||
import 'package:metadata_god/metadata_god.dart';
|
import 'package:metadata_god/metadata_god.dart';
|
||||||
|
import 'package:smtc_windows/smtc_windows.dart';
|
||||||
import 'package:spotube/collections/env.dart';
|
import 'package:spotube/collections/env.dart';
|
||||||
import 'package:spotube/collections/initializers.dart';
|
import 'package:spotube/collections/initializers.dart';
|
||||||
import 'package:spotube/collections/routes.dart';
|
import 'package:spotube/collections/routes.dart';
|
||||||
@ -91,6 +92,10 @@ Future<void> main(List<String> rawArgs) async {
|
|||||||
await FlutterDiscordRPC.initialize(Env.discordAppId);
|
await FlutterDiscordRPC.initialize(Env.discordAppId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(kIsWindows){
|
||||||
|
await SMTCWindows.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
await KVStoreService.initialize();
|
await KVStoreService.initialize();
|
||||||
await EncryptedKvStoreService.initialize();
|
await EncryptedKvStoreService.initialize();
|
||||||
|
|
||||||
|
@ -37,9 +37,10 @@ class LocalLibraryPage extends HookConsumerWidget {
|
|||||||
currentTrack ??= tracks.first;
|
currentTrack ??= tracks.first;
|
||||||
final isPlaylistPlaying = playlist.containsTracks(tracks);
|
final isPlaylistPlaying = playlist.containsTracks(tracks);
|
||||||
if (!isPlaylistPlaying) {
|
if (!isPlaylistPlaying) {
|
||||||
|
var indexWhere = tracks.indexWhere((s) => s.id == currentTrack?.id);
|
||||||
await playback.load(
|
await playback.load(
|
||||||
tracks,
|
tracks,
|
||||||
initialIndex: tracks.indexWhere((s) => s.id == currentTrack?.id),
|
initialIndex: indexWhere,
|
||||||
autoPlay: true,
|
autoPlay: true,
|
||||||
);
|
);
|
||||||
} else if (isPlaylistPlaying &&
|
} else if (isPlaylistPlaying &&
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:media_kit/media_kit.dart' hide Track;
|
import 'package:media_kit/media_kit.dart' hide Track;
|
||||||
@ -11,6 +12,7 @@ import 'package:spotube/provider/audio_player/state.dart';
|
|||||||
import 'package:spotube/provider/blacklist_provider.dart';
|
import 'package:spotube/provider/blacklist_provider.dart';
|
||||||
import 'package:spotube/provider/database/database.dart';
|
import 'package:spotube/provider/database/database.dart';
|
||||||
import 'package:spotube/provider/discord_provider.dart';
|
import 'package:spotube/provider/discord_provider.dart';
|
||||||
|
import 'package:spotube/provider/local_tracks/local_tracks_provider.dart';
|
||||||
import 'package:spotube/provider/server/sourced_track.dart';
|
import 'package:spotube/provider/server/sourced_track.dart';
|
||||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||||
|
|
||||||
@ -283,7 +285,7 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
|
|||||||
// Giving the initial track a boost so MediaKit won't skip
|
// Giving the initial track a boost so MediaKit won't skip
|
||||||
// because of timeout
|
// because of timeout
|
||||||
final intendedActiveTrack = medias.elementAt(initialIndex);
|
final intendedActiveTrack = medias.elementAt(initialIndex);
|
||||||
if (intendedActiveTrack is! LocalTrack) {
|
if (intendedActiveTrack.track is! LocalTrack) {
|
||||||
await ref.read(sourcedTrackProvider(intendedActiveTrack).future);
|
await ref.read(sourcedTrackProvider(intendedActiveTrack).future);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,7 +294,7 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
|
|||||||
await removeCollections(state.collections);
|
await removeCollections(state.collections);
|
||||||
|
|
||||||
await audioPlayer.openPlaylist(
|
await audioPlayer.openPlaylist(
|
||||||
medias,
|
medias.map((s) => s as Media).toList(),
|
||||||
initialIndex: initialIndex,
|
initialIndex: initialIndex,
|
||||||
autoPlay: autoPlay,
|
autoPlay: autoPlay,
|
||||||
);
|
);
|
||||||
|
@ -70,7 +70,7 @@ class DownloadManagerProvider extends ChangeNotifier {
|
|||||||
trackNumber: track.trackNumber,
|
trackNumber: track.trackNumber,
|
||||||
discNumber: track.discNumber,
|
discNumber: track.discNumber,
|
||||||
durationMs: track.durationMs?.toDouble() ?? 0.0,
|
durationMs: track.durationMs?.toDouble() ?? 0.0,
|
||||||
fileSize: await file.length(),
|
fileSize: BigInt.from(await file.length()),
|
||||||
trackTotal: track.album?.tracks?.length ?? 0,
|
trackTotal: track.album?.tracks?.length ?? 0,
|
||||||
picture: imageBytes != null
|
picture: imageBytes != null
|
||||||
? Picture(
|
? Picture(
|
||||||
|
@ -14,7 +14,7 @@ import 'package:spotube/extensions/track.dart';
|
|||||||
import 'package:spotube/models/local_track.dart';
|
import 'package:spotube/models/local_track.dart';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
// ignore: depend_on_referenced_packages
|
// ignore: depend_on_referenced_packages
|
||||||
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FfiException;
|
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException;
|
||||||
|
|
||||||
const supportedAudioTypes = [
|
const supportedAudioTypes = [
|
||||||
"audio/webm",
|
"audio/webm",
|
||||||
@ -37,7 +37,7 @@ final localTracksProvider =
|
|||||||
FutureProvider<Map<String, List<LocalTrack>>>((ref) async {
|
FutureProvider<Map<String, List<LocalTrack>>>((ref) async {
|
||||||
try {
|
try {
|
||||||
if (kIsWeb) return {};
|
if (kIsWeb) return {};
|
||||||
final Map<String, List<LocalTrack>> tracks = {};
|
final Map<String, List<LocalTrack>> libraryToTracks = {};
|
||||||
|
|
||||||
final downloadLocation = ref.watch(
|
final downloadLocation = ref.watch(
|
||||||
userPreferencesProvider.select((s) => s.downloadLocation),
|
userPreferencesProvider.select((s) => s.downloadLocation),
|
||||||
@ -52,59 +52,61 @@ final localTracksProvider =
|
|||||||
|
|
||||||
for (final location in [downloadLocation, ...localLibraryLocations]) {
|
for (final location in [downloadLocation, ...localLibraryLocations]) {
|
||||||
if (location.isEmpty) continue;
|
if (location.isEmpty) continue;
|
||||||
final entities = <FileSystemEntity>[];
|
final entities = <File>[];
|
||||||
if (await Directory(location).exists()) {
|
if (await Directory(location).exists()) {
|
||||||
try {
|
try {
|
||||||
entities.addAll(Directory(location).listSync(recursive: true));
|
final dirEntities =
|
||||||
|
await Directory(location).list(recursive: true).toList();
|
||||||
|
|
||||||
|
entities.addAll(
|
||||||
|
dirEntities
|
||||||
|
.where(
|
||||||
|
(e) =>
|
||||||
|
e is File &&
|
||||||
|
supportedAudioTypes.contains(lookupMimeType(e.path)),
|
||||||
|
)
|
||||||
|
.cast<File>(),
|
||||||
|
);
|
||||||
} catch (e, stack) {
|
} catch (e, stack) {
|
||||||
AppLogger.reportError(e, stack);
|
AppLogger.reportError(e, stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final filesWithMetadata = (await Future.wait(
|
final List<Map<dynamic, dynamic>> filesWithMetadata = [];
|
||||||
entities.map((e) => File(e.path)).where((file) {
|
|
||||||
final mimetype = lookupMimeType(file.path);
|
|
||||||
return mimetype != null && supportedAudioTypes.contains(mimetype);
|
|
||||||
}).map(
|
|
||||||
(file) async {
|
|
||||||
try {
|
|
||||||
final metadata = await MetadataGod.readMetadata(file: file.path)
|
|
||||||
.timeout(const Duration(seconds: 10));
|
|
||||||
|
|
||||||
final imageFile = File(join(
|
for (final file in entities) {
|
||||||
(await getTemporaryDirectory()).path,
|
try {
|
||||||
"spotube",
|
final metadata = await MetadataGod.readMetadata(file: file.path);
|
||||||
basenameWithoutExtension(file.path) +
|
|
||||||
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
|
||||||
));
|
|
||||||
if (!await imageFile.exists() && metadata.picture != null) {
|
|
||||||
await imageFile.create(recursive: true);
|
|
||||||
await imageFile.writeAsBytes(
|
|
||||||
metadata.picture?.data ?? [],
|
|
||||||
mode: FileMode.writeOnly,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
await Future.delayed(const Duration(milliseconds: 50));
|
||||||
"metadata": metadata,
|
|
||||||
"file": file,
|
|
||||||
"art": imageFile.path
|
|
||||||
};
|
|
||||||
} catch (e, stack) {
|
|
||||||
if (e case FfiException() || TimeoutException()) {
|
|
||||||
return {"file": file};
|
|
||||||
}
|
|
||||||
AppLogger.reportError(e, stack);
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
))
|
|
||||||
.where((e) => e.isNotEmpty)
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
// ignore: no_leading_underscores_for_local_identifiers
|
final imageFile = File(join(
|
||||||
final _tracks = filesWithMetadata
|
(await getTemporaryDirectory()).path,
|
||||||
|
"spotube",
|
||||||
|
basenameWithoutExtension(file.path) +
|
||||||
|
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
||||||
|
));
|
||||||
|
if (!await imageFile.exists() && metadata.picture != null) {
|
||||||
|
await imageFile.create(recursive: true);
|
||||||
|
await imageFile.writeAsBytes(
|
||||||
|
metadata.picture?.data ?? [],
|
||||||
|
mode: FileMode.writeOnly,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
filesWithMetadata.add(
|
||||||
|
{"metadata": metadata, "file": file, "art": imageFile.path},
|
||||||
|
);
|
||||||
|
} catch (e, stack) {
|
||||||
|
if (e case FrbException() || TimeoutException()) {
|
||||||
|
filesWithMetadata.add({"file": file});
|
||||||
|
}
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final tracksFromMetadata = filesWithMetadata
|
||||||
.map(
|
.map(
|
||||||
(fileWithMetadata) => LocalTrack.fromTrack(
|
(fileWithMetadata) => LocalTrack.fromTrack(
|
||||||
track: Track().fromFile(
|
track: Track().fromFile(
|
||||||
@ -117,9 +119,9 @@ final localTracksProvider =
|
|||||||
)
|
)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
tracks[location] = _tracks;
|
libraryToTracks[location] = tracksFromMetadata;
|
||||||
}
|
}
|
||||||
return tracks;
|
return libraryToTracks;
|
||||||
} catch (e, stack) {
|
} catch (e, stack) {
|
||||||
AppLogger.reportError(e, stack);
|
AppLogger.reportError(e, stack);
|
||||||
return {};
|
return {};
|
||||||
|
@ -41,9 +41,16 @@ class SpotubeMedia extends mk.Media {
|
|||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get uri => track is LocalTrack
|
String get uri {
|
||||||
? (track as LocalTrack).path
|
return switch (track) {
|
||||||
: "http://${kIsWindows ? "localhost" : InternetAddress.anyIPv4.address}:$serverPort/stream/${track.id}";
|
/// [super.uri] must be used instead of [track.path] to prevent wrong
|
||||||
|
/// path format exceptions in Windows causing [extras] to be null
|
||||||
|
LocalTrack() => super.uri,
|
||||||
|
_ =>
|
||||||
|
"http://${kIsWindows ? "localhost" : InternetAddress.anyIPv4.address}:"
|
||||||
|
"$serverPort/stream/${track.id}",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
factory SpotubeMedia.fromMedia(mk.Media media) {
|
factory SpotubeMedia.fromMedia(mk.Media media) {
|
||||||
final track = media.uri.startsWith("http")
|
final track = media.uri.startsWith("http")
|
||||||
@ -56,20 +63,20 @@ class SpotubeMedia extends mk.Media {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
// @override
|
||||||
operator ==(Object other) {
|
// operator ==(Object other) {
|
||||||
if (other is! SpotubeMedia) return false;
|
// if (other is! SpotubeMedia) return false;
|
||||||
|
|
||||||
final isLocal = track is LocalTrack && other.track is LocalTrack;
|
// final isLocal = track is LocalTrack && other.track is LocalTrack;
|
||||||
return isLocal
|
// return isLocal
|
||||||
? (other.track as LocalTrack).path == (track as LocalTrack).path
|
// ? (other.track as LocalTrack).path == (track as LocalTrack).path
|
||||||
: other.track.id == track.id;
|
// : other.track.id == track.id;
|
||||||
}
|
// }
|
||||||
|
|
||||||
@override
|
// @override
|
||||||
int get hashCode => track is LocalTrack
|
// int get hashCode => track is LocalTrack
|
||||||
? (track as LocalTrack).path.hashCode
|
// ? (track as LocalTrack).path.hashCode
|
||||||
: track.id.hashCode;
|
// : track.id.hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class AudioPlayerInterface {
|
abstract class AudioPlayerInterface {
|
||||||
|
@ -149,5 +149,7 @@ mixin SpotubeAudioPlayersStreams on AudioPlayerInterface {
|
|||||||
|
|
||||||
Stream<String> get errorStream => _mkPlayer.stream.error;
|
Stream<String> get errorStream => _mkPlayer.stream.error;
|
||||||
|
|
||||||
Stream<mk.Playlist> get playlistStream => _mkPlayer.stream.playlist;
|
Stream<mk.Playlist> get playlistStream => _mkPlayer.stream.playlist.map((s) {
|
||||||
|
return s;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,276 +0,0 @@
|
|||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
|
|
||||||
class MusicMetadata {
|
|
||||||
final String? title;
|
|
||||||
final String? artist;
|
|
||||||
final String? album;
|
|
||||||
final String? albumArtist;
|
|
||||||
final String? thumbnail;
|
|
||||||
|
|
||||||
const MusicMetadata({
|
|
||||||
this.title,
|
|
||||||
this.artist,
|
|
||||||
this.album,
|
|
||||||
this.albumArtist,
|
|
||||||
this.thumbnail,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
enum PlaybackStatus {
|
|
||||||
Closed,
|
|
||||||
Changing,
|
|
||||||
Stopped,
|
|
||||||
Playing,
|
|
||||||
Paused,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum PressedButton {
|
|
||||||
play,
|
|
||||||
pause,
|
|
||||||
next,
|
|
||||||
previous,
|
|
||||||
fastForward,
|
|
||||||
rewind,
|
|
||||||
stop,
|
|
||||||
record,
|
|
||||||
channelUp,
|
|
||||||
channelDown;
|
|
||||||
|
|
||||||
static PressedButton fromString(String button) {
|
|
||||||
switch (button) {
|
|
||||||
case 'play':
|
|
||||||
return PressedButton.play;
|
|
||||||
case 'pause':
|
|
||||||
return PressedButton.pause;
|
|
||||||
case 'next':
|
|
||||||
return PressedButton.next;
|
|
||||||
case 'previous':
|
|
||||||
return PressedButton.previous;
|
|
||||||
case 'fast_forward':
|
|
||||||
return PressedButton.fastForward;
|
|
||||||
case 'rewind':
|
|
||||||
return PressedButton.rewind;
|
|
||||||
case 'stop':
|
|
||||||
return PressedButton.stop;
|
|
||||||
case 'record':
|
|
||||||
return PressedButton.record;
|
|
||||||
case 'channel_up':
|
|
||||||
return PressedButton.channelUp;
|
|
||||||
case 'channel_down':
|
|
||||||
return PressedButton.channelDown;
|
|
||||||
default:
|
|
||||||
throw Exception('Unknown button: $button');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SMTCConfig {
|
|
||||||
final bool playEnabled;
|
|
||||||
final bool pauseEnabled;
|
|
||||||
final bool stopEnabled;
|
|
||||||
final bool nextEnabled;
|
|
||||||
final bool prevEnabled;
|
|
||||||
final bool fastForwardEnabled;
|
|
||||||
final bool rewindEnabled;
|
|
||||||
|
|
||||||
const SMTCConfig({
|
|
||||||
required this.playEnabled,
|
|
||||||
required this.pauseEnabled,
|
|
||||||
required this.stopEnabled,
|
|
||||||
required this.nextEnabled,
|
|
||||||
required this.prevEnabled,
|
|
||||||
required this.fastForwardEnabled,
|
|
||||||
required this.rewindEnabled,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
enum RepeatMode {
|
|
||||||
none,
|
|
||||||
track,
|
|
||||||
list;
|
|
||||||
|
|
||||||
static RepeatMode fromString(String value) {
|
|
||||||
switch (value) {
|
|
||||||
case 'none':
|
|
||||||
return none;
|
|
||||||
case 'track':
|
|
||||||
return track;
|
|
||||||
case 'list':
|
|
||||||
return list;
|
|
||||||
default:
|
|
||||||
throw Exception('Unknown repeat mode: $value');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String get asString => toString().split('.').last;
|
|
||||||
}
|
|
||||||
|
|
||||||
class PlaybackTimeline {
|
|
||||||
final int startTimeMs;
|
|
||||||
final int endTimeMs;
|
|
||||||
final int positionMs;
|
|
||||||
final int? minSeekTimeMs;
|
|
||||||
final int? maxSeekTimeMs;
|
|
||||||
|
|
||||||
const PlaybackTimeline({
|
|
||||||
required this.startTimeMs,
|
|
||||||
required this.endTimeMs,
|
|
||||||
required this.positionMs,
|
|
||||||
this.minSeekTimeMs,
|
|
||||||
this.maxSeekTimeMs,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class SMTCWindows {
|
|
||||||
SMTCWindows({
|
|
||||||
SMTCConfig? config,
|
|
||||||
PlaybackTimeline? timeline,
|
|
||||||
MusicMetadata? metadata,
|
|
||||||
PlaybackStatus? status,
|
|
||||||
bool? shuffleEnabled,
|
|
||||||
RepeatMode? repeatMode,
|
|
||||||
bool? enabled,
|
|
||||||
});
|
|
||||||
|
|
||||||
SMTCConfig get config => throw UnimplementedError();
|
|
||||||
PlaybackTimeline get timeline => throw UnimplementedError();
|
|
||||||
MusicMetadata get metadata => throw UnimplementedError();
|
|
||||||
PlaybackStatus? get status => throw UnimplementedError();
|
|
||||||
Stream<PressedButton> get buttonPressStream => throw UnimplementedError();
|
|
||||||
Stream<bool> get shuffleChangeStream => throw UnimplementedError();
|
|
||||||
Stream<RepeatMode> get repeatModeChangeStream => throw UnimplementedError();
|
|
||||||
|
|
||||||
bool get isPlayEnabled => config.playEnabled;
|
|
||||||
bool get isPauseEnabled => config.pauseEnabled;
|
|
||||||
bool get isStopEnabled => config.stopEnabled;
|
|
||||||
bool get isNextEnabled => config.nextEnabled;
|
|
||||||
bool get isPrevEnabled => config.prevEnabled;
|
|
||||||
bool get isFastForwardEnabled => config.fastForwardEnabled;
|
|
||||||
bool get isRewindEnabled => config.rewindEnabled;
|
|
||||||
|
|
||||||
bool get isShuffleEnabled => throw UnimplementedError();
|
|
||||||
RepeatMode get repeatMode => throw UnimplementedError();
|
|
||||||
bool get enabled => throw UnimplementedError();
|
|
||||||
|
|
||||||
Duration? get startTime => Duration(milliseconds: timeline.startTimeMs);
|
|
||||||
Duration? get endTime => Duration(milliseconds: timeline.endTimeMs);
|
|
||||||
Duration? get position => Duration(milliseconds: timeline.positionMs);
|
|
||||||
Duration? get minSeekTime => timeline.minSeekTimeMs == null
|
|
||||||
? null
|
|
||||||
: Duration(milliseconds: timeline.minSeekTimeMs!);
|
|
||||||
Duration? get maxSeekTime => timeline.maxSeekTimeMs == null
|
|
||||||
? null
|
|
||||||
: Duration(milliseconds: timeline.maxSeekTimeMs!);
|
|
||||||
|
|
||||||
Future<void> updateConfig(SMTCConfig config) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> updateTimeline(PlaybackTimeline timeline) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> updateMetadata(MusicMetadata metadata) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> clearMetadata() {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> dispose() async {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> disableSmtc() {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> enableSmtc() {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setPlaybackStatus(PlaybackStatus status) async {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsPlayEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsPauseEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsStopEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsNextEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsPrevEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsFastForwardEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setIsRewindEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setTimeline(PlaybackTimeline timeline) {
|
|
||||||
return updateTimeline(timeline);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setTitle(String title) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setArtist(String artist) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setAlbum(String album) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setAlbumArtist(String albumArtist) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setThumbnail(String thumbnail) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setPosition(Duration position) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setStartTime(Duration startTime) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setEndTime(Duration endTime) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setMaxSeekTime(Duration maxSeekTime) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setMinSeekTime(Duration minSeekTime) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setShuffleEnabled(bool enabled) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> setRepeatMode(RepeatMode repeatMode) {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
@ -18,7 +18,7 @@ class WindowsAudioService {
|
|||||||
|
|
||||||
WindowsAudioService(this.ref, this.audioPlayerNotifier)
|
WindowsAudioService(this.ref, this.audioPlayerNotifier)
|
||||||
: smtc = SMTCWindows(enabled: false) {
|
: smtc = SMTCWindows(enabled: false) {
|
||||||
smtc.setPlaybackStatus(PlaybackStatus.Stopped);
|
smtc.setPlaybackStatus(PlaybackStatus.stopped);
|
||||||
final buttonStream = smtc.buttonPressStream.listen((event) {
|
final buttonStream = smtc.buttonPressStream.listen((event) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case PressedButton.play:
|
case PressedButton.play:
|
||||||
@ -45,16 +45,16 @@ class WindowsAudioService {
|
|||||||
audioPlayer.playerStateStream.listen((state) async {
|
audioPlayer.playerStateStream.listen((state) async {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case AudioPlaybackState.playing:
|
case AudioPlaybackState.playing:
|
||||||
await smtc.setPlaybackStatus(PlaybackStatus.Playing);
|
await smtc.setPlaybackStatus(PlaybackStatus.playing);
|
||||||
break;
|
break;
|
||||||
case AudioPlaybackState.paused:
|
case AudioPlaybackState.paused:
|
||||||
await smtc.setPlaybackStatus(PlaybackStatus.Paused);
|
await smtc.setPlaybackStatus(PlaybackStatus.paused);
|
||||||
break;
|
break;
|
||||||
case AudioPlaybackState.stopped:
|
case AudioPlaybackState.stopped:
|
||||||
await smtc.setPlaybackStatus(PlaybackStatus.Stopped);
|
await smtc.setPlaybackStatus(PlaybackStatus.stopped);
|
||||||
break;
|
break;
|
||||||
case AudioPlaybackState.completed:
|
case AudioPlaybackState.completed:
|
||||||
await smtc.setPlaybackStatus(PlaybackStatus.Changing);
|
await smtc.setPlaybackStatus(PlaybackStatus.changing);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
||||||
#include <system_theme/system_theme_plugin.h>
|
#include <system_theme/system_theme_plugin.h>
|
||||||
#include <system_tray/system_tray_plugin.h>
|
|
||||||
#include <tray_manager/tray_manager_plugin.h>
|
#include <tray_manager/tray_manager_plugin.h>
|
||||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
#include <window_manager/window_manager_plugin.h>
|
||||||
@ -48,9 +47,6 @@ void fl_register_plugins(FlPluginRegistry* registry) {
|
|||||||
g_autoptr(FlPluginRegistrar) system_theme_registrar =
|
g_autoptr(FlPluginRegistrar) system_theme_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "SystemThemePlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "SystemThemePlugin");
|
||||||
system_theme_plugin_register_with_registrar(system_theme_registrar);
|
system_theme_plugin_register_with_registrar(system_theme_registrar);
|
||||||
g_autoptr(FlPluginRegistrar) system_tray_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "SystemTrayPlugin");
|
|
||||||
system_tray_plugin_register_with_registrar(system_tray_registrar);
|
|
||||||
g_autoptr(FlPluginRegistrar) tray_manager_registrar =
|
g_autoptr(FlPluginRegistrar) tray_manager_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin");
|
||||||
tray_manager_plugin_register_with_registrar(tray_manager_registrar);
|
tray_manager_plugin_register_with_registrar(tray_manager_registrar);
|
||||||
|
@ -12,7 +12,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||||||
screen_retriever
|
screen_retriever
|
||||||
sqlite3_flutter_libs
|
sqlite3_flutter_libs
|
||||||
system_theme
|
system_theme
|
||||||
system_tray
|
|
||||||
tray_manager
|
tray_manager
|
||||||
url_launcher_linux
|
url_launcher_linux
|
||||||
window_manager
|
window_manager
|
||||||
|
@ -23,7 +23,6 @@ import shared_preferences_foundation
|
|||||||
import sqflite
|
import sqflite
|
||||||
import sqlite3_flutter_libs
|
import sqlite3_flutter_libs
|
||||||
import system_theme
|
import system_theme
|
||||||
import system_tray
|
|
||||||
import tray_manager
|
import tray_manager
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
import window_manager
|
import window_manager
|
||||||
@ -47,7 +46,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
|
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
|
||||||
SystemThemePlugin.register(with: registry.registrar(forPlugin: "SystemThemePlugin"))
|
SystemThemePlugin.register(with: registry.registrar(forPlugin: "SystemThemePlugin"))
|
||||||
SystemTrayPlugin.register(with: registry.registrar(forPlugin: "SystemTrayPlugin"))
|
|
||||||
TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin"))
|
TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
|
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
|
||||||
|
@ -14,7 +14,8 @@ PODS:
|
|||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- file_selector_macos (0.0.1):
|
- file_selector_macos (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- flutter_discord_rpc (0.0.1)
|
- flutter_discord_rpc (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
- flutter_inappwebview_macos (0.0.1):
|
- flutter_inappwebview_macos (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- OrderedSet (~> 5.0)
|
- OrderedSet (~> 5.0)
|
||||||
@ -27,7 +28,8 @@ PODS:
|
|||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- media_kit_native_event_loop (1.0.0):
|
- media_kit_native_event_loop (1.0.0):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- metadata_god (0.0.1)
|
- metadata_god (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
- OrderedSet (5.0.0)
|
- OrderedSet (5.0.0)
|
||||||
- package_info_plus (0.0.1):
|
- package_info_plus (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@ -163,14 +165,14 @@ SPEC CHECKSUMS:
|
|||||||
desktop_webview_window: 89bb3d691f4c80314a10be312f4cd35db93a9d5a
|
desktop_webview_window: 89bb3d691f4c80314a10be312f4cd35db93a9d5a
|
||||||
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
|
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
|
||||||
file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
|
file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
|
||||||
flutter_discord_rpc: 53b006f68ef620a99fe1b3ba7e83513f3ae95b4c
|
flutter_discord_rpc: 67a7c10ea24d9d3bf35d01af643f48fbcfa7c24f
|
||||||
flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
|
flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
|
||||||
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
|
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
|
||||||
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
|
||||||
local_notifier: e9506bc66fc70311e8bc7291fb70f743c081e4ff
|
local_notifier: e9506bc66fc70311e8bc7291fb70f743c081e4ff
|
||||||
media_kit_libs_macos_audio: 3871782a4f3f84c77f04d7666c87800a781c24da
|
media_kit_libs_macos_audio: 3871782a4f3f84c77f04d7666c87800a781c24da
|
||||||
media_kit_native_event_loop: 7321675377cb9ae8596a29bddf3a3d2b5e8792c5
|
media_kit_native_event_loop: 7321675377cb9ae8596a29bddf3a3d2b5e8792c5
|
||||||
metadata_god: eceae399d0020475069a5cebc35943ce8562b5d7
|
metadata_god: 829f61208b44ac1173e7cd32ab740d8776be5435
|
||||||
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
|
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
|
||||||
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
|
||||||
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
||||||
|
131
pubspec.lock
131
pubspec.lock
@ -125,50 +125,50 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: bonsoir
|
name: bonsoir
|
||||||
sha256: "9703ca3ce201c7ab6cd278ae5a530a125959687f59c2b97822f88a8db5bef106"
|
sha256: b7697a954c772a6ddc68d52b3e4768947cc98613127f7720a05b14ed1e59d68b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.9"
|
version: "5.1.10"
|
||||||
bonsoir_android:
|
bonsoir_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: bonsoir_android
|
name: bonsoir_android
|
||||||
sha256: "19583ae34a5e5743fa2c16619e4ec699b35ae5e6cece59b99b1cf21c1b4ed618"
|
sha256: a72d83a78780c1f238e3178d0585e5604fbd9f2503206293737cdfab899ce8d0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.4"
|
version: "5.1.5"
|
||||||
bonsoir_darwin:
|
bonsoir_darwin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: bonsoir_darwin
|
name: bonsoir_darwin
|
||||||
sha256: "985c4c38b4cbfa57ed5870e724a7e17aa080ee7f49d03b43e6d08781511505c6"
|
sha256: "2d25c70f0d09260be1c2ab583b80dd89cbbfd59997579dadf789c5af00c7b2e4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.2"
|
version: "5.1.3"
|
||||||
bonsoir_linux:
|
bonsoir_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: bonsoir_linux
|
name: bonsoir_linux
|
||||||
sha256: "65554b20bc169c68c311eb31fab46ccdd8ee3d3dd89a2d57c338f4cbf6ceb00d"
|
sha256: f2639aded6e15943a9822de98a663a1056f37cbfd0a74d72c9eaa941965945c2
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.2"
|
version: "5.1.3"
|
||||||
bonsoir_platform_interface:
|
bonsoir_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: bonsoir_platform_interface
|
name: bonsoir_platform_interface
|
||||||
sha256: "4ee898bec0b5a63f04f82b06da9896ae8475f32a33b6fa395bea56399daeb9f0"
|
sha256: "08bb8b35d0198168b3bce87dbc718e4e510336cff1d97e43762e030c01636d45"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.2"
|
version: "5.1.3"
|
||||||
bonsoir_windows:
|
bonsoir_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: bonsoir_windows
|
name: bonsoir_windows
|
||||||
sha256: abbc90b73ac39e823b0c127da43b91d8906dcc530fc0cec4e169cf0d8c4404b1
|
sha256: d4a0ca479d4f3679487a61f3174fb9fe1651e323c778b02dfa630490366be65d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.4"
|
version: "5.1.5"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -715,10 +715,11 @@ packages:
|
|||||||
flutter_discord_rpc:
|
flutter_discord_rpc:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_discord_rpc
|
path: "packages/flutter_discord_rpc"
|
||||||
sha256: "290c0d91c8ef24c3acb84cb6fcc5c5fed652fe4871b59896c8d180d5eae5d647"
|
ref: cargokit
|
||||||
url: "https://pub.dev"
|
resolved-ref: "1b839bf02afd5dfa56b0dc25f60af04aa9bfc7c3"
|
||||||
source: hosted
|
url: "https://github.com/KRTirtho/frb_plugins.git"
|
||||||
|
source: git
|
||||||
version: "0.1.0+1"
|
version: "0.1.0+1"
|
||||||
flutter_displaymode:
|
flutter_displaymode:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
@ -918,10 +919,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_rust_bridge
|
name: flutter_rust_bridge
|
||||||
sha256: "02720226035257ad0b571c1256f43df3e1556a499f6bcb004849a0faaa0e87f0"
|
sha256: fac14d2dd67eeba29a20e5d99fac0d4d9fcd552cdf6bf4f8945f7679c6b07b1d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.82.6"
|
version: "2.1.0"
|
||||||
flutter_secure_storage:
|
flutter_secure_storage:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1266,10 +1267,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: intl
|
name: intl
|
||||||
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
|
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.18.1"
|
version: "0.19.0"
|
||||||
introduction_screen:
|
introduction_screen:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1322,26 +1323,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
|
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "10.0.4"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
|
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.3"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_testing
|
name: leak_tracker_testing
|
||||||
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
|
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.1"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1474,18 +1475,19 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
|
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.0"
|
version: "1.12.0"
|
||||||
metadata_god:
|
metadata_god:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: metadata_god
|
path: "packages/metadata_god"
|
||||||
sha256: cf13931c39eba0b9443d16e8940afdabee125bf08945f18d4c0d02bcae2a3317
|
ref: cargokit
|
||||||
url: "https://pub.dev"
|
resolved-ref: "1b839bf02afd5dfa56b0dc25f60af04aa9bfc7c3"
|
||||||
source: hosted
|
url: "https://github.com/KRTirtho/frb_plugins.git"
|
||||||
version: "0.5.2+1"
|
source: git
|
||||||
|
version: "0.5.3"
|
||||||
mime:
|
mime:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1766,14 +1768,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.3"
|
version: "1.2.3"
|
||||||
puppeteer:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: puppeteer
|
|
||||||
sha256: "6833edca01b1e9dcdd9a6e41bad84b706dfba4366d095c4edff64b00c02ac472"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.8.0"
|
|
||||||
quiver:
|
quiver:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1935,14 +1929,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.4"
|
version: "1.1.4"
|
||||||
shelf_static:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: shelf_static
|
|
||||||
sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.1.2"
|
|
||||||
shelf_web_socket:
|
shelf_web_socket:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -1999,10 +1985,11 @@ packages:
|
|||||||
smtc_windows:
|
smtc_windows:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: smtc_windows
|
path: "packages/smtc_windows"
|
||||||
sha256: "0fd64d0c6a0c8ea4ea7908d31195eadc8f6d45d5245159fc67259e9e8704100f"
|
ref: cargokit
|
||||||
url: "https://pub.dev"
|
resolved-ref: "1b839bf02afd5dfa56b0dc25f60af04aa9bfc7c3"
|
||||||
source: hosted
|
url: "https://github.com/KRTirtho/frb_plugins.git"
|
||||||
|
source: git
|
||||||
version: "0.1.3"
|
version: "0.1.3"
|
||||||
source_gen:
|
source_gen:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
@ -2031,12 +2018,11 @@ packages:
|
|||||||
spotify:
|
spotify:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
name: spotify
|
||||||
ref: "fix/explicit-to-json"
|
sha256: "705f09a457a893973451c15f4072670ac4783d67e42c35c080c55a48dee3a01f"
|
||||||
resolved-ref: c4b37c599413ac7bfd78993e416a56105c62b634
|
url: "https://pub.dev"
|
||||||
url: "https://github.com/KRTirtho/spotify-dart.git"
|
source: hosted
|
||||||
source: git
|
version: "0.13.7"
|
||||||
version: "0.13.6"
|
|
||||||
sprintf:
|
sprintf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -2165,15 +2151,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.0.2"
|
version: "0.0.2"
|
||||||
system_tray:
|
|
||||||
dependency: "direct overridden"
|
|
||||||
description:
|
|
||||||
path: "."
|
|
||||||
ref: dc7ef410d5cfec897edf060c1c4baff69f7c181c
|
|
||||||
resolved-ref: dc7ef410d5cfec897edf060c1c4baff69f7c181c
|
|
||||||
url: "https://github.com/antler119/system_tray"
|
|
||||||
source: git
|
|
||||||
version: "2.0.2"
|
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -2186,10 +2163,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.1"
|
version: "0.7.0"
|
||||||
time:
|
time:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -2230,14 +2207,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.2"
|
version: "0.2.2"
|
||||||
tuple:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: tuple
|
|
||||||
sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.0.2"
|
|
||||||
type_plus:
|
type_plus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -2394,10 +2363,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
|
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "13.0.0"
|
version: "14.2.1"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -2495,5 +2464,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.2.1"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.3.0 <4.0.0"
|
dart: ">=3.4.0 <4.0.0"
|
||||||
flutter: ">=3.19.2"
|
flutter: ">=3.19.2"
|
||||||
|
36
pubspec.yaml
36
pubspec.yaml
@ -65,7 +65,11 @@ dependencies:
|
|||||||
logger: ^2.0.2
|
logger: ^2.0.2
|
||||||
media_kit: ^1.1.10+1
|
media_kit: ^1.1.10+1
|
||||||
media_kit_libs_audio: ^1.0.4
|
media_kit_libs_audio: ^1.0.4
|
||||||
metadata_god: ^0.5.2+1
|
metadata_god:
|
||||||
|
git:
|
||||||
|
url: https://github.com/KRTirtho/frb_plugins.git
|
||||||
|
path: packages/metadata_god
|
||||||
|
ref: cargokit
|
||||||
mime: ^1.0.2
|
mime: ^1.0.2
|
||||||
package_info_plus: ^6.0.0
|
package_info_plus: ^6.0.0
|
||||||
palette_generator: ^0.3.3
|
palette_generator: ^0.3.3
|
||||||
@ -81,7 +85,11 @@ dependencies:
|
|||||||
scroll_to_index: ^3.0.1
|
scroll_to_index: ^3.0.1
|
||||||
sidebarx: ^0.17.1
|
sidebarx: ^0.17.1
|
||||||
shared_preferences: ^2.2.3
|
shared_preferences: ^2.2.3
|
||||||
smtc_windows: ^0.1.3
|
smtc_windows:
|
||||||
|
git:
|
||||||
|
url: https://github.com/KRTirtho/frb_plugins.git
|
||||||
|
path: packages/smtc_windows
|
||||||
|
ref: cargokit
|
||||||
stroke_text: ^0.0.2
|
stroke_text: ^0.0.2
|
||||||
system_theme: ^2.1.0
|
system_theme: ^2.1.0
|
||||||
titlebar_buttons: ^1.0.0
|
titlebar_buttons: ^1.0.0
|
||||||
@ -100,7 +108,11 @@ dependencies:
|
|||||||
very_good_infinite_list: ^0.7.1
|
very_good_infinite_list: ^0.7.1
|
||||||
gap: ^3.0.1
|
gap: ^3.0.1
|
||||||
sliver_tools: ^0.2.12
|
sliver_tools: ^0.2.12
|
||||||
flutter_discord_rpc: ^0.1.0+1
|
flutter_discord_rpc:
|
||||||
|
git:
|
||||||
|
url: https://github.com/KRTirtho/frb_plugins.git
|
||||||
|
path: packages/flutter_discord_rpc
|
||||||
|
ref: cargokit
|
||||||
html_unescape: ^2.0.0
|
html_unescape: ^2.0.0
|
||||||
wikipedia_api: ^0.1.0
|
wikipedia_api: ^0.1.0
|
||||||
skeletonizer: ^1.1.1
|
skeletonizer: ^1.1.1
|
||||||
@ -109,11 +121,8 @@ dependencies:
|
|||||||
flutter_sharing_intent: ^1.1.0
|
flutter_sharing_intent: ^1.1.0
|
||||||
flutter_broadcasts: ^0.4.0
|
flutter_broadcasts: ^0.4.0
|
||||||
freezed_annotation: ^2.4.1
|
freezed_annotation: ^2.4.1
|
||||||
spotify:
|
spotify: ^0.13.7
|
||||||
git:
|
bonsoir: ^5.1.10
|
||||||
url: https://github.com/KRTirtho/spotify-dart.git
|
|
||||||
ref: fix/explicit-to-json
|
|
||||||
bonsoir: ^5.1.9
|
|
||||||
shelf: ^1.4.1
|
shelf: ^1.4.1
|
||||||
shelf_router: ^1.1.4
|
shelf_router: ^1.1.4
|
||||||
shelf_web_socket: ^1.0.4
|
shelf_web_socket: ^1.0.4
|
||||||
@ -155,17 +164,6 @@ dev_dependencies:
|
|||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
uuid: ^4.4.0
|
uuid: ^4.4.0
|
||||||
system_tray:
|
|
||||||
# TODO: remove this when flutter_desktop_tools gets updated
|
|
||||||
# to use [MenuItemBase] instead of [MenuItem]
|
|
||||||
git:
|
|
||||||
url: https://github.com/antler119/system_tray
|
|
||||||
ref: dc7ef410d5cfec897edf060c1c4baff69f7c181c
|
|
||||||
# media_kit_native_event_loop: # to fix "macro name must be an identifier"
|
|
||||||
# git:
|
|
||||||
# url: https://github.com/media-kit/media-kit
|
|
||||||
# path: media_kit_native_event_loop
|
|
||||||
# ref: main
|
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
generate: true
|
generate: true
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
#include <screen_retriever/screen_retriever_plugin.h>
|
||||||
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
|
||||||
#include <system_theme/system_theme_plugin.h>
|
#include <system_theme/system_theme_plugin.h>
|
||||||
#include <system_tray/system_tray_plugin.h>
|
|
||||||
#include <tray_manager/tray_manager_plugin.h>
|
#include <tray_manager/tray_manager_plugin.h>
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
#include <window_manager/window_manager_plugin.h>
|
||||||
@ -45,8 +44,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
|||||||
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
|
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
|
||||||
SystemThemePluginRegisterWithRegistrar(
|
SystemThemePluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("SystemThemePlugin"));
|
registry->GetRegistrarForPlugin("SystemThemePlugin"));
|
||||||
SystemTrayPluginRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("SystemTrayPlugin"));
|
|
||||||
TrayManagerPluginRegisterWithRegistrar(
|
TrayManagerPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("TrayManagerPlugin"));
|
registry->GetRegistrarForPlugin("TrayManagerPlugin"));
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
|
@ -14,7 +14,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||||||
screen_retriever
|
screen_retriever
|
||||||
sqlite3_flutter_libs
|
sqlite3_flutter_libs
|
||||||
system_theme
|
system_theme
|
||||||
system_tray
|
|
||||||
tray_manager
|
tray_manager
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
window_manager
|
window_manager
|
||||||
|
Loading…
Reference in New Issue
Block a user