diff --git a/build.gradle b/build.gradle index 354525291..dda765aa1 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ import org.apache.tools.ant.filters.ReplaceTokens sourceCompatibility = 1.8 targetCompatibility = 1.8 group = 'de.mediathekview' -version = '2.5.2' +version = '2.5.3' def jarName = 'MServer.jar' def mainClass = 'mServer.Main' diff --git a/src/main/java/mServer/crawler/AddToFilmlist.java b/src/main/java/mServer/crawler/AddToFilmlist.java index 2a3b2fd00..cc935ea32 100644 --- a/src/main/java/mServer/crawler/AddToFilmlist.java +++ b/src/main/java/mServer/crawler/AddToFilmlist.java @@ -5,35 +5,29 @@ */ package mServer.crawler; +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Iterator; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.stream.Collectors; import java.util.concurrent.atomic.AtomicInteger; - import mSearch.Config; import mSearch.daten.DatenFilm; import mSearch.daten.ListeFilme; +import mSearch.tool.Duration; import mSearch.tool.FileSize; import mSearch.tool.Log; - - /** * * @author emil */ public class AddToFilmlist { - - private static final int MIN_SIZE_ADD_OLD = 5; - final int COUNTER_MAX = 20; - int counter = 0; + AtomicInteger threadCounter = new AtomicInteger(0); AtomicInteger treffer = new AtomicInteger(0); ListeFilme vonListe; ListeFilme listeEinsortieren; + Collection filteredOnline = new ArrayList<>(); public AddToFilmlist(ListeFilme vonListe, ListeFilme listeEinsortieren) { this.vonListe = vonListe; @@ -61,68 +55,114 @@ public synchronized void addLiveStream() { public synchronized int addOldList() { // in eine vorhandene Liste soll eine andere Filmliste einsortiert werden // es werden nur Filme die noch nicht vorhanden sind, einsortiert - counter = 0; + threadCounter = new AtomicInteger(0); treffer = new AtomicInteger(0); + int size = listeEinsortieren.size(); + HashSet hash = new HashSet<>(listeEinsortieren.size() + 1, 1); + + Duration.staticPing("AddOld-1"); // ============================================== // nach "Thema-Titel" suchen - Collection filteredTopicTitle = new CopyOnWriteArrayList<>(); - filteredTopicTitle.addAll(listeEinsortieren.parallelStream() - .filter(film -> (null == vonListe.istInFilmListe(film.arr[DatenFilm.FILM_SENDER], film.arr[DatenFilm.FILM_THEMA], film.arr[DatenFilm.FILM_TITEL]))) - .collect(Collectors.toList())); - + vonListe.stream().forEach((f) -> hash.add(f.getIndexAddOld())); + listeEinsortieren.removeIf((f) -> hash.contains(f.getIndexAddOld())); + hash.clear(); + Log.sysLog("===== Liste einsortieren Hash ====="); - Log.sysLog("Liste einsortieren, Anzahl: " + listeEinsortieren.size()); - Log.sysLog("Liste einsortieren, entfernt: " + (listeEinsortieren.size() - filteredTopicTitle.size())); + Log.sysLog("Liste einsortieren, Anzahl: " + size); + Log.sysLog("Liste einsortieren, entfernt: " + (size - listeEinsortieren.size())); + Log.sysLog("Liste einsortieren, noch einsortieren: " + listeEinsortieren.size()); Log.sysLog(""); + size = listeEinsortieren.size(); // ============================================== // nach "URL" suchen - Collection filteredUrl = new CopyOnWriteArrayList<>(); - - Collection filmUrls = vonListe.parallelStream() - .map(DatenFilm::getUrl) - .collect(Collectors.toList()); - - int size = filteredTopicTitle.size(); - - filteredUrl.addAll(filteredTopicTitle.parallelStream() - .filter(film -> !filmUrls.contains(DatenFilm.getUrl(film))) - .collect(Collectors.toList())); + vonListe.stream().forEach((f) -> hash.add(DatenFilm.getUrl(f))); + listeEinsortieren.removeIf((f) -> hash.contains(DatenFilm.getUrl(f))); + hash.clear(); Log.sysLog("===== Liste einsortieren URL ====="); Log.sysLog("Liste einsortieren, Anzahl: " + size); - Log.sysLog("Liste einsortieren, entfernt: " + (size - filteredUrl.size())); + Log.sysLog("Liste einsortieren, entfernt: " + (size - listeEinsortieren.size())); + Log.sysLog("Liste einsortieren, noch einsortieren: " + listeEinsortieren.size()); Log.sysLog(""); + Duration.staticPing("AddOld-2"); + + int count = 0; + final int MAX_THREAD = 30; + final int MAX_WAIT_TIME = 450; // 450*2=900s -> 15 Minuten + //final int MAX_WAIT_TIME = 10; // 10*2=20s + stopOld = false; + size = listeEinsortieren.size(); + // Rest nehmen wir wenn noch online - // Prüfung auf online erst am Ende durchführen, damit jeder Film nur einmalig geprüft wird - Collection filteredOnline = new CopyOnWriteArrayList<>(); - filteredOnline.addAll(filteredUrl.parallelStream().filter(f -> - !Config.getStop() && FileSize.laengeLong(f.arr[DatenFilm.FILM_URL]) > MIN_SIZE_ADD_OLD - ) - .collect(Collectors.toList())); - filteredOnline.parallelStream().forEach(f ->{ - if(!Config.getStop()) - { - initFilm(f); + for (int i = 0; i < MAX_THREAD; ++i) { + new Thread(new AddOld(listeEinsortieren)).start(); + } + + while (!Config.getStop() && threadCounter.get() > 0) { + try { + System.out.println("sek.: " + 2 * (count++) + " Liste: " + listeEinsortieren.size() + " Treffer: " + treffer.get() + " Threads: " + threadCounter); + if (count > MAX_WAIT_TIME) { + // dann haben wir mehr als 10 Minuten und: Stop + Log.sysLog("===== Liste einsortieren: ABBRUCH ====="); + Log.sysLog("COUNT_MAX erreicht [s]: " + MAX_WAIT_TIME * 2); + Log.sysLog(""); + stopOld = true; + } + wait(2000); + } catch (Exception ex) { + Log.errorLog(978451205, ex, "Fehler beim Import Old"); } - }); + } + vonListe.addAll(filteredOnline); - - + Log.sysLog("===== Liste einsortieren: Noch online ====="); - Log.sysLog("Liste einsortieren, Anzahl: " + filteredOnline.size()); - Log.sysLog("Liste einsortieren, entfernt: " + (filteredOnline.size() - treffer.get())); + Log.sysLog("Liste einsortieren, Anzahl: " + size); + Log.sysLog("Liste einsortieren, entfernt: " + (size - treffer.get())); Log.sysLog(""); Log.sysLog("In Liste einsortiert: " + treffer.get()); Log.sysLog(""); return treffer.get(); } - private void initFilm(DatenFilm film) { + private boolean stopOld = false; + + private class AddOld implements Runnable { + + private DatenFilm film; + private final ListeFilme listeOld; + private final int MIN_SIZE_ADD_OLD = 5; //REST eh nur Trailer + + public AddOld(ListeFilme listeOld) { + this.listeOld = listeOld; + threadCounter.incrementAndGet(); + } + + @Override + public void run() { + while (!stopOld && (film = popOld(listeOld)) != null) { + long size = FileSize.laengeLong(film.arr[DatenFilm.FILM_URL]); + if (size > MIN_SIZE_ADD_OLD) { + addOld(film); + } + } + threadCounter.decrementAndGet(); + } + } + + private synchronized DatenFilm popOld(ListeFilme listeOld) { + if (listeOld.size() > 0) { + return listeOld.remove(0); + } + return null; + } + + private synchronized boolean addOld(DatenFilm film) { treffer.getAndIncrement(); film.init(); + return filteredOnline.add(film); } - } diff --git a/src/main/java/mServer/search/MserverSearch.java b/src/main/java/mServer/search/MserverSearch.java index 84e03b763..d072ffc7f 100644 --- a/src/main/java/mServer/search/MserverSearch.java +++ b/src/main/java/mServer/search/MserverSearch.java @@ -26,6 +26,7 @@ import mSearch.tool.Log; import mServer.crawler.Crawler; import mServer.crawler.CrawlerConfig; +import static mServer.crawler.CrawlerTool.loadLongMax; import mServer.daten.MserverSearchTask; import mServer.tool.MserverDaten; import mServer.tool.MserverDatumZeit; @@ -109,8 +110,11 @@ public boolean filmeSuchen(MserverSearchTask aktSearchTask) { //und jetzt STOPPEN!!!!!!!! crawler.stop(); } - - t.join(20 * 60 * 1000); // 20 Minuten warten, das Erstellen/Komprimieren der Liste dauert + int w = 20 * 60 * 1000; // 20 Minuten warten, das Erstellen/Komprimieren der Liste dauert + if (loadLongMax()) { + w = 30 * 60 * 1000; // 30 Minuten bei langen Läufen + } + t.join(w); if (t.isAlive()) { MserverLog.systemMeldung(""); MserverLog.systemMeldung(""); diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties index 61c197ae5..448e21c32 100644 --- a/src/main/resources/version.properties +++ b/src/main/resources/version.properties @@ -1,2 +1,2 @@ -#Tue Jan 31 10:40:01 UTC 2017 -VERSION=2.4.0-SNAPSHOT +#Thu Feb 09 15:32:51 CET 2017 +VERSION=2.5.2-SNAPSHOT