Movie Search
This commit is contained in:
@@ -1,11 +1,15 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:accordion/accordion.dart';
|
import 'package:accordion/accordion.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
import 'package:multimedia/data/movies.dart';
|
import 'package:multimedia/data/movies.dart';
|
||||||
import 'package:multimedia/log_printer.dart';
|
import 'package:multimedia/log_printer.dart';
|
||||||
import 'package:multimedia/widgets/checkbox_with_label.dart';
|
import 'package:multimedia/widgets/checkbox_with_label.dart';
|
||||||
import 'package:multimedia/widgets/movies/add/movie_search_list.dart';
|
import 'package:multimedia/widgets/movies/add/movie_search_list.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
import 'package:tmdb_api/tmdb_api.dart' as TMDB;
|
import 'package:tmdb_api/tmdb_api.dart' as TMDB;
|
||||||
|
|
||||||
@@ -25,7 +29,8 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
String movieTitleSearch = '';
|
String movieTitleSearch = '';
|
||||||
String yearSearch = '';
|
String yearSearch = '';
|
||||||
bool includeAdult = false;
|
bool includeAdult = false;
|
||||||
|
bool searchGerman = true;
|
||||||
|
bool searchEnglish = false;
|
||||||
List<Movie> movieList = [];
|
List<Movie> movieList = [];
|
||||||
|
|
||||||
late MovieSearchList movieSearchList;
|
late MovieSearchList movieSearchList;
|
||||||
@@ -51,18 +56,18 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.check_circle_outline),
|
icon: const Icon(Icons.check_circle_outline),
|
||||||
tooltip: 'Save changes',
|
tooltip: 'Add Movie(s)',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
// if (save()) {
|
if (addMovies()) {
|
||||||
// Navigator.pop(context, movieDetails);
|
Navigator.pop(context, true);
|
||||||
// }
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.highlight_off),
|
icon: const Icon(Icons.highlight_off),
|
||||||
tooltip: 'Revert changes',
|
tooltip: 'Cancel Add',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
// Navigator.pop(context, null);
|
Navigator.pop(context, null);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -132,8 +137,12 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
leftIcon: const Icon(Icons.settings, color: Colors.white),
|
leftIcon: const Icon(Icons.settings, color: Colors.white),
|
||||||
header: const Text('Advanced Options', style: headerStyle),
|
header: const Text('Advanced Options', style: headerStyle),
|
||||||
content: advancedOptions(),
|
content: advancedOptions(),
|
||||||
onOpenSection: () { advancedOptionsOpen = true; },
|
onOpenSection: () {
|
||||||
onCloseSection: () { advancedOptionsOpen = false; },
|
advancedOptionsOpen = true;
|
||||||
|
},
|
||||||
|
onCloseSection: () {
|
||||||
|
advancedOptionsOpen = false;
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -156,14 +165,35 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
|
|
||||||
void includeAdultCallback(bool state) {
|
void includeAdultCallback(bool state) {
|
||||||
includeAdult = state;
|
includeAdult = state;
|
||||||
logger.i('Include Adult: ${includeAdult}');
|
}
|
||||||
|
|
||||||
|
void searchGermanCallback(bool state) {
|
||||||
|
searchGerman = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void searchEnglishCallback(bool state) {
|
||||||
|
searchEnglish = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget advancedOptions() {
|
Widget advancedOptions() {
|
||||||
return CheckboxWithLabel(
|
return Row(
|
||||||
label: 'Include Adult',
|
children: [
|
||||||
callback: includeAdultCallback,
|
CheckboxWithLabel(
|
||||||
state: includeAdult,
|
label: 'Include Adult',
|
||||||
|
callback: includeAdultCallback,
|
||||||
|
state: includeAdult,
|
||||||
|
),
|
||||||
|
CheckboxWithLabel(
|
||||||
|
label: 'German',
|
||||||
|
callback: searchGermanCallback,
|
||||||
|
state: searchGerman,
|
||||||
|
),
|
||||||
|
CheckboxWithLabel(
|
||||||
|
label: 'English',
|
||||||
|
callback: searchEnglishCallback,
|
||||||
|
state: searchEnglish,
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,21 +237,55 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int year = int.tryParse(yearSearch) ?? 0;
|
int year = int.tryParse(yearSearch) ?? 0;
|
||||||
|
|
||||||
final tmdb = TMDB.TMDB(TMDB.ApiKeys(
|
final tmdb = TMDB.TMDB(TMDB.ApiKeys(
|
||||||
'a33271b9e54cdcb9a80680eaf5522f1b', 'apiReadAccessTokenv4'));
|
'a33271b9e54cdcb9a80680eaf5522f1b', 'apiReadAccessTokenv4'));
|
||||||
|
|
||||||
logger.i('IncludeAdult: ${includeAdult}');
|
|
||||||
final response = await tmdb.v3.search.queryMovies(
|
final response = await tmdb.v3.search.queryMovies(
|
||||||
movieTitleSearch,
|
movieTitleSearch,
|
||||||
year: year,
|
year: year,
|
||||||
includeAdult: includeAdult,
|
includeAdult: includeAdult,
|
||||||
language: 'de',
|
language: searchGerman == true ? 'de' : 'en',
|
||||||
);
|
);
|
||||||
List<dynamic> movies = response['results'];
|
List<dynamic> movies = response['results'];
|
||||||
|
|
||||||
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
|
||||||
|
String? dbProtocol = prefs.getString('dbProtocol');
|
||||||
|
String? dbHost = prefs.getString('dbHost');
|
||||||
|
String? dbPath = prefs.getString('dbPath');
|
||||||
|
|
||||||
|
Uri url = Uri(
|
||||||
|
scheme: dbProtocol,
|
||||||
|
host: dbHost,
|
||||||
|
path: dbPath,
|
||||||
|
queryParameters: {
|
||||||
|
'module': 'movie',
|
||||||
|
'function': 'getIDs',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
List<int> movieIDsTmp = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
final response = await http.get(url);
|
||||||
|
//LATER bool? error;
|
||||||
|
//LATER String? errorMessage;
|
||||||
|
|
||||||
|
Map<String, dynamic> movieIDs = json.decode(response.body);
|
||||||
|
//LATER error = movies['error'];
|
||||||
|
//LATER errorMessage = movies['errmsg'];
|
||||||
|
var list = movieIDs['data'];
|
||||||
|
|
||||||
|
for (int i = 0; i < list.length; i++) {
|
||||||
|
var entry = list[i];
|
||||||
|
movieIDsTmp.add(int.tryParse(entry['movieID'].toString()) ?? 0);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print(e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
setState(
|
setState(
|
||||||
() {
|
() {
|
||||||
movieList.clear();
|
movieList.clear();
|
||||||
@@ -229,6 +293,7 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
for (int i = 0; i < movies.length; i++) {
|
for (int i = 0; i < movies.length; i++) {
|
||||||
dynamic movie = movies[i];
|
dynamic movie = movies[i];
|
||||||
|
|
||||||
|
int movieID = parseInt(movie, 'id');
|
||||||
String movieTitle = parseString(movie, 'title');
|
String movieTitle = parseString(movie, 'title');
|
||||||
String originalTitle = parseString(movie, 'original_title');
|
String originalTitle = parseString(movie, 'original_title');
|
||||||
String overview = parseString(movie, 'overview');
|
String overview = parseString(movie, 'overview');
|
||||||
@@ -237,27 +302,46 @@ class _AddMovieScreenState extends State<AddMovieScreen> {
|
|||||||
double voteAverage = parseDouble(movie, 'vote_average');
|
double voteAverage = parseDouble(movie, 'vote_average');
|
||||||
int voteCount = parseInt(movie, 'vote_count');
|
int voteCount = parseInt(movie, 'vote_count');
|
||||||
|
|
||||||
movieList.add(Movie(
|
if (!movieIDsTmp.contains(movieID)) {
|
||||||
movieID: -1,
|
movieList.add(Movie(
|
||||||
movieTitle: movieTitle,
|
movieID: movieID,
|
||||||
originalTitle: originalTitle,
|
movieTitle: movieTitle,
|
||||||
overview: overview,
|
originalTitle: originalTitle,
|
||||||
releaseDate: releaseDate,
|
overview: overview,
|
||||||
state: 0,
|
releaseDate: releaseDate,
|
||||||
resolution: '',
|
state: 0,
|
||||||
backdropPath: backdropPath,
|
resolution: '',
|
||||||
languages: '',
|
backdropPath: backdropPath,
|
||||||
productionCountries: '',
|
languages: '',
|
||||||
productionCompanies: '',
|
productionCountries: '',
|
||||||
voteAverage: voteAverage,
|
productionCompanies: '',
|
||||||
voteCount: voteCount,
|
voteAverage: voteAverage,
|
||||||
cast: '',
|
voteCount: voteCount,
|
||||||
crew: '',
|
cast: '',
|
||||||
genre: '',
|
crew: '',
|
||||||
localPath: '',
|
genre: '',
|
||||||
));
|
localPath: '',
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool addMovies() {
|
||||||
|
int cnt = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < movieList.length; i++) {
|
||||||
|
Movie movie = movieList[i];
|
||||||
|
if (movie.state == 1) {
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cnt == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user