Merge branch 'master' into dev

This commit is contained in:
Kingkor Roy Tirtho 2023-04-26 00:48:35 +06:00
commit 816ad304df
17 changed files with 170 additions and 37 deletions

View File

@ -99,7 +99,7 @@ jobs:
- name: Install Dependencies - name: Install Dependencies
run: | run: |
sudo apt-get update -y sudo apt-get update -y
sudo apt-get install -y tar clang cmake ninja-build pkg-config libgtk-3-dev make python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace fuse libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev locate patchelf gir1.2-appindicator3-0.1 libappindicator3-1 libappindicator3-dev sudo apt-get install -y tar clang cmake ninja-build pkg-config libgtk-3-dev make python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace fuse libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev locate patchelf gir1.2-appindicator3-0.1 libappindicator3-1 libappindicator3-dev libsecret-1-0 libjsoncpp1 libsecret-1-dev libjsoncpp-dev
- name: Install AppImage Tool - name: Install AppImage Tool
run: | run: |

View File

@ -120,9 +120,9 @@ Do the following:
- Download the latest Flutter SDK (>=2.15.1) & enable desktop support - Download the latest Flutter SDK (>=2.15.1) & enable desktop support
- Install Development dependencies in linux - Install Development dependencies in linux
- `libgstreamer1.0-dev` & `libgstreamer-plugins-base1.0-dev` (for Debian/Ubuntu) - `libappindicator3-1 gir1.2-appindicator3-0.1 libappindicator3-dev libsecret-1-0 libjsoncpp1 libsecret-1-dev libjsoncpp-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev` (for Debian/Ubuntu)
- `gstreamer`, `gst-libav`, `gst-plugins-base` & `gst-plugins-good` (for Arch/Manjaro) - `libappindicator-gtk3 libsecret jsoncpp gstreamer gst-libav gst-plugins-base gst-plugins-good` (for Arch/Manjaro)
- `gstreamer1-devel gstreamer1-plugins-base-tools gstreamer1-doc gstreamer1-plugins-base-devel gstreamer1-plugins-good gstreamer1-plugins-good-extras` (for Fedora) - `libappindicator libsecret libsecret-devel jsoncpp gstreamer1-devel gstreamer1-plugins-base-tools gstreamer1-doc gstreamer1-plugins-base-devel gstreamer1-plugins-good gstreamer1-plugins-good-extras` (for Fedora)
- Clone the Repo & Run `flutter pub get` in the Terminal - Clone the Repo & Run `flutter pub get` in the Terminal
- Create a `secrets.json` in root of the project. The structure should be similar to the following example: - Create a `secrets.json` in root of the project. The structure should be similar to the following example:

View File

@ -14,13 +14,34 @@
</intent> </intent>
</queries> </queries>
<application android:label="Spotube" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:requestLegacyExternalStorage="true"> <application
<activity android:name="com.ryanheise.audioservice.AudioServiceActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> android:allowBackup="false"
<!-- Specifies an Android theme to apply to this Activity as soon as android:fullBackupContent="false"
android:label="Spotube"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
>
<activity
android:name="com.ryanheise.audioservice.AudioServiceActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
>
<!--
Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. --> to determine the Window background behind the Flutter UI.
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />

View File

@ -25,9 +25,9 @@ import 'package:spotube/services/audio_player.dart';
import 'package:spotube/services/pocketbase.dart'; import 'package:spotube/services/pocketbase.dart';
import 'package:spotube/services/youtube.dart'; import 'package:spotube/services/youtube.dart';
import 'package:spotube/themes/theme.dart'; import 'package:spotube/themes/theme.dart';
import 'package:spotube/utils/persisted_state_notifier.dart';
import 'package:system_theme/system_theme.dart'; import 'package:system_theme/system_theme.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:spotube/hooks/use_init_sys_tray.dart'; import 'package:spotube/hooks/use_init_sys_tray.dart';
Future<void> main(List<String> rawArgs) async { Future<void> main(List<String> rawArgs) async {
@ -83,6 +83,7 @@ Future<void> main(List<String> rawArgs) async {
cachePrefix: "oss.krtirtho.spotube", cachePrefix: "oss.krtirtho.spotube",
cacheDir: (await getApplicationSupportDirectory()).path, cacheDir: (await getApplicationSupportDirectory()).path,
); );
await PersistedStateNotifier.initializeBoxes();
Hive.registerAdapter(CacheTrackAdapter()); Hive.registerAdapter(CacheTrackAdapter());
Hive.registerAdapter(CacheTrackEngagementAdapter()); Hive.registerAdapter(CacheTrackEngagementAdapter());
Hive.registerAdapter(CacheTrackSkipSegmentAdapter()); Hive.registerAdapter(CacheTrackSkipSegmentAdapter());

View File

@ -79,7 +79,7 @@ class AuthenticationNotifier
bool get isLoggedIn => state != null; bool get isLoggedIn => state != null;
AuthenticationNotifier() : super(null, "authentication"); AuthenticationNotifier() : super(null, "authentication", encrypted: true);
Timer? _refreshTimer; Timer? _refreshTimer;

View File

@ -1,22 +1,66 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:spotube/utils/primitive_utils.dart';
const secureStorage = FlutterSecureStorage(
aOptions: AndroidOptions(
encryptedSharedPreferences: true,
),
);
const kKeyBoxName = "spotube_box_name";
String getBoxKey(String boxName) => "spotube_box_$boxName";
abstract class PersistedStateNotifier<T> extends StateNotifier<T> { abstract class PersistedStateNotifier<T> extends StateNotifier<T> {
final String cacheKey; final String cacheKey;
final bool encrypted;
FutureOr<void> onInit() {} FutureOr<void> onInit() {}
PersistedStateNotifier( PersistedStateNotifier(
super.state, super.state,
this.cacheKey, this.cacheKey, {
) { this.encrypted = false,
}) {
_load().then((_) => onInit()); _load().then((_) => onInit());
} }
static late LazyBox _box;
static late LazyBox _encryptedBox;
static Future<void> initializeBoxes() async {
String? boxName = await secureStorage.read(key: kKeyBoxName);
if (boxName == null) {
boxName = "spotube-${PrimitiveUtils.uuid.v4()}";
await secureStorage.write(key: kKeyBoxName, value: boxName);
}
String? encryptionKey = await secureStorage.read(key: getBoxKey(boxName));
if (encryptionKey == null) {
encryptionKey = base64Url.encode(Hive.generateSecureKey());
await secureStorage.write(
key: getBoxKey(boxName),
value: encryptionKey,
);
}
_encryptedBox = await Hive.openLazyBox(
boxName,
encryptionCipher: HiveAesCipher(base64Url.decode(encryptionKey)),
);
_box = await Hive.openLazyBox("spotube_cache");
}
LazyBox get box => encrypted ? _encryptedBox : _box;
Future<void> _load() async { Future<void> _load() async {
final box = await Hive.openLazyBox("spotube_cache");
final json = await box.get(cacheKey); final json = await box.get(cacheKey);
if (json != null) { if (json != null) {
@ -47,7 +91,6 @@ abstract class PersistedStateNotifier<T> extends StateNotifier<T> {
} }
void save() async { void save() async {
final box = await Hive.openLazyBox("spotube_cache");
box.put(cacheKey, toJson()); box.put(cacheKey, toJson());
} }

View File

@ -9,6 +9,7 @@
#include <audioplayers_linux/audioplayers_linux_plugin.h> #include <audioplayers_linux/audioplayers_linux_plugin.h>
#include <catcher/catcher_plugin.h> #include <catcher/catcher_plugin.h>
#include <desktop_multi_window/desktop_multi_window_plugin.h> #include <desktop_multi_window/desktop_multi_window_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <native_context_menu/native_context_menu_plugin.h> #include <native_context_menu/native_context_menu_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
#include <system_theme/system_theme_plugin.h> #include <system_theme/system_theme_plugin.h>
@ -27,6 +28,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) desktop_multi_window_registrar = g_autoptr(FlPluginRegistrar) desktop_multi_window_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopMultiWindowPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopMultiWindowPlugin");
desktop_multi_window_plugin_register_with_registrar(desktop_multi_window_registrar); desktop_multi_window_plugin_register_with_registrar(desktop_multi_window_registrar);
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) native_context_menu_registrar = g_autoptr(FlPluginRegistrar) native_context_menu_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "NativeContextMenuPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "NativeContextMenuPlugin");
native_context_menu_plugin_register_with_registrar(native_context_menu_registrar); native_context_menu_plugin_register_with_registrar(native_context_menu_registrar);

View File

@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
audioplayers_linux audioplayers_linux
catcher catcher
desktop_multi_window desktop_multi_window
flutter_secure_storage_linux
native_context_menu native_context_menu
screen_retriever screen_retriever
system_theme system_theme

View File

@ -14,6 +14,8 @@ dependencies:
- libgstreamer-plugins-base1.0-dev - libgstreamer-plugins-base1.0-dev
- libappindicator3-1 - libappindicator3-1
- gir1.2-appindicator3-0.1 - gir1.2-appindicator3-0.1
- libsecret-1-0
- libjsoncpp1
essential: false essential: false
icon: assets/spotube-logo.png icon: assets/spotube-logo.png

View File

@ -12,6 +12,8 @@ requires:
- gstreamer1-plugins-base-devel - gstreamer1-plugins-base-devel
- gstreamer1-plugins-good - gstreamer1-plugins-good
- libappindicator - libappindicator
- jsoncpp
- libsecret
display_name: Spotube display_name: Spotube

View File

@ -11,6 +11,7 @@ import audioplayers_darwin
import catcher import catcher
import desktop_multi_window import desktop_multi_window
import device_info_plus import device_info_plus
import flutter_secure_storage_macos
import native_context_menu import native_context_menu
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
@ -30,6 +31,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
CatcherPlugin.register(with: registry.registrar(forPlugin: "CatcherPlugin")) CatcherPlugin.register(with: registry.registrar(forPlugin: "CatcherPlugin"))
FlutterMultiWindowPlugin.register(with: registry.registrar(forPlugin: "FlutterMultiWindowPlugin")) FlutterMultiWindowPlugin.register(with: registry.registrar(forPlugin: "FlutterMultiWindowPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
NativeContextMenuPlugin.register(with: registry.registrar(forPlugin: "NativeContextMenuPlugin")) NativeContextMenuPlugin.register(with: registry.registrar(forPlugin: "NativeContextMenuPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))

View File

@ -1,14 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.app-sandbox</key> <key>com.apple.security.app-sandbox</key>
<true/> <true />
<key>com.apple.security.cs.allow-jit</key> <key>com.apple.security.cs.allow-jit</key>
<true/> <true />
<key>com.apple.security.network.client</key> <key>com.apple.security.network.client</key>
<true/> <true />
<key>com.apple.security.network.server</key> <key>com.apple.security.network.server</key>
<true/> <true />
</dict> <key>keychain-access-groups</key>
<array />
</dict>
</plist> </plist>

View File

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.app-sandbox</key> <key>com.apple.security.app-sandbox</key>
<true/> <true />
<key>com.apple.security.network.client</key> <key>com.apple.security.network.client</key>
<true/> <true />
<key>com.apple.security.network.server</key> <key>com.apple.security.network.server</key>
<true/> <true />
</dict> <key>keychain-access-groups</key>
<array />
</dict>
</plist> </plist>

View File

@ -725,6 +725,54 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.72.1" version: "1.72.1"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5"
url: "https://pub.dev"
source: hosted
version: "8.0.0"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b
url: "https://pub.dev"
source: hosted
version: "1.0.1"
flutter_secure_storage_web:
dependency: transitive
description:
name: flutter_secure_storage_web
sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
flutter_secure_storage_windows:
dependency: transitive
description:
name: flutter_secure_storage_windows
sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee
url: "https://pub.dev"
source: hosted
version: "2.0.0"
flutter_svg: flutter_svg:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -37,6 +37,7 @@ dependencies:
flutter_hooks: ^0.18.2+1 flutter_hooks: ^0.18.2+1
flutter_inappwebview: ^5.7.2+3 flutter_inappwebview: ^5.7.2+3
flutter_riverpod: ^2.1.1 flutter_riverpod: ^2.1.1
flutter_secure_storage: ^8.0.0
flutter_svg: ^1.1.6 flutter_svg: ^1.1.6
fuzzywuzzy: ^0.2.0 fuzzywuzzy: ^0.2.0
go_router: ^6.0.2 go_router: ^6.0.2

View File

@ -9,6 +9,7 @@
#include <audioplayers_windows/audioplayers_windows_plugin.h> #include <audioplayers_windows/audioplayers_windows_plugin.h>
#include <catcher/catcher_plugin.h> #include <catcher/catcher_plugin.h>
#include <desktop_multi_window/desktop_multi_window_plugin.h> #include <desktop_multi_window/desktop_multi_window_plugin.h>
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <native_context_menu/native_context_menu_plugin.h> #include <native_context_menu/native_context_menu_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h> #include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
@ -25,6 +26,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("CatcherPlugin")); registry->GetRegistrarForPlugin("CatcherPlugin"));
DesktopMultiWindowPluginRegisterWithRegistrar( DesktopMultiWindowPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DesktopMultiWindowPlugin")); registry->GetRegistrarForPlugin("DesktopMultiWindowPlugin"));
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
NativeContextMenuPluginRegisterWithRegistrar( NativeContextMenuPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("NativeContextMenuPlugin")); registry->GetRegistrarForPlugin("NativeContextMenuPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar( PermissionHandlerWindowsPluginRegisterWithRegistrar(

View File

@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
audioplayers_windows audioplayers_windows
catcher catcher
desktop_multi_window desktop_multi_window
flutter_secure_storage_windows
native_context_menu native_context_menu
permission_handler_windows permission_handler_windows
screen_retriever screen_retriever