From 67aca796d9f7e63faa0091f9690a6b71bf69f670 Mon Sep 17 00:00:00 2001 From: Herwig Birke Date: Thu, 21 Nov 2024 09:56:44 +0100 Subject: [PATCH] Movie Search --- lib/widgets/movies/add/add_screen.dart | 156 +++++++++++++++++++------ 1 file changed, 120 insertions(+), 36 deletions(-) diff --git a/lib/widgets/movies/add/add_screen.dart b/lib/widgets/movies/add/add_screen.dart index a150b0b..5c4a47e 100644 --- a/lib/widgets/movies/add/add_screen.dart +++ b/lib/widgets/movies/add/add_screen.dart @@ -1,11 +1,15 @@ +import 'dart:convert'; + import 'package:accordion/accordion.dart'; import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; import 'package:logger/logger.dart'; import 'package:multimedia/data/movies.dart'; import 'package:multimedia/log_printer.dart'; import 'package:multimedia/widgets/checkbox_with_label.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; @@ -25,7 +29,8 @@ class _AddMovieScreenState extends State { String movieTitleSearch = ''; String yearSearch = ''; bool includeAdult = false; - + bool searchGerman = true; + bool searchEnglish = false; List movieList = []; late MovieSearchList movieSearchList; @@ -51,18 +56,18 @@ class _AddMovieScreenState extends State { ), IconButton( icon: const Icon(Icons.check_circle_outline), - tooltip: 'Save changes', + tooltip: 'Add Movie(s)', onPressed: () { - // if (save()) { - // Navigator.pop(context, movieDetails); - // } + if (addMovies()) { + Navigator.pop(context, true); + } }, ), IconButton( icon: const Icon(Icons.highlight_off), - tooltip: 'Revert changes', + tooltip: 'Cancel Add', onPressed: () { - // Navigator.pop(context, null); + Navigator.pop(context, null); }, ), ], @@ -132,8 +137,12 @@ class _AddMovieScreenState extends State { leftIcon: const Icon(Icons.settings, color: Colors.white), header: const Text('Advanced Options', style: headerStyle), content: advancedOptions(), - onOpenSection: () { advancedOptionsOpen = true; }, - onCloseSection: () { advancedOptionsOpen = false; }, + onOpenSection: () { + advancedOptionsOpen = true; + }, + onCloseSection: () { + advancedOptionsOpen = false; + }, ), ], ), @@ -156,14 +165,35 @@ class _AddMovieScreenState extends State { void includeAdultCallback(bool state) { includeAdult = state; - logger.i('Include Adult: ${includeAdult}'); + } + + void searchGermanCallback(bool state) { + searchGerman = state; + } + + void searchEnglishCallback(bool state) { + searchEnglish = state; } Widget advancedOptions() { - return CheckboxWithLabel( - label: 'Include Adult', - callback: includeAdultCallback, - state: includeAdult, + return Row( + children: [ + CheckboxWithLabel( + 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 { return; } - int year = int.tryParse(yearSearch) ?? 0; final tmdb = TMDB.TMDB(TMDB.ApiKeys( 'a33271b9e54cdcb9a80680eaf5522f1b', 'apiReadAccessTokenv4')); - logger.i('IncludeAdult: ${includeAdult}'); final response = await tmdb.v3.search.queryMovies( movieTitleSearch, year: year, includeAdult: includeAdult, - language: 'de', + language: searchGerman == true ? 'de' : 'en', ); List 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 movieIDsTmp = []; + + try { + final response = await http.get(url); +//LATER bool? error; +//LATER String? errorMessage; + + Map 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( () { movieList.clear(); @@ -229,6 +293,7 @@ class _AddMovieScreenState extends State { for (int i = 0; i < movies.length; i++) { dynamic movie = movies[i]; + int movieID = parseInt(movie, 'id'); String movieTitle = parseString(movie, 'title'); String originalTitle = parseString(movie, 'original_title'); String overview = parseString(movie, 'overview'); @@ -237,27 +302,46 @@ class _AddMovieScreenState extends State { double voteAverage = parseDouble(movie, 'vote_average'); int voteCount = parseInt(movie, 'vote_count'); - movieList.add(Movie( - movieID: -1, - movieTitle: movieTitle, - originalTitle: originalTitle, - overview: overview, - releaseDate: releaseDate, - state: 0, - resolution: '', - backdropPath: backdropPath, - languages: '', - productionCountries: '', - productionCompanies: '', - voteAverage: voteAverage, - voteCount: voteCount, - cast: '', - crew: '', - genre: '', - localPath: '', - )); + if (!movieIDsTmp.contains(movieID)) { + movieList.add(Movie( + movieID: movieID, + movieTitle: movieTitle, + originalTitle: originalTitle, + overview: overview, + releaseDate: releaseDate, + state: 0, + resolution: '', + backdropPath: backdropPath, + languages: '', + productionCountries: '', + productionCompanies: '', + voteAverage: voteAverage, + voteCount: voteCount, + cast: '', + crew: '', + 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; + } }