Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions Fladder-Tizen.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tizen", "tizen", "{A388AB0E-F47B-31FD-1F3C-3AE867F75632}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Runner", "tizen\Runner.csproj", "{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147}.Debug|Any CPU.Build.0 = Debug|Any CPU
{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147}.Release|Any CPU.ActiveCfg = Release|Any CPU
{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{11CBC428-FFDB-ECCF-FBBF-1DB39BFFB147} = {A388AB0E-F47B-31FD-1F3C-3AE867F75632}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {38085DC2-CEE5-4C57-8CBF-1D53D4E7A0F4}
EndGlobalSection
EndGlobal
38 changes: 34 additions & 4 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'dart:ffi' as ffi;

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -46,8 +47,11 @@
import 'package:fladder/util/window_helper.dart';
import 'package:fladder/widgets/media_query_scaler.dart';

import 'package:flutter_tizen/flutter_tizen.dart';
import 'package:sqlite3/open.dart' as sqlite3_open;

bool get _isDesktop {
if (kIsWeb) return false;
if (kIsWeb || isTizen) return false;
return [
TargetPlatform.windows,
TargetPlatform.linux,
Expand All @@ -63,6 +67,12 @@
}

void main(List<String> args) async {
if (isTizen) {
sqlite3_open.open.overrideFor(sqlite3_open.OperatingSystem.linux, () {
return ffi.DynamicLibrary.open('/usr/share/dotnet.tizen/lib/libsqlite3.so');
});
}

WidgetsFlutterBinding.ensureInitialized();
final crashProvider = CrashLogNotifier();

Expand Down Expand Up @@ -297,12 +307,32 @@
final scrollBehaviour = const MaterialScrollBehavior();
return DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
final lightTheme = themeColor == null
final rawLightTheme = themeColor == null
? FladderTheme.theme(lightDynamic ?? FladderTheme.defaultScheme(Brightness.light), schemeVariant)
: FladderTheme.theme(themeColor.schemeLight, schemeVariant);
final darkTheme = (themeColor == null
final rawDarkTheme = (themeColor == null
? FladderTheme.theme(darkDynamic ?? FladderTheme.defaultScheme(Brightness.dark), schemeVariant)
: FladderTheme.theme(themeColor.schemeDark, schemeVariant));
final lightTheme = !isTizen
? rawLightTheme
: rawLightTheme.copyWith(
pageTransitionsTheme: PageTransitionsTheme(
builders: {
...rawLightTheme.pageTransitionsTheme.builders,
TargetPlatform.linux: const FadeUpwardsPageTransitionsBuilder(),
},
),
);
final darkTheme = !isTizen
? rawDarkTheme
: rawDarkTheme.copyWith(
pageTransitionsTheme: PageTransitionsTheme(
builders: {
...rawDarkTheme.pageTransitionsTheme.builders,
TargetPlatform.linux: const FadeUpwardsPageTransitionsBuilder(),
},
),
);
final amoledOverwrite = amoledBlack ? Colors.black : null;
return ThemesData(
light: lightTheme,
Expand Down Expand Up @@ -359,4 +389,4 @@
}
}

final currentTitleProvider = StateProvider<String>((ref) => "Fladder");
final currentTitleProvider = StateProvider<String>((ref) => "Fladder");

Check notice on line 392 in lib/main.dart

View workflow job for this annotation

GitHub Actions / Linting & Formatting

Missing a newline at the end of the file.

Try adding a newline at the end of the file. See https://dart.dev/lints/eol_at_end_of_file to learn more about this problem.
7 changes: 4 additions & 3 deletions lib/models/settings/arguments_model.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_tizen/flutter_tizen.dart';

part 'arguments_model.freezed.dart';

Expand All @@ -17,11 +18,11 @@ abstract class ArgumentsModel with _$ArgumentsModel {

factory ArgumentsModel.fromArguments(List<String> arguments, String windowArguments, bool leanBackEnabled) {
arguments = arguments.map((e) => e.trim()).toList();
leanBackMode = leanBackEnabled;
leanBackMode = leanBackEnabled || isTizen;
final parsedWindowArgs = windowArguments.split(',');
return ArgumentsModel(
htpcMode: arguments.contains('--htpc') || leanBackEnabled,
leanBackMode: leanBackEnabled,
htpcMode: arguments.contains('--htpc') || leanBackEnabled || isTizen,
leanBackMode: leanBackEnabled || isTizen,
newWindow: parsedWindowArgs.contains('--newWindow'),
);
}
Expand Down
13 changes: 10 additions & 3 deletions lib/models/settings/video_player_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import 'package:fladder/models/settings/key_combinations.dart';
import 'package:fladder/util/bitrate_helper.dart';
import 'package:fladder/util/localization_helper.dart';


import 'package:flutter_tizen/flutter_tizen.dart';

part 'video_player_settings.freezed.dart';
part 'video_player_settings.g.dart';

Expand Down Expand Up @@ -90,7 +93,7 @@ abstract class VideoPlayerSettingsModel with _$VideoPlayerSettingsModel {
factory VideoPlayerSettingsModel.fromJson(Map<String, dynamic> json) => _$VideoPlayerSettingsModelFromJson(json);

PlayerOptions get wantedPlayer =>
leanBackMode ? PlayerOptions.nativePlayer : playerOptions ?? PlayerOptions.platformDefaults;
leanBackMode && !isTizen ? PlayerOptions.nativePlayer : playerOptions ?? PlayerOptions.platformDefaults;

Map<VideoHotKeys, KeyCombination> get currentShortcuts =>
_defaultVideoHotKeys.map((key, value) => MapEntry(key, hotKeys[key] ?? value));
Expand Down Expand Up @@ -139,11 +142,12 @@ abstract class VideoPlayerSettingsModel with _$VideoPlayerSettingsModel {
enum PlayerOptions {
libMDK,
libMPV,
nativePlayer;
nativePlayer,
tizenPlayer;

const PlayerOptions();

static Iterable<PlayerOptions> get available => leanBackMode
static Iterable<PlayerOptions> get available => leanBackMode && !isTizen
? {PlayerOptions.nativePlayer}
: kIsWeb
? {PlayerOptions.libMPV}
Expand All @@ -153,8 +157,10 @@ enum PlayerOptions {
};

static PlayerOptions get platformDefaults {
if (isTizen) return PlayerOptions.tizenPlayer;
if (leanBackMode) return PlayerOptions.nativePlayer;
if (kIsWeb) return PlayerOptions.libMPV;

return switch (defaultTargetPlatform) {
_ => PlayerOptions.libMPV,
};
Expand All @@ -164,6 +170,7 @@ enum PlayerOptions {
PlayerOptions.libMDK => "MDK",
PlayerOptions.libMPV => "MPV",
PlayerOptions.nativePlayer => "Native",
PlayerOptions.tizenPlayer => "Tizen",
};
}

Expand Down
22 changes: 22 additions & 0 deletions lib/models/syncing/database_item.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:io';

import 'package:drift/native.dart';
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
Expand All @@ -17,6 +18,8 @@ import 'package:fladder/models/items/trick_play_model.dart';
import 'package:fladder/models/syncing/sync_item.dart';
import 'package:fladder/providers/user_provider.dart';

import 'package:flutter_tizen/flutter_tizen.dart';
import 'package:sqlite3/sqlite3.dart';
part 'database_item.g.dart';

const _databseName = 'syncedDatabase';
Expand Down Expand Up @@ -194,6 +197,14 @@ class AppDatabase extends _$AppDatabase {
}

static QueryExecutor _openConnection() {
if (isTizen) {
return _openConnectionTizen();
} else {
return _openConnectionDefault();
}
}

static QueryExecutor _openConnectionDefault() {
return driftDatabase(
name: _databseName,
native: const DriftNativeOptions(
Expand All @@ -205,4 +216,15 @@ class AppDatabase extends _$AppDatabase {
),
);
}

static LazyDatabase _openConnectionTizen() {
return LazyDatabase(() async {
final dir = await getApplicationSupportDirectory();
final file = File(p.join(dir.path, '$_databseName.sqlite'));

return NativeDatabase.opened(
sqlite3.open(file.path),
);
});
}
}
74 changes: 42 additions & 32 deletions lib/profiles/default_profile.dart
Original file line number Diff line number Diff line change
@@ -1,44 +1,54 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_tizen/flutter_tizen.dart';

import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
import 'package:fladder/models/settings/video_player_settings.dart';
import 'package:fladder/profiles/tizen_profile.dart';
import 'package:fladder/profiles/web_profile.dart';
import 'package:fladder/providers/video_player_provider.dart';

final videoProfileProvider = StateProvider.autoDispose<DeviceProfile>((ref) =>
defaultProfile(ref.read(videoPlayerProvider.select((value) => value.backend)) ?? PlayerOptions.platformDefaults));

DeviceProfile defaultProfile(PlayerOptions player) => kIsWeb
? webProfile
: const DeviceProfile(
maxStreamingBitrate: 120000000,
maxStaticBitrate: 120000000,
musicStreamingTranscodingBitrate: 384000,
directPlayProfiles: [
DirectPlayProfile(
type: DlnaProfileType.video,
),
DirectPlayProfile(
type: DlnaProfileType.audio,
)
],
transcodingProfiles: [
TranscodingProfile(
audioCodec: 'aac,mp3,mp2',
container: 'ts',
maxAudioChannels: '2',
protocol: MediaStreamProtocol.hls,
type: DlnaProfileType.video,
videoCodec: 'h264',
),
],
containerProfiles: [],
subtitleProfiles: [
SubtitleProfile(format: 'vtt', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'ass', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'ssa', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'pgssub', method: SubtitleDeliveryMethod.$external),
],
);
DeviceProfile defaultProfile(PlayerOptions player) {
if (kIsWeb) {
return webProfile;
}

if (isTizen) {
return tizenProfile;
}

return const DeviceProfile(
maxStreamingBitrate: 120000000,
maxStaticBitrate: 120000000,
musicStreamingTranscodingBitrate: 384000,
directPlayProfiles: [
DirectPlayProfile(
type: DlnaProfileType.video,
),
DirectPlayProfile(
type: DlnaProfileType.audio,
)
],
transcodingProfiles: [
TranscodingProfile(
audioCodec: 'aac,mp3,mp2',
container: 'ts',
maxAudioChannels: '2',
protocol: MediaStreamProtocol.hls,
type: DlnaProfileType.video,
videoCodec: 'h264',
),
],
containerProfiles: [],
subtitleProfiles: [
SubtitleProfile(format: 'vtt', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'ass', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'ssa', method: SubtitleDeliveryMethod.$external),
SubtitleProfile(format: 'pgssub', method: SubtitleDeliveryMethod.$external),
],
);
}
Loading