Movie Search

This commit is contained in:
2024-11-21 09:56:44 +01:00
parent 68efd08a8a
commit 67aca796d9
+120 -36
View File
@@ -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;
}
} }