001package net.filebot.web; 002 003import java.util.Arrays; 004import java.util.Collection; 005import java.util.Iterator; 006import java.util.List; 007import java.util.stream.Stream; 008 009public class MultiEpisode extends Episode implements Iterable<Episode> { 010 011 protected Episode[] episodes; 012 013 public MultiEpisode() { 014 // used by deserializer 015 } 016 017 public MultiEpisode(Episode... episodes) { 018 this.episodes = episodes.clone(); 019 } 020 021 public MultiEpisode(Collection<Episode> episodes) { 022 this.episodes = episodes.toArray(new Episode[0]); 023 } 024 025 public Episode[] getEpisodes() { 026 return episodes.clone(); 027 } 028 029 public int count() { 030 return episodes.length; 031 } 032 033 public Episode getFirst() { 034 return episodes[0]; 035 } 036 037 public Stream<Episode> stream() { 038 return Arrays.stream(episodes); 039 } 040 041 @Override 042 public Iterator<Episode> iterator() { 043 return stream().iterator(); 044 } 045 046 @Override 047 public String getSeriesName() { 048 return getFirst().getSeriesName(); 049 } 050 051 @Override 052 public Integer getEpisode() { 053 return getFirst().getEpisode(); 054 } 055 056 @Override 057 public Integer getSeason() { 058 return getFirst().getSeason(); 059 } 060 061 @Override 062 public String getTitle() { 063 return EpisodeFormat.DEFAULT.formatMultiTitle(episodes); 064 } 065 066 @Override 067 public Integer getAbsolute() { 068 return getFirst().getAbsolute(); 069 } 070 071 @Override 072 public Integer getSpecial() { 073 return getFirst().getSpecial(); 074 } 075 076 @Override 077 public SimpleDate getAirdate() { 078 return getFirst().getAirdate(); 079 } 080 081 @Override 082 public Integer getId() { 083 return getFirst().getId(); 084 } 085 086 @Override 087 public SeriesInfo getSeriesInfo() { 088 return getFirst().getSeriesInfo(); 089 } 090 091 @Override 092 public List<String> getSeriesNames() { 093 return getFirst().getSeriesNames(); 094 } 095 096 @Override 097 public boolean equals(Object obj) { 098 if (obj instanceof MultiEpisode) { 099 MultiEpisode other = (MultiEpisode) obj; 100 return Arrays.equals(episodes, other.episodes); 101 } 102 return false; 103 } 104 105 @Override 106 public int hashCode() { 107 return Arrays.hashCode(episodes); 108 } 109 110 @Override 111 public MultiEpisode clone() { 112 return new MultiEpisode(episodes); 113 } 114 115 @Override 116 public MultiEpisode derive(String seriesName, Integer season, Integer episode, String title, Integer absolute, SimpleDate airdate) { 117 Episode[] m = new Episode[episodes.length]; 118 for (int i = 0; i < episodes.length; i++) { 119 m[i] = episodes[i].derive(seriesName, season, up(episode, i), title, up(absolute, i), airdate); 120 } 121 return new MultiEpisode(m); 122 } 123 124 private Integer up(Integer i, int delta) { 125 return i == null ? null : i + delta; 126 } 127 128 @Override 129 public String toString() { 130 return EpisodeFormat.DEFAULT.formatMultiEpisode(episodes); 131 } 132 133}