outsourced lots of api calls to api folder
centered error message when failed loading video feed display server url on settings page
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					import 'dart:convert';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import '../log/log.dart';
 | 
				
			||||||
import '../types/actor.dart';
 | 
					import '../types/actor.dart';
 | 
				
			||||||
import 'api.dart';
 | 
					import 'api.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -10,3 +11,26 @@ Future<List<Actor>> loadAllActors() async {
 | 
				
			|||||||
  final actors = d.map((e) => Actor.fromJson(e)).toList(growable: false);
 | 
					  final actors = d.map((e) => Actor.fromJson(e)).toList(growable: false);
 | 
				
			||||||
  return actors;
 | 
					  return actors;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<List<Actor>> loadActorsOfVideo(int movieId) async {
 | 
				
			||||||
 | 
					  final data =
 | 
				
			||||||
 | 
					      await API.query("actor", "getActorsOfVideo", {'MovieId': movieId});
 | 
				
			||||||
 | 
					  if (data == 'null') {
 | 
				
			||||||
 | 
					    return [];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<Actor> dta = (d as List).map((e) => Actor.fromJson(e)).toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return dta;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<void> addActorToVideo(int actorId, int movieId) async {
 | 
				
			||||||
 | 
					  final data = await API.query(
 | 
				
			||||||
 | 
					      "actor", "addActorToVideo", {'ActorId': actorId, 'MovieId': movieId});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					  if (d["result"] != "success") {
 | 
				
			||||||
 | 
					    Log.w("couldn't add actor to video");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								lib/api/tag_api.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								lib/api/tag_api.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					import 'dart:convert';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import '../log/log.dart';
 | 
				
			||||||
 | 
					import '../types/tag.dart';
 | 
				
			||||||
 | 
					import 'api.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<List<Tag>> loadAllTags() async {
 | 
				
			||||||
 | 
					  final data = await API.query("tags", "getAllTags", {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = (jsonDecode(data) ?? []) as List<dynamic>;
 | 
				
			||||||
 | 
					  final tags = d.map((e) => Tag.fromJson(e)).toList(growable: false);
 | 
				
			||||||
 | 
					  return tags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<void> addTagToVideo(int tagId, int movieId) async {
 | 
				
			||||||
 | 
					  final data =
 | 
				
			||||||
 | 
					      await API.query("tags", "addTag", {'TagId': tagId, 'MovieId': movieId});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					  if (d["result"] != "success") {
 | 
				
			||||||
 | 
					    Log.w("couldn't add actor to video");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,5 +1,11 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					import 'dart:convert';
 | 
				
			||||||
 | 
					import 'dart:math';
 | 
				
			||||||
 | 
					import 'dart:typed_data';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import '../log/log.dart';
 | 
				
			||||||
 | 
					import '../types/actor.dart';
 | 
				
			||||||
 | 
					import '../types/tag.dart';
 | 
				
			||||||
 | 
					import '../types/video.dart';
 | 
				
			||||||
import '../types/video_data.dart';
 | 
					import '../types/video_data.dart';
 | 
				
			||||||
import 'api.dart';
 | 
					import 'api.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -10,3 +16,55 @@ Future<VideoData> loadVideoData(int videoId) async {
 | 
				
			|||||||
  final video = VideoData.fromJson(d);
 | 
					  final video = VideoData.fromJson(d);
 | 
				
			||||||
  return video;
 | 
					  return video;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<List<VideoT>> loadVideo(Tag? tag, int filterIdx) async {
 | 
				
			||||||
 | 
					  final data = await API
 | 
				
			||||||
 | 
					      .query("video", "getMovies", {'Tag': tag?.tagId ?? 1, 'Sort': filterIdx});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<VideoT> dta =
 | 
				
			||||||
 | 
					      (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return dta;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<List<VideoT>> loadShuffledVideos(int nr) async {
 | 
				
			||||||
 | 
					  final data = await API.query("video", "getRandomMovies",
 | 
				
			||||||
 | 
					      {'Number': nr, 'Seed': Random().nextInt(0x7fffffff)});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<VideoT> dta =
 | 
				
			||||||
 | 
					      (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return dta;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<List<VideoT>> loadVideoByActor(Actor actor) async {
 | 
				
			||||||
 | 
					  final data =
 | 
				
			||||||
 | 
					      await API.query("actor", "getActorInfo", {'ActorId': actor.actorId});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<VideoT> dta =
 | 
				
			||||||
 | 
					      (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return dta;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<bool> addLike(int movieId) async {
 | 
				
			||||||
 | 
					  final data = await API.query("video", "addLike", {'MovieId': movieId});
 | 
				
			||||||
 | 
					  final d = jsonDecode(data);
 | 
				
			||||||
 | 
					  if (d["result"] != 'success') {
 | 
				
			||||||
 | 
					    Log.w(d);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return d["result"] == 'success';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Uint8List> fetchThumbnail(int movieId) async {
 | 
				
			||||||
 | 
					  final base64str =
 | 
				
			||||||
 | 
					      await API.query("video", "readThumbnail", {'Movieid': movieId});
 | 
				
			||||||
 | 
					  return base64Decode(base64str.substring(23));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ class AppScrollBehavior extends MaterialScrollBehavior {
 | 
				
			|||||||
  Set<PointerDeviceKind> get dragDevices => {
 | 
					  Set<PointerDeviceKind> get dragDevices => {
 | 
				
			||||||
        PointerDeviceKind.touch,
 | 
					        PointerDeviceKind.touch,
 | 
				
			||||||
        PointerDeviceKind.mouse,
 | 
					        PointerDeviceKind.mouse,
 | 
				
			||||||
 | 
					        PointerDeviceKind.trackpad
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,12 +25,8 @@ class Db {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _db = await openDatabase(
 | 
					    _db = await openDatabase(
 | 
				
			||||||
      // Set the path to the database. Note: Using the `join` function from the
 | 
					 | 
				
			||||||
      // `path` package is best practice to ensure the path is correctly
 | 
					 | 
				
			||||||
      // constructed for each platform.
 | 
					 | 
				
			||||||
      dbpath,
 | 
					      dbpath,
 | 
				
			||||||
      onCreate: (db, version) {
 | 
					      onCreate: (db, version) {
 | 
				
			||||||
        // Run the CREATE TABLE statement on the database.
 | 
					 | 
				
			||||||
        return db.execute(
 | 
					        return db.execute(
 | 
				
			||||||
          'CREATE TABLE previews(id INTEGER PRIMARY KEY, thumbnail BLOB)',
 | 
					          'CREATE TABLE previews(id INTEGER PRIMARY KEY, thumbnail BLOB)',
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,6 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/actor_api.dart';
 | 
					import '../api/actor_api.dart';
 | 
				
			||||||
import '../api/api.dart';
 | 
					 | 
				
			||||||
import '../log/log.dart';
 | 
					 | 
				
			||||||
import '../screen_loading.dart';
 | 
					import '../screen_loading.dart';
 | 
				
			||||||
import '../types/actor.dart';
 | 
					import '../types/actor.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -19,16 +15,6 @@ class AddActorDialog extends StatefulWidget {
 | 
				
			|||||||
class _AddActorDialogState extends State<AddActorDialog> {
 | 
					class _AddActorDialogState extends State<AddActorDialog> {
 | 
				
			||||||
  late Future<List<Actor>> actors = loadAllActors();
 | 
					  late Future<List<Actor>> actors = loadAllActors();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<void> addActorToVideo(int actorId) async {
 | 
					 | 
				
			||||||
    final data = await API.query("actor", "addActorToVideo",
 | 
					 | 
				
			||||||
        {'ActorId': actorId, 'MovieId': widget.movieId});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
    if (d["result"] != "success") {
 | 
					 | 
				
			||||||
      Log.w("couldn't add actor to video");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
@@ -52,7 +38,7 @@ class _AddActorDialogState extends State<AddActorDialog> {
 | 
				
			|||||||
                    .map((e) => ListTile(
 | 
					                    .map((e) => ListTile(
 | 
				
			||||||
                          title: Text(e.name),
 | 
					                          title: Text(e.name),
 | 
				
			||||||
                          onTap: () async {
 | 
					                          onTap: () async {
 | 
				
			||||||
                            await addActorToVideo(e.actorId);
 | 
					                            await addActorToVideo(e.actorId, widget.movieId);
 | 
				
			||||||
                            Navigator.pop(context, e);
 | 
					                            Navigator.pop(context, e);
 | 
				
			||||||
                          },
 | 
					                          },
 | 
				
			||||||
                        ))
 | 
					                        ))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,6 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/api.dart';
 | 
					import '../api/tag_api.dart';
 | 
				
			||||||
import '../log/log.dart';
 | 
					 | 
				
			||||||
import '../screen_loading.dart';
 | 
					import '../screen_loading.dart';
 | 
				
			||||||
import '../types/tag.dart';
 | 
					import '../types/tag.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,24 +15,6 @@ class AddTagDialog extends StatefulWidget {
 | 
				
			|||||||
class _AddTagDialogState extends State<AddTagDialog> {
 | 
					class _AddTagDialogState extends State<AddTagDialog> {
 | 
				
			||||||
  late Future<List<Tag>> tags = loadAllTags();
 | 
					  late Future<List<Tag>> tags = loadAllTags();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<List<Tag>> loadAllTags() async {
 | 
					 | 
				
			||||||
    final data = await API.query("tags", "getAllTags", {});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = (jsonDecode(data) ?? []) as List<dynamic>;
 | 
					 | 
				
			||||||
    final tags = d.map((e) => Tag.fromJson(e)).toList(growable: false);
 | 
					 | 
				
			||||||
    return tags;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Future<void> addTagToVideo(int tagId) async {
 | 
					 | 
				
			||||||
    final data = await API
 | 
					 | 
				
			||||||
        .query("tags", "addTag", {'TagId': tagId, 'MovieId': widget.movieId});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
    if (d["result"] != "success") {
 | 
					 | 
				
			||||||
      Log.w("couldn't add actor to video");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
@@ -60,7 +39,7 @@ class _AddTagDialogState extends State<AddTagDialog> {
 | 
				
			|||||||
                      (e) => ListTile(
 | 
					                      (e) => ListTile(
 | 
				
			||||||
                        title: Text(e.tagName),
 | 
					                        title: Text(e.tagName),
 | 
				
			||||||
                        onTap: () async {
 | 
					                        onTap: () async {
 | 
				
			||||||
                          await addTagToVideo(e.tagId);
 | 
					                          await addTagToVideo(e.tagId, widget.movieId);
 | 
				
			||||||
                          Navigator.pop(context, e);
 | 
					                          Navigator.pop(context, e);
 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
                      ),
 | 
					                      ),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,9 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:openmediacentermobile/preview/tag_tile.dart';
 | 
					import '../api/tag_api.dart';
 | 
				
			||||||
 | 
					import '../preview/tag_tile.dart';
 | 
				
			||||||
import '../drawer/my_drawer.dart';
 | 
					import '../drawer/my_drawer.dart';
 | 
				
			||||||
import '../screen_loading.dart';
 | 
					import '../screen_loading.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/api.dart';
 | 
					 | 
				
			||||||
import '../types/tag.dart';
 | 
					import '../types/tag.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CategorieScreen extends StatefulWidget {
 | 
					class CategorieScreen extends StatefulWidget {
 | 
				
			||||||
@@ -18,18 +16,10 @@ class CategorieScreen extends StatefulWidget {
 | 
				
			|||||||
class _CategorieScreenState extends State<CategorieScreen> {
 | 
					class _CategorieScreenState extends State<CategorieScreen> {
 | 
				
			||||||
  late Future<List<Tag>> _categories;
 | 
					  late Future<List<Tag>> _categories;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<List<Tag>> loadVideoData() async {
 | 
					 | 
				
			||||||
    final data = await API.query("tags", "getAllTags", {});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = (jsonDecode(data) ?? []) as List<dynamic>;
 | 
					 | 
				
			||||||
    final tags = d.map((e) => Tag.fromJson(e)).toList(growable: false);
 | 
					 | 
				
			||||||
    return tags;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
    _categories = loadVideoData();
 | 
					    _categories = loadAllTags();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:openmediacentermobile/utils/file_formatter.dart';
 | 
					import '../utils/file_formatter.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/token.dart';
 | 
					import '../api/token.dart';
 | 
				
			||||||
import '../db/database.dart';
 | 
					import '../db/database.dart';
 | 
				
			||||||
@@ -15,6 +15,7 @@ class SettingsScreen extends StatefulWidget {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class _SettingsScreenState extends State<SettingsScreen> {
 | 
					class _SettingsScreenState extends State<SettingsScreen> {
 | 
				
			||||||
  int dbsize = 0;
 | 
					  int dbsize = 0;
 | 
				
			||||||
 | 
					  String serverUrl = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
@@ -22,6 +23,10 @@ class _SettingsScreenState extends State<SettingsScreen> {
 | 
				
			|||||||
    Db().getDbSize().then((v) => setState(() {
 | 
					    Db().getDbSize().then((v) => setState(() {
 | 
				
			||||||
          dbsize = v;
 | 
					          dbsize = v;
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Token.getInstance().getToken().then((value) => setState(() {
 | 
				
			||||||
 | 
					          serverUrl = value?.domain ?? "unknown";
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
@@ -34,6 +39,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
 | 
				
			|||||||
        ),
 | 
					        ),
 | 
				
			||||||
        body: Column(
 | 
					        body: Column(
 | 
				
			||||||
          children: [
 | 
					          children: [
 | 
				
			||||||
 | 
					            Text("Current server: $serverUrl"),
 | 
				
			||||||
            ElevatedButton(
 | 
					            ElevatedButton(
 | 
				
			||||||
                onPressed: () async {
 | 
					                onPressed: () async {
 | 
				
			||||||
                  await Db().clear();
 | 
					                  await Db().clear();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,9 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
import 'dart:math';
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import '../api/video_api.dart';
 | 
				
			||||||
import '../drawer/my_drawer.dart';
 | 
					import '../drawer/my_drawer.dart';
 | 
				
			||||||
import '../preview/preview_grid.dart';
 | 
					import '../preview/preview_grid.dart';
 | 
				
			||||||
import '../api/api.dart';
 | 
					 | 
				
			||||||
import '../utils/platform.dart';
 | 
					import '../utils/platform.dart';
 | 
				
			||||||
import '../types/video.dart';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ShuffleScreen extends StatefulWidget {
 | 
					class ShuffleScreen extends StatefulWidget {
 | 
				
			||||||
  const ShuffleScreen({Key? key}) : super(key: key);
 | 
					  const ShuffleScreen({Key? key}) : super(key: key);
 | 
				
			||||||
@@ -16,18 +13,6 @@ class ShuffleScreen extends StatefulWidget {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _ShuffleScreenState extends State<ShuffleScreen> {
 | 
					class _ShuffleScreenState extends State<ShuffleScreen> {
 | 
				
			||||||
  Future<List<VideoT>> loadData(int nr) async {
 | 
					 | 
				
			||||||
    final data = await API.query("video", "getRandomMovies",
 | 
					 | 
				
			||||||
        {'Number': nr, 'Seed': Random().nextInt(0x7fffffff)});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    List<VideoT> dta =
 | 
					 | 
				
			||||||
        (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dta;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    double width = MediaQuery.of(context).size.width;
 | 
					    double width = MediaQuery.of(context).size.width;
 | 
				
			||||||
@@ -38,7 +23,8 @@ class _ShuffleScreenState extends State<ShuffleScreen> {
 | 
				
			|||||||
        ),
 | 
					        ),
 | 
				
			||||||
        body: PreviewGrid(
 | 
					        body: PreviewGrid(
 | 
				
			||||||
          videoLoader: () {
 | 
					          videoLoader: () {
 | 
				
			||||||
            return loadData((isTV() ? width ~/ 200 : width ~/ 275) * 2);
 | 
					            return loadShuffledVideos(
 | 
				
			||||||
 | 
					                (isTV() ? width ~/ 200 : width ~/ 275) * 2);
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          footerBuilder: (state) => Column(
 | 
					          footerBuilder: (state) => Column(
 | 
				
			||||||
            children: [
 | 
					            children: [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,9 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import '../api/video_api.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/api.dart';
 | 
					 | 
				
			||||||
import '../drawer/my_drawer.dart';
 | 
					import '../drawer/my_drawer.dart';
 | 
				
			||||||
import '../preview/preview_grid.dart';
 | 
					import '../preview/preview_grid.dart';
 | 
				
			||||||
import '../types/tag.dart';
 | 
					import '../types/tag.dart';
 | 
				
			||||||
import '../types/video.dart';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FilterTypes { DATE, LIKES, RANDOM, NAMES, LENGTH }
 | 
					enum FilterTypes { DATE, LIKES, RANDOM, NAMES, LENGTH }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -24,18 +21,6 @@ class VideoFeedState extends State<VideoFeed> {
 | 
				
			|||||||
  FilterTypes filterSelection = FilterTypes.DATE;
 | 
					  FilterTypes filterSelection = FilterTypes.DATE;
 | 
				
			||||||
  Key _refreshKey = UniqueKey();
 | 
					  Key _refreshKey = UniqueKey();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<List<VideoT>> loadData() async {
 | 
					 | 
				
			||||||
    final data = await API.query("video", "getMovies",
 | 
					 | 
				
			||||||
        {'Tag': widget.tag?.tagId ?? 1, 'Sort': filterSelection.index});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    List<VideoT> dta =
 | 
					 | 
				
			||||||
        (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dta;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return Scaffold(
 | 
					    return Scaffold(
 | 
				
			||||||
@@ -80,7 +65,7 @@ class VideoFeedState extends State<VideoFeed> {
 | 
				
			|||||||
        ),
 | 
					        ),
 | 
				
			||||||
        body: PreviewGrid(
 | 
					        body: PreviewGrid(
 | 
				
			||||||
          key: _refreshKey,
 | 
					          key: _refreshKey,
 | 
				
			||||||
          videoLoader: () => loadData(),
 | 
					          videoLoader: () => loadVideo(widget.tag, filterSelection.index),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        drawer: widget.tag == null ? MyDrawer() : null);
 | 
					        drawer: widget.tag == null ? MyDrawer() : null);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,8 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/api.dart';
 | 
					import '../api/video_api.dart';
 | 
				
			||||||
import 'preview_grid.dart';
 | 
					import 'preview_grid.dart';
 | 
				
			||||||
import '../types/actor.dart';
 | 
					import '../types/actor.dart';
 | 
				
			||||||
import '../types/video.dart';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ActorFeed extends StatefulWidget {
 | 
					class ActorFeed extends StatefulWidget {
 | 
				
			||||||
  const ActorFeed({Key? key, required this.actor}) : super(key: key);
 | 
					  const ActorFeed({Key? key, required this.actor}) : super(key: key);
 | 
				
			||||||
@@ -16,22 +13,10 @@ class ActorFeed extends StatefulWidget {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _ActorFeedState extends State<ActorFeed> {
 | 
					class _ActorFeedState extends State<ActorFeed> {
 | 
				
			||||||
  Future<List<VideoT>> loadData() async {
 | 
					 | 
				
			||||||
    final data = await API
 | 
					 | 
				
			||||||
        .query("actor", "getActorInfo", {'ActorId': widget.actor.actorId});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    List<VideoT> dta =
 | 
					 | 
				
			||||||
        (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dta;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return PreviewGrid(
 | 
					    return PreviewGrid(
 | 
				
			||||||
      videoLoader: () => loadData(),
 | 
					      videoLoader: () => loadVideoByActor(widget.actor),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:openmediacentermobile/preview/actor_feed.dart';
 | 
					import '../preview/actor_feed.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../utils/platform.dart';
 | 
					import '../utils/platform.dart';
 | 
				
			||||||
import '../types/actor.dart';
 | 
					import '../types/actor.dart';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,15 +56,15 @@ class _PreviewGridState extends State<PreviewGrid> {
 | 
				
			|||||||
          builder:
 | 
					          builder:
 | 
				
			||||||
              (BuildContext context, AsyncSnapshot<List<VideoT>> snapshot) {
 | 
					              (BuildContext context, AsyncSnapshot<List<VideoT>> snapshot) {
 | 
				
			||||||
            if (snapshot.hasError) {
 | 
					            if (snapshot.hasError) {
 | 
				
			||||||
              return Column(
 | 
					              return Center(
 | 
				
			||||||
                children: [
 | 
					                child: Column(
 | 
				
			||||||
                  Text("Error"),
 | 
					                  mainAxisAlignment: MainAxisAlignment.center,
 | 
				
			||||||
                  TextButton(
 | 
					                  children: [
 | 
				
			||||||
                      onPressed: () {
 | 
					                    Text("Error"),
 | 
				
			||||||
                        loadData();
 | 
					                    TextButton(
 | 
				
			||||||
                      },
 | 
					                        onPressed: () => loadData(), child: Text("Reload page"))
 | 
				
			||||||
                      child: Text("Reload page"))
 | 
					                  ],
 | 
				
			||||||
                ],
 | 
					                ),
 | 
				
			||||||
              );
 | 
					              );
 | 
				
			||||||
            } else if (snapshot.hasData) {
 | 
					            } else if (snapshot.hasData) {
 | 
				
			||||||
              return _mainGrid(snapshot.data!, width);
 | 
					              return _mainGrid(snapshot.data!, width);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,8 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
import 'package:flutter/foundation.dart';
 | 
					import 'package:flutter/foundation.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:sqflite/sqflite.dart';
 | 
					import 'package:sqflite/sqflite.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../api/api.dart';
 | 
					import '../api/video_api.dart';
 | 
				
			||||||
import '../db/database.dart';
 | 
					import '../db/database.dart';
 | 
				
			||||||
import '../log/log.dart';
 | 
					import '../log/log.dart';
 | 
				
			||||||
import '../utils/platform.dart';
 | 
					import '../utils/platform.dart';
 | 
				
			||||||
@@ -51,23 +50,17 @@ class _PreviewTileState extends State<PreviewTile> {
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<Uint8List> _fetchThumbnail(int id) async {
 | 
					 | 
				
			||||||
    final base64str =
 | 
					 | 
				
			||||||
        await API.query("video", "readThumbnail", {'Movieid': id});
 | 
					 | 
				
			||||||
    return base64Decode(base64str.substring(23));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Future<Image> loadData() async {
 | 
					  Future<Image> loadData() async {
 | 
				
			||||||
    Uint8List data;
 | 
					    Uint8List data;
 | 
				
			||||||
    final id = widget.dta.id;
 | 
					    final id = widget.dta.id;
 | 
				
			||||||
    if (kIsWeb) {
 | 
					    if (kIsWeb) {
 | 
				
			||||||
      data = await _fetchThumbnail(id);
 | 
					      data = await fetchThumbnail(id);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      final List<Map<String, dynamic>> prev =
 | 
					      final List<Map<String, dynamic>> prev =
 | 
				
			||||||
          await Db().db().query('previews', where: "id=$id");
 | 
					          await Db().db().query('previews', where: "id=$id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (prev.isEmpty) {
 | 
					      if (prev.isEmpty) {
 | 
				
			||||||
        data = await _fetchThumbnail(id);
 | 
					        data = await fetchThumbnail(id);
 | 
				
			||||||
        insert(id, data);
 | 
					        insert(id, data);
 | 
				
			||||||
        Log.d("Adding $id to db");
 | 
					        Log.d("Adding $id to db");
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import '../api/actor_api.dart';
 | 
				
			||||||
import '../api/video_api.dart';
 | 
					import '../api/video_api.dart';
 | 
				
			||||||
import '../dialog/add_actor_dialog.dart';
 | 
					import '../dialog/add_actor_dialog.dart';
 | 
				
			||||||
import '../dialog/add_tag_dialog.dart';
 | 
					import '../dialog/add_tag_dialog.dart';
 | 
				
			||||||
@@ -8,9 +7,6 @@ import '../navigation/video_feed.dart';
 | 
				
			|||||||
import '../screen_loading.dart';
 | 
					import '../screen_loading.dart';
 | 
				
			||||||
import '../types/video_data.dart';
 | 
					import '../types/video_data.dart';
 | 
				
			||||||
import '../preview/actor_tile.dart';
 | 
					import '../preview/actor_tile.dart';
 | 
				
			||||||
 | 
					 | 
				
			||||||
import '../api/api.dart';
 | 
					 | 
				
			||||||
import '../log/log.dart';
 | 
					 | 
				
			||||||
import '../types/actor.dart';
 | 
					import '../types/actor.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class InfoView extends StatefulWidget {
 | 
					class InfoView extends StatefulWidget {
 | 
				
			||||||
@@ -29,7 +25,7 @@ class _InfoViewState extends State<InfoView> {
 | 
				
			|||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
    setState(() {
 | 
					    setState(() {
 | 
				
			||||||
      _data = loadData();
 | 
					      _data = loadActorsOfVideo(widget.videoId);
 | 
				
			||||||
      vdata = loadVideoData(widget.videoId);
 | 
					      vdata = loadVideoData(widget.videoId);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -39,19 +35,6 @@ class _InfoViewState extends State<InfoView> {
 | 
				
			|||||||
    super.didUpdateWidget(oldWidget);
 | 
					    super.didUpdateWidget(oldWidget);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<List<Actor>> loadData() async {
 | 
					 | 
				
			||||||
    final data = await API
 | 
					 | 
				
			||||||
        .query("actor", "getActorsOfVideo", {'MovieId': widget.videoId});
 | 
					 | 
				
			||||||
    if (data == 'null') {
 | 
					 | 
				
			||||||
      return [];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    final d = jsonDecode(data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    List<Actor> dta = (d as List).map((e) => Actor.fromJson(e)).toList();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dta;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return FutureBuilder(
 | 
					    return FutureBuilder(
 | 
				
			||||||
@@ -71,15 +54,10 @@ class _InfoViewState extends State<InfoView> {
 | 
				
			|||||||
                      children: [
 | 
					                      children: [
 | 
				
			||||||
                        IconButton(
 | 
					                        IconButton(
 | 
				
			||||||
                            onPressed: () async {
 | 
					                            onPressed: () async {
 | 
				
			||||||
                              final data = await API.query("video", "addLike",
 | 
					                              if (await addLike(videoData.movieId))
 | 
				
			||||||
                                  {'MovieId': videoData.movieId});
 | 
					                                setState(() {
 | 
				
			||||||
                              final d = jsonDecode(data);
 | 
					                                  vdata = loadVideoData(widget.videoId);
 | 
				
			||||||
                              if (d["result"] != 'success') {
 | 
					                                });
 | 
				
			||||||
                                Log.w(d);
 | 
					 | 
				
			||||||
                              }
 | 
					 | 
				
			||||||
                              setState(() {
 | 
					 | 
				
			||||||
                                vdata = loadVideoData(widget.videoId);
 | 
					 | 
				
			||||||
                              });
 | 
					 | 
				
			||||||
                            },
 | 
					                            },
 | 
				
			||||||
                            icon: Icon(Icons.thumb_up)),
 | 
					                            icon: Icon(Icons.thumb_up)),
 | 
				
			||||||
                        TextButton(
 | 
					                        TextButton(
 | 
				
			||||||
@@ -90,9 +68,8 @@ class _InfoViewState extends State<InfoView> {
 | 
				
			|||||||
                                movieId: videoData.movieId,
 | 
					                                movieId: videoData.movieId,
 | 
				
			||||||
                              ),
 | 
					                              ),
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            Log.d("finished dialog");
 | 
					 | 
				
			||||||
                            setState(() {
 | 
					                            setState(() {
 | 
				
			||||||
                              _data = loadData();
 | 
					                              _data = loadActorsOfVideo(widget.videoId);
 | 
				
			||||||
                            });
 | 
					                            });
 | 
				
			||||||
                          },
 | 
					                          },
 | 
				
			||||||
                          child: Text("Add Actor"),
 | 
					                          child: Text("Add Actor"),
 | 
				
			||||||
@@ -105,7 +82,6 @@ class _InfoViewState extends State<InfoView> {
 | 
				
			|||||||
                                movieId: videoData.movieId,
 | 
					                                movieId: videoData.movieId,
 | 
				
			||||||
                              ),
 | 
					                              ),
 | 
				
			||||||
                            );
 | 
					                            );
 | 
				
			||||||
                            Log.d("finished dialog");
 | 
					 | 
				
			||||||
                            setState(() {
 | 
					                            setState(() {
 | 
				
			||||||
                              vdata = loadVideoData(widget.videoId);
 | 
					                              vdata = loadVideoData(widget.videoId);
 | 
				
			||||||
                            });
 | 
					                            });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,7 +92,7 @@ class _VideoScreenState extends State<VideoScreen> {
 | 
				
			|||||||
              child: GestureDetector(
 | 
					              child: GestureDetector(
 | 
				
			||||||
                onPanDown: (details) async {
 | 
					                onPanDown: (details) async {
 | 
				
			||||||
                  if (_appBarVisible) {
 | 
					                  if (_appBarVisible) {
 | 
				
			||||||
                    await Future.delayed(Duration(milliseconds: 100));
 | 
					                    await Future.delayed(Duration(milliseconds: 300));
 | 
				
			||||||
                    setState(() {
 | 
					                    setState(() {
 | 
				
			||||||
                      _appBarVisible = false;
 | 
					                      _appBarVisible = false;
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user