From 0e2d2532c9b6efde0a23e5f40983ab502b80e69d Mon Sep 17 00:00:00 2001 From: Herwig Birke Date: Fri, 6 Nov 2020 14:01:53 +0100 Subject: [PATCH] initial commit --- .../application/serie/seasonData.java | 9 +- .../application/serie/serieData.java | 134 ++++---- .../serie/serieDetailsForwardComposer.java | 2 +- .../serie/serieDetailsSelectorComposer.java | 2 +- .../serie/serieListForwardComposer.java | 286 ++++++++++++------ .../application/serie/serieRenderer.java | 54 +--- .../application/serie/episodeData.class | Bin 0 -> 4527 bytes .../application/serie/seasonData.class | Bin 0 -> 3423 bytes .../application/serie/serieData.class | Bin 13545 -> 13961 bytes .../compile/default-compile/createdFiles.lst | 2 + 10 files changed, 272 insertions(+), 217 deletions(-) create mode 100644 target/classes/at/windesign/application/serie/episodeData.class create mode 100644 target/classes/at/windesign/application/serie/seasonData.class diff --git a/src/main/java/at/windesign/application/serie/seasonData.java b/src/main/java/at/windesign/application/serie/seasonData.java index af70d62..071534f 100644 --- a/src/main/java/at/windesign/application/serie/seasonData.java +++ b/src/main/java/at/windesign/application/serie/seasonData.java @@ -2,18 +2,19 @@ package at.windesign.application.serie; import java.sql.Date; import java.util.SortedMap; +import java.util.TreeMap; public class seasonData { private int m_seasonID; - private int m_season_ID; + private String m_season_ID; private Date m_seasonAirDate; private String m_seasonName; private String m_seasonOverview; private String m_seasonPosterPath; private int m_seasonNumber; private serieData m_serie; - private SortedMap m_episodes; + private SortedMap m_episodes = new TreeMap<>(); public seasonData() { @@ -29,12 +30,12 @@ public class seasonData m_seasonID = seasonID; } - public int getSeason_ID() + public String getSeason_ID() { return m_season_ID; } - public void setSeason_ID(int season_ID) + public void setSeason_ID(String season_ID) { m_season_ID = season_ID; } diff --git a/src/main/java/at/windesign/application/serie/serieData.java b/src/main/java/at/windesign/application/serie/serieData.java index 7603816..bb9746d 100644 --- a/src/main/java/at/windesign/application/serie/serieData.java +++ b/src/main/java/at/windesign/application/serie/serieData.java @@ -3,6 +3,7 @@ package at.windesign.application.serie; import java.sql.*; import java.util.Objects; import java.util.SortedMap; +import java.util.TreeMap; class serieData { @@ -19,7 +20,7 @@ class serieData private int m_seriesNrSeasons; private String m_seriesOriginCountries; private String m_seriesOriginalLanguage; - private int m_seriesPopularity; + private double m_seriesPopularity; private String m_seriesPoster; private String m_seriesProductionCompanies; private String m_seriesType; @@ -40,12 +41,8 @@ class serieData private String m_seriesLocalPath; private String m_seriesResolution; private boolean m_seriesCliffhanger; - private SortedMap m_seasons; + private SortedMap m_seasons = new TreeMap<>(); - private SortedMap m_episodeState; - - private int m_minSeason; - private int m_maxSeason; private int m_stateInit; private int m_stateProg; private int m_stateDone; @@ -54,6 +51,9 @@ class serieData public serieData() { + m_stateInit = 0; + m_stateProg = 0; + m_stateDone = 0; } public int getSeriesID() @@ -186,12 +186,12 @@ class serieData m_seriesOriginalLanguage = seriesOriginalLanguage; } - public int getSeriesPopularity() + public double getSeriesPopularity() { return m_seriesPopularity; } - public void setSeriesPopularity(int seriesPopularity) + public void setSeriesPopularity(double seriesPopularity) { m_seriesPopularity = seriesPopularity; } @@ -411,39 +411,14 @@ class serieData m_seasons.put(season, data); } - public SortedMap getEpisodeState() - { - return m_episodeState; - } - - public void setEpisodeState(SortedMap episodeState) - { - m_episodeState = episodeState; - } - - public void setEpisodeState(int season, int episode, int state) - { - m_episodeState.put(season << 8 + episode, state); - } - public int getMinSeason() { - return m_minSeason; - } - - public void setMinSeason(int minSeason) - { - m_minSeason = minSeason; + return m_seasons.get(m_seasons.firstKey()).getSeasonNumber(); } public int getMaxSeason() { - return m_maxSeason; - } - - public void setMaxSeason(int maxSeason) - { - m_maxSeason = maxSeason; + return m_seasons.get(m_seasons.lastKey()).getSeasonNumber(); } public int getStateInit() @@ -456,6 +431,11 @@ class serieData m_stateInit = stateInit; } + public void addStateInit() + { + m_stateInit++; + } + public int getStateProg() { return m_stateProg; @@ -466,6 +446,11 @@ class serieData m_stateProg = stateProg; } + public void addStateProd() + { + m_stateProg++; + } + public int getStateDone() { return m_stateDone; @@ -476,6 +461,11 @@ class serieData m_stateDone = stateDone; } + public void addStateDone() + { + m_stateDone++; + } + public String getSeriesStyle() { String style = ""; @@ -521,42 +511,42 @@ class serieData { Connection conn = ds.getConnection(); PreparedStatement ps = conn.prepareStatement("INSERT INTO serie (" + - "seriesID, " + - "seriesName, " + - "originalName, " + - "backdropPath, " + - "createdBy, " + - "homepage, " + - "lastAired, " + - "languages, " + - "networks, " + - "nrEpisodes, " + - "nrSeasons, " + - "originCountries, " + - "originalLanguage, " + - "popularity, " + - "posterPath, " + - "productionCompanies, " + - "type, " + - "voteAverage, " + - "voteCount, " + - "overview, " + - "firstAired, " + - "cast, " + - "crew, " + - "genre, " + - "imdbid, " + - "freebasemid, " + - "freebaseid, " + - "tvdbid, " + - "tvrageid, " + - "status, " + - "download, " + - "localPath, " + - "resolution, " + - "cliffhanger" + - ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);" - ); + "seriesID, " + + "seriesName, " + + "originalName, " + + "backdropPath, " + + "createdBy, " + + "homepage, " + + "lastAired, " + + "languages, " + + "networks, " + + "nrEpisodes, " + + "nrSeasons, " + + "originCountries, " + + "originalLanguage, " + + "popularity, " + + "posterPath, " + + "productionCompanies, " + + "type, " + + "voteAverage, " + + "voteCount, " + + "overview, " + + "firstAired, " + + "cast, " + + "crew, " + + "genre, " + + "imdbid, " + + "freebasemid, " + + "freebaseid, " + + "tvdbid, " + + "tvrageid, " + + "status, " + + "download, " + + "localPath, " + + "resolution, " + + "cliffhanger" + + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);" + ); ps.setInt(1, m_seriesID); ps.setString(2, m_seriesName); ps.setString(3, m_seriesOriginalName); @@ -570,7 +560,7 @@ class serieData ps.setInt(11, m_seriesNrSeasons); ps.setString(12, m_seriesOriginCountries); ps.setString(13, m_seriesOriginalLanguage); - ps.setInt(14, m_seriesPopularity); + ps.setDouble(14, m_seriesPopularity); ps.setString(15, m_seriesPoster); ps.setString(16, m_seriesProductionCompanies); ps.setString(17, m_seriesType); diff --git a/src/main/java/at/windesign/application/serie/serieDetailsForwardComposer.java b/src/main/java/at/windesign/application/serie/serieDetailsForwardComposer.java index 669b0c5..4466993 100644 --- a/src/main/java/at/windesign/application/serie/serieDetailsForwardComposer.java +++ b/src/main/java/at/windesign/application/serie/serieDetailsForwardComposer.java @@ -130,7 +130,7 @@ public class serieDetailsForwardComposer extends GenericForwardComposer int episode = Integer.parseInt(id.substring(id.indexOf("_") + 1)); int state = group.getSelectedIndex()+1; - serie.setEpisodeState(season, episode, state); + //serie.setEpisodeState(season, episode, state); } } } diff --git a/src/main/java/at/windesign/application/serie/serieListForwardComposer.java b/src/main/java/at/windesign/application/serie/serieListForwardComposer.java index 384573f..1154069 100644 --- a/src/main/java/at/windesign/application/serie/serieListForwardComposer.java +++ b/src/main/java/at/windesign/application/serie/serieListForwardComposer.java @@ -8,9 +8,7 @@ import org.zkoss.zul.*; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.SortedMap; -import java.util.TimeZone; -import java.util.TreeMap; +import java.util.*; public class serieListForwardComposer extends GenericForwardComposer { @@ -28,6 +26,7 @@ public class serieListForwardComposer extends GenericForwardComposer { super.doAfterCompose(comp); + List serieList = new ArrayList<>(); int minSeason = 0; int maxSeason = 0; SortedMap maxEpisode = new TreeMap<>(); @@ -121,11 +120,25 @@ public class serieListForwardComposer extends GenericForwardComposer " serie.localPath seriesLocalPath," + " serie.resolution seriesResolution," + " serie.cliffhanger seriesCliffhanger," + + " season._id season_ID," + + " IF(IFNULL(season.airDate, '1900-01-01') = '','1900-01-01', IFNULL(season.airDate, '1900-01-01')) seasonAirDate," + + " season.name seasonName," + + " season.overview seasonOverview," + + " season.id seasonID," + + " season.posterPath seasonPosterPath," + " season.seasonNumber seasonNumber," + + " episode.id episodeID," + + " episode.name episodeName," + " episode.episodeNumber episodeNumber," + - " episode.state episodeState," + - " ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," + - " ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" + + " IF(IFNULL(episode.airDate, '1900-01-01') = '','1900-01-01', IFNULL(episode.airDate, '1900-01-01')) episodeAirDate," + + " episode.guestStars episodeGuestStars," + + " episode.overview episodeOverview," + + " episode.productioncode episodeProductionCode," + + " episode.stillPath episodeStillPath," + + " episode.voteAverage episodeVoteAverage," + + " episode.voteCount episodeVoteCount," + + " episode.crew episodeCrew," + + " episode.state episodeState" + " FROM serie" + " LEFT JOIN season ON serie.seriesID = season.seriesID" + " LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" + @@ -138,110 +151,98 @@ public class serieListForwardComposer extends GenericForwardComposer ); // fetch all events from database - serieData serie = new serieData(); - int oldID = -1; - int stateInit = 0; - int stateProg = 0; - int stateDone = 0; - SortedMap episodeState = new TreeMap<>(); + serieData serie = new serieData(); + seasonData season = new seasonData(); + episodeData episode = new episodeData(); + int oldSerieID = -1; + int oldSeasonID = -1; + int oldEpisodeID = -1; serie.setSeriesID(-1); while(rs.next()) { - if(rs.getInt("seriesID") != oldID) - { - if(oldID != -1) - { - serie.setEpisodeState(episodeState); - serie.setStateInit(stateInit); - serie.setStateProg(stateProg); - serie.setStateDone(stateDone); + int serieID = rs.getInt("seriesID"); + int seasonID = rs.getInt("seasonID"); + int episodeID = rs.getInt("episodeID"); - seriesListModel.add(serie); - episodeState = new TreeMap<>(); - stateInit = 0; - stateProg = 0; - stateDone = 0; + if(serieID != oldSerieID) + { + oldSerieID = serieID; + serie = newSerie(rs); + serieList.add(serie); + + oldSeasonID = seasonID; + season = newSeason(rs); + + oldEpisodeID = episodeID; + episode = newEpisode(rs); + + switch(rs.getInt("episodeState")) + { + case 1: + serie.addStateInit(); + break; + case 2: + serie.addStateProd(); + break; + case 3: + serie.addStateDone(); + break; + } + } + else if(seasonID != oldSeasonID) + { + oldSeasonID = seasonID; + season = newSeason(rs); + + oldEpisodeID = episodeID; + episode = newEpisode(rs); + + switch(rs.getInt("episodeState")) + { + case 1: + serie.addStateInit(); + break; + case 2: + serie.addStateProd(); + break; + case 3: + serie.addStateDone(); + break; + } + } + else if(episodeID != oldEpisodeID) + { + oldEpisodeID = episodeID; + episode = newEpisode(rs); + + switch(rs.getInt("episodeState")) + { + case 1: + serie.addStateInit(); + break; + case 2: + serie.addStateProd(); + break; + case 3: + serie.addStateDone(); + break; } - oldID = rs.getInt("seriesID"); - serie = new serieData(); - - serie.setSeriesID(rs.getInt("seriesID")); - serie.setSeriesName(rs.getString("seriesName")); - serie.setSeriesOriginalName(rs.getString("seriesOriginalName")); - serie.setSeriesBackdrop(rs.getString("seriesBackdrop")); - serie.setSeriesCreatedBy(rs.getString("seriesCreatedBy")); - serie.setSeriesHomepage(rs.getString("seriesHomepage")); - serie.setSeriesLastAired(rs.getDate("seriesLastAired")); - serie.setSeriesLanguages(rs.getString("seriesLanguages")); - serie.setSeriesNetworks(rs.getString("seriesNetworks")); - serie.setSeriesNrEpisodes(rs.getInt("seriesNrEpisodes")); - serie.setSeriesNrSeasons(rs.getInt("seriesNrSeasons")); - serie.setSeriesOriginCountries(rs.getString("seriesOriginCountries")); - serie.setSeriesOriginalLanguage(rs.getString("seriesOriginalLanguage")); - serie.setSeriesPopularity(rs.getInt("seriesPopularity")); - serie.setSeriesPoster(rs.getString("seriesPoster")); - serie.setSeriesProductionCompanies(rs.getString("seriesProductionCompanies")); - serie.setSeriesType(rs.getString("seriesType")); - serie.setSeriesVoteAverage(rs.getDouble("seriesVoteAverage")); - serie.setSeriesVoteCount(rs.getInt("seriesVoteCount")); - serie.setSeriesOverview(rs.getString("seriesOverview")); - serie.setSeriesFirstAired(rs.getDate("seriesFirstAired")); - serie.setSeriesCast(rs.getString("seriesCast")); - serie.setSeriesCrew(rs.getString("seriesCrew")); - serie.setSeriesGenre(rs.getString("seriesGenre")); - serie.setSeriesIMDBID(rs.getString("seriesIMDBID")); - serie.setSeriesFreebaseMID(rs.getString("seriesFreebaseMID")); - serie.setSeriesFreebaseID(rs.getString("seriesFreebaseID")); - serie.setSeriesTVDBID(rs.getString("seriesTVDBID")); - serie.setSeriesTVRageID(rs.getString("seriesTVRageID")); - serie.setSeriesStatus(rs.getString("seriesStatus")); - serie.setSeriesDownload(rs.getString("seriesDownload")); - serie.setSeriesLocalPath(rs.getString("seriesLocalPath")); - serie.setSeriesResolution(rs.getString("seriesResolution")); - serie.setSeriesCliffhanger(rs.getBoolean("seriesCliffhanger")); - serie.setMinSeason(rs.getInt("minSeason")); - serie.setMaxSeason(rs.getInt("maxSeason")); + if(season.getSeasonNumber() != 0) + { + if(maxEpisode.get(season.getSeasonNumber()) < episode.getEpisodeNumber()) + maxEpisode.put(season.getSeasonNumber(), episode.getEpisodeNumber()); + } } - episodeState.put((rs.getInt("seasonNumber") << 8) + rs.getInt("episodeNumber"), rs.getInt("episodeState")); - switch(rs.getInt("episodeState")) - { - case 1: - stateInit++; - break; - case 2: - stateProg++; - break; - case 3: - stateDone++; - break; - } - int _seasonNumber = rs.getInt("seasonNumber"); - int _episodeNumber = rs.getInt("episodeNumber"); + season.setSerie(serie); + episode.setSerie(serie); + episode.setSeason(season); - if(_seasonNumber != 0) - { - if(maxEpisode.get(_seasonNumber) < _episodeNumber) - maxEpisode.put(_seasonNumber, _episodeNumber); - } - } - if(serie.getSeriesID() != -1) - { - serie.setEpisodeState(episodeState); - serie.setStateInit(stateInit); - serie.setStateProg(stateProg); - serie.setStateDone(stateDone); - seriesListModel.add(serie); - } - - for(int i = minSeason; i <= maxSeason; i++) - { - int size = maxEpisode.get(i) * stateWidth; - Listheader header = listHeader.get(i); - header.setWidth(size + 40 + "px"); + serie.setSeason(season.getSeasonNumber(), season); + season.setEpisode(episode.getEpisodeNumber(), episode); } } catch(SQLException e) @@ -252,5 +253,92 @@ public class serieListForwardComposer extends GenericForwardComposer { ds.close(); } + + for(serieData serie : serieList) + seriesListModel.add(serie); + + for(int i = minSeason; i <= maxSeason; i++) + { + int size = maxEpisode.get(i) * stateWidth; + Listheader header = listHeader.get(i); + header.setWidth(size + 40 + "px"); + } + } + + protected episodeData newEpisode(ResultSet rs) throws SQLException + { + episodeData episode = new episodeData(); + + episode.setEpisodeID(rs.getInt("episodeID")); + episode.setEpisodeName(rs.getString("episodeName")); + episode.setEpisodeNumber(rs.getInt("episodeNumber")); + episode.setEpisodeAirDate(rs.getDate("episodeAirDate")); + episode.setEpisodeGuestStars(rs.getString("episodeGuestStars")); + episode.setEpisodeOverview(rs.getString("episodeOverview")); + episode.setEpisodeProductionCode(rs.getString("episodeProductionCode")); + episode.setEpisodeStillPath(rs.getString("episodeStillPath")); + episode.setEpisodeVoteAverage(rs.getDouble("episodeVoteAverage")); + episode.setEpisodeVoteCount(rs.getInt("episodeVoteCount")); + episode.setEpisodeCrew(rs.getString("episodeCrew")); + episode.setEpisodeState(rs.getInt("episodeState")); + + return episode; + } + + protected seasonData newSeason(ResultSet rs) throws SQLException + { + seasonData season = new seasonData(); + + season.setSeason_ID(rs.getString("season_ID")); + season.setSeasonAirDate(rs.getDate("seasonAirDate")); + season.setSeasonName(rs.getString("seasonName")); + season.setSeasonOverview(rs.getString("seasonOverview")); + season.setSeasonID(rs.getInt("seasonID")); + season.setSeasonPosterPath(rs.getString("seasonPosterPath")); + season.setSeasonNumber(rs.getInt("seasonNumber")); + + return season; + } + + protected serieData newSerie(ResultSet rs) throws SQLException + { + serieData serie = new serieData(); + + serie.setSeriesID(rs.getInt("seriesID")); + serie.setSeriesName(rs.getString("seriesName")); + serie.setSeriesOriginalName(rs.getString("seriesOriginalName")); + serie.setSeriesBackdrop(rs.getString("seriesBackdrop")); + serie.setSeriesCreatedBy(rs.getString("seriesCreatedBy")); + serie.setSeriesHomepage(rs.getString("seriesHomepage")); + serie.setSeriesLastAired(rs.getDate("seriesLastAired")); + serie.setSeriesLanguages(rs.getString("seriesLanguages")); + serie.setSeriesNetworks(rs.getString("seriesNetworks")); + serie.setSeriesNrEpisodes(rs.getInt("seriesNrEpisodes")); + serie.setSeriesNrSeasons(rs.getInt("seriesNrSeasons")); + serie.setSeriesOriginCountries(rs.getString("seriesOriginCountries")); + serie.setSeriesOriginalLanguage(rs.getString("seriesOriginalLanguage")); + serie.setSeriesPopularity(rs.getDouble("seriesPopularity")); + serie.setSeriesPoster(rs.getString("seriesPoster")); + serie.setSeriesProductionCompanies(rs.getString("seriesProductionCompanies")); + serie.setSeriesType(rs.getString("seriesType")); + serie.setSeriesVoteAverage(rs.getDouble("seriesVoteAverage")); + serie.setSeriesVoteCount(rs.getInt("seriesVoteCount")); + serie.setSeriesOverview(rs.getString("seriesOverview")); + serie.setSeriesFirstAired(rs.getDate("seriesFirstAired")); + serie.setSeriesCast(rs.getString("seriesCast")); + serie.setSeriesCrew(rs.getString("seriesCrew")); + serie.setSeriesGenre(rs.getString("seriesGenre")); + serie.setSeriesIMDBID(rs.getString("seriesIMDBID")); + serie.setSeriesFreebaseMID(rs.getString("seriesFreebaseMID")); + serie.setSeriesFreebaseID(rs.getString("seriesFreebaseID")); + serie.setSeriesTVDBID(rs.getString("seriesTVDBID")); + serie.setSeriesTVRageID(rs.getString("seriesTVRageID")); + serie.setSeriesStatus(rs.getString("seriesStatus")); + serie.setSeriesDownload(rs.getString("seriesDownload")); + serie.setSeriesLocalPath(rs.getString("seriesLocalPath")); + serie.setSeriesResolution(rs.getString("seriesResolution")); + serie.setSeriesCliffhanger(rs.getBoolean("seriesCliffhanger")); + + return serie; } } diff --git a/src/main/java/at/windesign/application/serie/serieRenderer.java b/src/main/java/at/windesign/application/serie/serieRenderer.java index 53615ad..7866519 100644 --- a/src/main/java/at/windesign/application/serie/serieRenderer.java +++ b/src/main/java/at/windesign/application/serie/serieRenderer.java @@ -32,32 +32,19 @@ public class serieRenderer implements ListitemRenderer for(int s = 1; s <= data.getMaxSeason(); s++) { Listcell imageCell = new Listcell(); - imageCell.setImageContent(Images.encode("bla.png", getStateImage(s, data.getEpisodeState()))); + imageCell.setImageContent(Images.encode("bla.png", getStateImage(data.getSeasons().get(s)))); imageCell.setParent(item); - imageCell.setTooltiptext(getStateText(s, data.getEpisodeState())); + imageCell.setTooltiptext(getStateText(data.getSeasons().get(s))); } item.setValue(data); } - private BufferedImage getStateImage(Integer curSeason, SortedMap state) + private BufferedImage getStateImage(seasonData s) { - int season = -1; - int episode = -1; - SortedMap seasonState = new TreeMap<>(); + SortedMap episodes = s.getEpisodes(); - for(int key : state.keySet()) - { - season = key >> 8; - episode = key & 0xFF; - - if(season == curSeason) - seasonState.put(episode, state.get(key)); - else if(season > curSeason) - break; - } - - if(seasonState.size() == 0) + if(episodes.size() == 0) { BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); @@ -68,7 +55,7 @@ public class serieRenderer implements ListitemRenderer return image; } - BufferedImage image = new BufferedImage(stateWidth * seasonState.lastKey(), stateHeight, BufferedImage.TYPE_INT_RGB); + BufferedImage image = new BufferedImage(stateWidth * episodes.lastKey(), stateHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); Color colGrey = new Color(192, 192, 192); Color colBlue = new Color(0, 0, 192); @@ -77,11 +64,11 @@ public class serieRenderer implements ListitemRenderer Color col = colBlack; g2d.setColor(colBlack); - g2d.fillRect(0, 0, stateWidth * seasonState.lastKey(), stateHeight); + g2d.fillRect(0, 0, stateWidth * episodes.lastKey(), stateHeight); - for(Integer key : seasonState.keySet()) + for(Integer key : episodes.keySet()) { - switch(seasonState.get(key)) + switch(episodes.get(key).getEpisodeState()) { case 0: col = colBlack; @@ -104,33 +91,20 @@ public class serieRenderer implements ListitemRenderer return image; } - private String getStateText(Integer curSeason, SortedMap state) + private String getStateText(seasonData s) { - int season = -1; - int episode = -1; - SortedMap seasonState = new TreeMap<>(); + SortedMap episodes = s.getEpisodes(); - for(int key : state.keySet()) - { - season = key >> 8; - episode = key & 0xFF; - - if(season == curSeason) - seasonState.put(episode, state.get(key)); - else if(season > curSeason) - break; - } - - if(seasonState.size() == 0) + if(episodes.size() == 0) return ""; String stateInit = ""; String stateProg = ""; String stateDone = ""; - for(Integer key : seasonState.keySet()) + for(Integer key : episodes.keySet()) { - switch(seasonState.get(key)) + switch(episodes.get(key).getEpisodeState()) { case 0: break; diff --git a/target/classes/at/windesign/application/serie/episodeData.class b/target/classes/at/windesign/application/serie/episodeData.class new file mode 100644 index 0000000000000000000000000000000000000000..cc10abe83c6a080b81bfd39d521efa202f41acad GIT binary patch literal 4527 zcmb7`dsEv+5WrW)JdA~3Ktf(k8k)pB-K0sALPA3gNobuw>V&>ag;9;Dv5751-|4&k zFr8^T1JjxQ(GSoM)#>i(q?0eJfsSW(b*tUm-|g+4{LjCC{S5$D;g^0G0yhDJ&?d1< zVvoe9Bt9eYIf*Ywd`aRf5?_;eO5z(5-;(%_#P=kAAn{`_{L~9S8<5;yvv-_UW5Zrr zFu+(cARSm9w71vorU3)WVr|<71!B;2>=q4j!6aqZsnu32chi8Oz_{9Q?Rm^-RdHIQ!=GLi8|}IqUVX7iWSC!8 z4Do51y_6qQ8Zch6+`^ty->_RwwO+7xc4|(=BJ_gr@Fdp4!dmqC*al1-9!Cq7fju{! zy5r6n(3KxsH6ZSlC0%mrwpWrz)_M(Ta-~Mas;yd0hsM$vcQ+j@`Q%|4PV8GN-vWITAgh=njP9GtE5J~_&UTfhepxkITEA}0SE=pvh@&z1?3 zFlE9p95dlKi4izq!bvz~!fARsL*h9SXX))Z63>%3PqtBb!GsGmyhy`K^puA&6UJcz z@Bc$eEw_nSkW76Fm@p})Dg&6VSQ;ZOWMoOU(RA^)s8gYe2VxbXQXyg_e z(S=5Op>Y91;~Ip!Q=b&k$2<@4QWMs7ToV!B zU?IA6h|?^@D?CJ(4sj*|Vn#yD!cC?U@!z#doMjE%W zXCS(Di1RGOYf$7Mx^;-r2#5u2U4mF-E77AvTwo#Y@RjJ%AudKh+?AEM$3pb#5P242 ziHGRbA;uygUY8JWun>JZ!~_db;vxEUh{*_u`x4>-dpZ*O>6m6Amig0>&>;#D5G(R@ zJY*sIb%@I>#G5=szYcLF0-`J-9JZl=AXX*BTWn95dQV(uA>QVD z!qg#dL_oYFd*WSqFSsXS_(XU9J`DV(T~;$J#QX4p44#25{L!_2=>P_Fh}j5;5AhR4 z_rw~z9VvY~Zm|#_@!OHoA?6|=EV&))>~^H}?YPZCRQT;k>k#u15F2tkY_<{^y%I$h z;$yxN869FF0-`D_u?ddcR`ow%AF_HS?y(SC@QDnb3qIxe0m~|ge)0J(K{wow0IA_$ n6Y7g?s52lr9poVk(tsTfB&UNsMv&DAkSF-xh(Ma+IJEu)?+OYY literal 0 HcmV?d00001 diff --git a/target/classes/at/windesign/application/serie/seasonData.class b/target/classes/at/windesign/application/serie/seasonData.class new file mode 100644 index 0000000000000000000000000000000000000000..27b08055f4c387cfc26fa2068e667e0ff2404c9b GIT binary patch literal 3423 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 literal 13545 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