X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Frhynodge%2Ftriggers%2FNewEpisodeTrigger.java;h=4d9786806a3964b409ccf68f50a85125d9c34798;hb=22e98b8896aa47b397ba89d887bfdbe212850517;hp=f23869d21ff65dfddbb143299f230cdca7cff9ed;hpb=6f69aff66ba5617d0bb27874014b4274bc551ab8;p=rhynodge.git diff --git a/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java b/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java index f23869d..4d97868 100644 --- a/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java +++ b/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java @@ -20,6 +20,8 @@ package net.pterodactylus.rhynodge.triggers; import static com.google.common.base.Preconditions.checkState; import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; import net.pterodactylus.rhynodge.Reaction; import net.pterodactylus.rhynodge.State; @@ -32,8 +34,13 @@ import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile; import org.apache.commons.lang3.StringEscapeUtils; -import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; +import com.google.common.base.Function; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; /** * {@link Trigger} implementation that compares two {@link EpisodeState}s for @@ -43,68 +50,67 @@ import com.google.common.collect.Collections2; */ public class NewEpisodeTrigger implements Trigger { + /** All episodes. */ + private final Collection allEpisodes = Sets.newHashSet(); + /** All new episodes. */ - private Collection newEpisodes; + private final Collection newEpisodes = Sets.newHashSet(); /** All changed episodes. */ - private Collection changedEpisodes; + private final Collection changedEpisodes = Sets.newHashSet(); + + /** All new torrent files. */ + private final Collection newTorrentFiles = Sets.newHashSet(); // // TRIGGER METHODS // /** - * {@inheritDoc} + * {@inheritDocs} */ @Override - public boolean triggers(State currentState, State previousState) { + public State mergeStates(State previousState, State currentState) { checkState(currentState instanceof EpisodeState, "currentState is not a EpisodeState but a %s", currentState.getClass().getName()); checkState(previousState instanceof EpisodeState, "previousState is not a EpisodeState but a %s", currentState.getClass().getName()); - final EpisodeState currentEpisodeState = (EpisodeState) currentState; - final EpisodeState previousEpisodeState = (EpisodeState) previousState; - - newEpisodes = Collections2.filter(currentEpisodeState.episodes(), new Predicate() { + newEpisodes.clear(); + changedEpisodes.clear(); + this.allEpisodes.clear(); + newTorrentFiles.clear(); + Map allEpisodes = Maps.newHashMap(FluentIterable.from(((EpisodeState) previousState).episodes()).toMap(new Function() { @Override - public boolean apply(Episode episode) { - return !previousEpisodeState.episodes().contains(episode); + public Episode apply(Episode episode) { + return episode; } - }); - - changedEpisodes = Collections2.filter(currentEpisodeState.episodes(), new Predicate() { - - @Override - public boolean apply(Episode episode) { - if (!previousEpisodeState.episodes().contains(episode)) { - return false; - } - - /* find previous episode. */ - final Episode previousEpisode = findPreviousEpisode(episode); - - /* compare the list of torrent files. */ - Collection newTorrentFiles = Collections2.filter(episode.torrentFiles(), new Predicate() { - - @Override - public boolean apply(TorrentFile torrentFile) { - return !previousEpisode.torrentFiles().contains(torrentFile); - } - }); - - return !newTorrentFiles.isEmpty(); + })); + for (Episode episode : ((EpisodeState) currentState).episodes()) { + if (!allEpisodes.containsKey(episode)) { + allEpisodes.put(episode, episode); + newEpisodes.add(episode); } - - private Episode findPreviousEpisode(Episode episode) { - for (Episode previousStateEpisode : previousEpisodeState) { - if (previousStateEpisode.equals(episode)) { - return previousStateEpisode; - } + Episode existingEpisode = allEpisodes.get(episode); + for (TorrentFile torrentFile : Lists.newArrayList(episode.torrentFiles())) { + int oldSize = existingEpisode.torrentFiles().size(); + existingEpisode.addTorrentFile(torrentFile); + int newSize = existingEpisode.torrentFiles().size(); + if (oldSize != newSize) { + newTorrentFiles.add(torrentFile); + } + if (!newEpisodes.contains(existingEpisode) && (oldSize != newSize)) { + changedEpisodes.add(existingEpisode); } - return null; } + } + this.allEpisodes.addAll(allEpisodes.values()); + return new EpisodeState(this.allEpisodes); + } - }); - + /** + * {@inheritDoc} + */ + @Override + public boolean triggers() { return !newEpisodes.isEmpty() || !changedEpisodes.isEmpty(); } @@ -124,13 +130,13 @@ public class NewEpisodeTrigger implements Trigger { summary = String.format("%d changed Torrent(s) for “%s!”", changedEpisodes.size(), reaction.name()); } DefaultOutput output = new DefaultOutput(summary); - output.addText("text/plain", generatePlainText(reaction, newEpisodes, changedEpisodes)); - output.addText("text/html", generateHtmlText(reaction, newEpisodes, changedEpisodes)); + output.addText("text/plain", generatePlainText(reaction)); + output.addText("text/html", generateHtmlText(reaction)); return output; } // - // STATIC METHODS + // PRIVATE METHODS // /** @@ -138,13 +144,9 @@ public class NewEpisodeTrigger implements Trigger { * * @param reaction * The reaction that was triggered - * @param newEpisodes - * The new episodes - * @param changedEpisodes - * The changed episodes * @return The plain text output */ - private static String generatePlainText(Reaction reaction, Collection newEpisodes, Collection changedEpisodes) { + private String generatePlainText(Reaction reaction) { StringBuilder stringBuilder = new StringBuilder(); if (!newEpisodes.isEmpty()) { stringBuilder.append(reaction.name()).append(" - New Episodes\n\n"); @@ -152,8 +154,12 @@ public class NewEpisodeTrigger implements Trigger { stringBuilder.append("- ").append(episode.identifier()).append("\n"); for (TorrentFile torrentFile : episode) { stringBuilder.append(" - ").append(torrentFile.name()).append(", ").append(torrentFile.size()).append("\n"); - stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); - stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); + if ((torrentFile.magnetUri() != null) && (torrentFile.magnetUri().length() > 0)) { + stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); + } + if ((torrentFile.downloadUri() != null) && (torrentFile.downloadUri().length() > 0)) { + stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); + } } } } @@ -163,11 +169,36 @@ public class NewEpisodeTrigger implements Trigger { stringBuilder.append("- ").append(episode.identifier()).append("\n"); for (TorrentFile torrentFile : episode) { stringBuilder.append(" - ").append(torrentFile.name()).append(", ").append(torrentFile.size()).append("\n"); - stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); - stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); + if ((torrentFile.magnetUri() != null) && (torrentFile.magnetUri().length() > 0)) { + stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); + } + if ((torrentFile.downloadUri() != null) && (torrentFile.downloadUri().length() > 0)) { + stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); + } + } + } + } + /* list all known episodes. */ + stringBuilder.append(reaction.name()).append(" - All Known Episodes\n\n"); + ImmutableMap> episodesBySeason = FluentIterable.from(allEpisodes).index(new Function() { + + @Override + public Integer apply(Episode episode) { + return episode.season(); + } + }).asMap(); + for (Entry> seasonEntry : episodesBySeason.entrySet()) { + stringBuilder.append(" Season ").append(seasonEntry.getKey()).append("\n\n"); + for (Episode episode : Ordering.natural().sortedCopy(seasonEntry.getValue())) { + stringBuilder.append(" Episode ").append(episode.episode()).append("\n"); + for (TorrentFile torrentFile : episode) { + stringBuilder.append(" Size: ").append(torrentFile.size()); + stringBuilder.append(" in ").append(torrentFile.fileCount()).append(" file(s): "); + stringBuilder.append(torrentFile.magnetUri()); } } } + return stringBuilder.toString(); } @@ -176,56 +207,57 @@ public class NewEpisodeTrigger implements Trigger { * * @param reaction * The reaction that was triggered - * @param newEpisodes - * The new episodes - * @param changedEpisodes - * The changed episodes * @return The HTML output */ - private static String generateHtmlText(Reaction reaction, Collection newEpisodes, Collection changedEpisodes) { + private String generateHtmlText(Reaction reaction) { StringBuilder htmlBuilder = new StringBuilder(); htmlBuilder.append("\n"); - htmlBuilder.append("

").append(StringEscapeUtils.escapeHtml4(reaction.name())).append("

\n"); - if (!newEpisodes.isEmpty()) { - htmlBuilder.append("

New Episodes

\n"); - htmlBuilder.append("
    \n"); - for (Episode episode : newEpisodes) { - htmlBuilder.append("
  • Season ").append(episode.season()).append(", Episode ").append(episode.episode()).append("
  • \n"); - htmlBuilder.append("
      \n"); + /* show all known episodes. */ + htmlBuilder.append("\n\n"); + htmlBuilder.append("\n"); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append("\n"); + htmlBuilder.append("\n"); + htmlBuilder.append("\n"); + Episode lastEpisode = null; + for (Entry> seasonEntry : FluentIterable.from(Ordering.natural().reverse().sortedCopy(allEpisodes)).index(Episode.BY_SEASON).asMap().entrySet()) { + for (Episode episode : seasonEntry.getValue()) { for (TorrentFile torrentFile : episode) { - htmlBuilder.append("
    • ").append(StringEscapeUtils.escapeHtml4(torrentFile.name())).append("
    • \n"); - htmlBuilder.append("
      "); - htmlBuilder.append("").append(StringEscapeUtils.escapeHtml4(torrentFile.size())).append(", "); - htmlBuilder.append("").append(torrentFile.fileCount()).append(" file(s), "); - htmlBuilder.append("").append(torrentFile.seedCount()).append(" seed(s), "); - htmlBuilder.append("").append(torrentFile.leechCount()).append(" leecher(s)
      \n"); - htmlBuilder.append("
      Magnet "); - htmlBuilder.append("Download
      \n"); - } - htmlBuilder.append("\n"); - } - htmlBuilder.append("\n"); - } - if (!changedEpisodes.isEmpty()) { - htmlBuilder.append("

      Changed Episodes

      \n"); - htmlBuilder.append("
        \n"); - for (Episode episode : changedEpisodes) { - htmlBuilder.append("
      • Season ").append(episode.season()).append(", Episode ").append(episode.episode()).append("
      • \n"); - htmlBuilder.append("
          \n"); - for (TorrentFile torrentFile : episode) { - htmlBuilder.append("
        • ").append(StringEscapeUtils.escapeHtml4(torrentFile.name())).append("
        • \n"); - htmlBuilder.append("
          "); - htmlBuilder.append("").append(StringEscapeUtils.escapeHtml4(torrentFile.size())).append(", "); - htmlBuilder.append("").append(torrentFile.fileCount()).append(" file(s), "); - htmlBuilder.append("").append(torrentFile.seedCount()).append(" seed(s), "); - htmlBuilder.append("").append(torrentFile.leechCount()).append(" leecher(s)
          \n"); - htmlBuilder.append("
          Magnet "); - htmlBuilder.append("Download
          \n"); + if (newEpisodes.contains(episode)) { + htmlBuilder.append("
      "); + } else if (newTorrentFiles.contains(torrentFile)) { + htmlBuilder.append(""); + } else { + htmlBuilder.append(""); + } + if ((lastEpisode == null) || !lastEpisode.equals(episode)) { + htmlBuilder.append(""); + } else { + htmlBuilder.append(""); + } + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append(""); + htmlBuilder.append("\n"); + lastEpisode = episode; } - htmlBuilder.append("\n"); } - htmlBuilder.append("\n"); } + htmlBuilder.append("\n"); + htmlBuilder.append("
      All Known Episodes
      SeasonEpisodeFilenameSizeFile(s)SeedsLeechersMagnetDownload
      ").append(episode.season()).append("").append(episode.episode()).append("").append(StringEscapeUtils.escapeHtml4(torrentFile.name())).append("").append(StringEscapeUtils.escapeHtml4(torrentFile.size())).append("").append(torrentFile.fileCount()).append("").append(torrentFile.seedCount()).append("").append(torrentFile.leechCount()).append("LinkLink
      \n"); htmlBuilder.append("\n"); return htmlBuilder.toString(); }