diff --git a/lib/data/tvshows.dart b/lib/data/tvshows.dart index ff410f3..7e68182 100644 --- a/lib/data/tvshows.dart +++ b/lib/data/tvshows.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:intl/intl.dart'; import 'package:flutter/material.dart'; @@ -37,6 +39,13 @@ class Season { seasonID: int.parse(json['seasonID']), state: json['state']); } + + Map toJson() => + { + 'seasonNumber': seasonNumber.toString(), + 'seasonID': seasonID.toString(), + 'state': state, + }; } class TVShow { diff --git a/lib/widgets/tvshows/details/detailsScreen.dart b/lib/widgets/tvshows/details/detailsScreen.dart index 0d2083d..7affa1f 100644 --- a/lib/widgets/tvshows/details/detailsScreen.dart +++ b/lib/widgets/tvshows/details/detailsScreen.dart @@ -337,6 +337,58 @@ class TVShowDetailsScreen extends StatelessWidget { } Future updateTVShow() async { + 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, + ); + + var seasonState = jsonEncode(tvShowDetails.seasonStatus.map((e) => e.toJson()).toList()); + + try { + final r = await http.post( + url, + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode( + { + 'module': 'tvshow', + 'function': 'update', + 'seriesID': tvShowDetails.seriesID.toString(), + 'seriesName': tvShowDetails.seriesName, + 'overview': tvShowDetails.overview, + 'firstAired': + DateFormat('yyyy-MM-dd').format(tvShowDetails.firstAired), + 'resolution': tvShowDetails.resolution, + 'cliffhanger': tvShowDetails.cliffhanger.toString(), + 'status': tvShowDetails.status.toString(), + 'backdropPath': tvShowDetails.backdropPath, + 'seriesState': tvShowDetails.seriesState.toString(), + 'languages': tvShowDetails.languages, + 'networks': tvShowDetails.networks, + 'productionCompanies': tvShowDetails.productionCompanies, + 'voteAverage': tvShowDetails.voteAverage.toString(), + 'voteCount': tvShowDetails.voteCount.toString(), + 'cast': tvShowDetails.cast, + 'crew': tvShowDetails.crew, + 'genre': tvShowDetails.genre, + 'download': tvShowDetails.download, + 'localPath': tvShowDetails.localPath, + 'seasons': seasonState, + }, + ), + ); + } catch (e) { + print(e.toString()); + } + return true; } @@ -351,8 +403,34 @@ class TVShowDetailsScreen extends StatelessWidget { void stateChanged(List seasonStatus) { tvShowDetails.seasonStatus = seasonStatus; - for (var s in tvShowDetails.seasonStatus) { - print('Season: ${s.seasonNumber}, State: ${s.state}'); + bool hasInit = false; + bool hasProg = false; + bool hasDone = false; + + for (var season in tvShowDetails.seasonStatus) { + var episodeList = season.state.split(','); + + for (var s in episodeList) { + var states = s.split('|'); + + if (states[1] == '1') { + hasInit = true; + } + if (states[1] == '2') { + hasProg = true; + } + if (states[1] == '3') { + hasDone = true; + } + } + } + + if (hasProg) { + tvShowDetails.seriesState = 2; + } else if (hasInit) { + tvShowDetails.seriesState = 1; + } else if (hasDone) { + tvShowDetails.seriesState = 3; } } diff --git a/lib/widgets/tvshows/details/seasons.dart b/lib/widgets/tvshows/details/seasons.dart index a0fb0b5..5d84563 100644 --- a/lib/widgets/tvshows/details/seasons.dart +++ b/lib/widgets/tvshows/details/seasons.dart @@ -16,7 +16,6 @@ class TVShowDetailsSeasons extends StatefulWidget { final Function(List) stateChanged; void stateChanged1(int seasonNumber, String state) { - print('start stateChanged1 in seasons ...'); for (int seasonID = 0; seasonID < seasonStatus.length; seasonID++) { if (seasonStatus[seasonID].seasonNumber == seasonNumber) { seasonStatus[seasonID].state = state; diff --git a/lib/widgets/tvshows/listScreen.dart b/lib/widgets/tvshows/listScreen.dart index ed77be0..b193aa2 100644 --- a/lib/widgets/tvshows/listScreen.dart +++ b/lib/widgets/tvshows/listScreen.dart @@ -15,6 +15,54 @@ import 'package:multimedia/data/tvshows.dart'; import 'package:multimedia/constants.dart'; + +String convertState(String state) { + List stateList = state.split(','); + int maxEpisode = 0; + Map stateListMap = {}; + + for (var x = 0; x < stateList.length; x++) { + List tmp = stateList[x].split('|'); + stateListMap[tmp[0]] = tmp[1]; + + int episode = int.parse(tmp[0]); + if (episode > maxEpisode) { + maxEpisode = episode; + } + } + + String stateString = ""; + + for (int x = 0; x < maxEpisode; x++) { + String s = '0'; + int key = x + 1; + + if (stateListMap.containsKey('$key')) { + s = stateListMap['$key']; + } + + stateString = stateString + s; + } + + return stateString; +} + +List setSeasonData(int maxSeason, List seasonList) { + List dataGridCell = []; + int length = seasonList.length; + + for (int x = 1; x <= maxSeason; x++) { + String status = ''; + + if (x <= length) { + status = convertState(seasonList[x - 1].state); + } + dataGridCell.add(DataGridCell(columnName: 'season$x', value: status)); + } + + return dataGridCell; +} + class TVShowsScreen extends StatefulWidget { const TVShowsScreen({ super.key, @@ -195,7 +243,7 @@ class _TVShowsScreenState extends State { _columns = getColumns(); } - void showTVShowDetails(int index) { + Future showTVShowDetails(int index) async { List> cells = tvshowDataSource.effectiveRows.elementAt(index).getCells(); @@ -211,11 +259,43 @@ class _TVShowsScreenState extends State { } if (found) { - Navigator.push( + final t = await Navigator.push( context, MaterialPageRoute( builder: (ctx) => TVShowDetailsScreen(tvShow: _tvshowsList[tvShowIndex]))); + + if (t != null) { + _tvshowsList[tvShowIndex].seriesName = t.seriesName; + _tvshowsList[tvShowIndex].download = t.download; + _tvshowsList[tvShowIndex].localPath = t.localPath; + _tvshowsList[tvShowIndex].resolution = t.resolution; + _tvshowsList[tvShowIndex].cliffhanger = t.cliffhanger; + _tvshowsList[tvShowIndex].seasonStatus = t.seasonStatus; + _tvshowsList[tvShowIndex].seriesState = t.seriesState; + TVShow e = _tvshowsList[tvShowIndex]; + + tvshowDataSource._tvshowDataGridRows[index] = DataGridRow(cells: [ + DataGridCell(columnName: 'seriesID', value: e.seriesID), + DataGridCell(columnName: 'seriesState', value: e.seriesState), + DataGridCell(columnName: 'status', value: e.status), + DataGridCell(columnName: 'cliffhanger', value: e.cliffhanger), + DataGridCell( + columnName: 'backdropPath', value: e.backdropPath), + DataGridCell(columnName: 'overview', value: e.overview), + DataGridCell(columnName: 'seriesName', value: e.seriesName), + DataGridCell( + columnName: 'firstAired', + value: DateFormat('yyyy-MM-dd').format(e.firstAired)), + DataGridCell(columnName: 'resolution', value: e.resolution), + ...setSeasonData(maxSeason, e.seasonStatus), + ]); + + for (int i = 0;i < _columns.length;i++) { + tvshowDataSource.updateDataGridSource( + rowColumnIndex: RowColumnIndex(index, i)); + } + } else {} } } @@ -275,53 +355,6 @@ class TVShowDataSource extends DataGridSource { buildDataGridRow(); } - String convertState(String state) { - List stateList = state.split(','); - int maxEpisode = 0; - Map stateListMap = {}; - - for (var x = 0; x < stateList.length; x++) { - List tmp = stateList[x].split('|'); - stateListMap[tmp[0]] = tmp[1]; - - int episode = int.parse(tmp[0]); - if (episode > maxEpisode) { - maxEpisode = episode; - } - } - - String stateString = ""; - - for (int x = 0; x < maxEpisode; x++) { - String s = '0'; - int key = x + 1; - - if (stateListMap.containsKey('$key')) { - s = stateListMap['$key']; - } - - stateString = stateString + s; - } - - return stateString; - } - - List setSeasonData(int maxSeason, List seasonList) { - List dataGridCell = []; - int length = seasonList.length; - - for (int x = 1; x <= maxSeason; x++) { - String status = ''; - - if (x <= length) { - status = convertState(seasonList[x - 1].state); - } - dataGridCell.add(DataGridCell(columnName: 'season$x', value: status)); - } - - return dataGridCell; - } - void buildDataGridRow() { _tvshowDataGridRows = tvshows .map((e) => DataGridRow(cells: [ @@ -466,4 +499,8 @@ class TVShowDataSource extends DataGridSource { void updateDataGrid() { notifyListeners(); } + + void updateDataGridSource({required RowColumnIndex rowColumnIndex}) { + notifyDataSourceListeners(rowColumnIndex: rowColumnIndex); + } }