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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic like this should be moved to a new file. So we can create a "stub" file like mentioned previously for the other platforms that implements the functions/boolean with nothing attached.

That also includes the following imports.

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

While only the ffi is not supported on some platforms best to not use it at all by default if possible.

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
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this change?

? 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.
2 changes: 2 additions & 0 deletions lib/models/playback/playback_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ class PlaybackModelHelper {
bitRateOptions: qualityOptions,
);
} else if ((mediaSource.supportsTranscoding ?? false) && mediaSource.transcodingUrl != null) {

return TranscodePlaybackModel(
item: item,
queue: libraryQueue,
Expand Down Expand Up @@ -500,6 +501,7 @@ class PlaybackModelHelper {
bitRateOptions: playbackModel.bitRateOptions,
);
} else if ((mediaSource.supportsTranscoding ?? false) && mediaSource.transcodingUrl != null) {

newModel = TranscodePlaybackModel(
item: playbackModel.item,
queue: playbackModel.queue,
Expand Down
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() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the reason we need to open the database this way for tizen?

Are downloads even supported for on samsung tv's?

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