/* * MediathekView * Copyright (C) 2014 W. Xaver * W.Xaver[at]googlemail.com * http://zdfmediathk.sourceforge.net/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mediathek.daten; import java.text.DecimalFormat; import java.util.LinkedList; import mSearch.tool.Log; import mediathek.config.Daten; import mediathek.config.MVConfig; import mediathek.controller.starter.Start; import mediathek.tool.MVFilmSize; public class DownloadInfos { private final Daten daten; // Anzahl public int anzDownloadsRun = 0; //Anzahl gestarteter Downloads // Größe public long byteAlleDownloads = 0; //anz. Bytes für alle gestarteten Downloads public long byteAktDownloads = 0; //anz. Bytes bereits geladen für die gerade ladenden/laufenden Downloads // Zeit public long timeRestAktDownloads = 0; //Restzeit für die gerade ladenden/laufenden Downloads public long timeRestAllDownloads = 0; // Restzeit aller gestarteten Downloads // Bandbreite public long bandwidth = 0; //Bandbreite: bytes per second public String bandwidthStr = ""; // Prozent fertig (alle) public int percent = -1; // Anzahl, Anz-Abo, Anz-Down, nicht gestarted, laufen, fertig OK, fertig fehler public int[] downloadStarts = new int[]{0, 0, 0, 0, 0, 0, 0}; private LinkedList<DatenDownload> aktivDownloads; // Liste gestarteter Downloads public DownloadInfos(Daten aDaten) { daten = aDaten; } public String roundBandwidth(long time) { roundBandwidth(); if (bandwidth > 1_000_000.0) { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + bandwidthStr; } else if (bandwidth > 1_000.0) { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + bandwidthStr; } else { return time / 60 + ":" + (time % 60 < 10 ? "0" + time % 60 : time % 60) + " Minuten / " + bandwidthStr; } } public String roundBandwidth() { if (bandwidth > 1_000_000.0) { bandwidthStr = new DecimalFormat("####0.00").format(bandwidth / 1_000_000.0) + " MByte/s"; } else if (bandwidth > 1_000.0) { bandwidthStr = Math.round(bandwidth / 1_000.0) + " kByte/s"; } else { bandwidthStr = Math.round(bandwidth) + " Byte/s"; } return bandwidthStr; } public String getGesamtRestzeit() { if (timeRestAllDownloads > 0) { if (timeRestAllDownloads < 60) { return "< 1 Min"; } else { return Long.toString(timeRestAllDownloads / 60) + " Min"; } } return ""; } public String getRestzeit() { if (timeRestAktDownloads > 0) { if (timeRestAktDownloads < 60) { return "< 1 Min"; } else { return Long.toString(timeRestAktDownloads / 60) + " Min"; } } return ""; } public synchronized void makeDownloadInfos() { clean(); downloadStarts = daten.getListeDownloads().getStarts(); aktivDownloads = daten.getListeDownloads().getListOfStartsNotFinished(DatenDownload.QUELLE_ALLE); for (DatenDownload download : aktivDownloads) { ++daten.getDownloadInfos().anzDownloadsRun; daten.getDownloadInfos().byteAlleDownloads += (download.mVFilmSize.getSize() > 0 ? download.mVFilmSize.getSize() : 0); if (download.start != null && download.start.status == Start.STATUS_RUN) { // die Downlaods laufen gerade daten.getDownloadInfos().bandwidth += download.start.bandbreite; // bytes per second daten.getDownloadInfos().byteAktDownloads += (download.mVFilmSize.getAktSize() > 0 ? download.mVFilmSize.getAktSize() : 0); if (download.start.restSekunden > daten.getDownloadInfos().timeRestAktDownloads) { // der längeste gibt die aktuelle Restzeit vor daten.getDownloadInfos().timeRestAktDownloads = download.start.restSekunden; } } } if (daten.getDownloadInfos().bandwidth < 0) { daten.getDownloadInfos().bandwidth = 0; } if (daten.getDownloadInfos().bandwidth > 0) { // sonst macht die Restzeit keinen Sinn final long b = daten.getDownloadInfos().byteAlleDownloads - daten.getDownloadInfos().byteAktDownloads; if (b <= 0) { daten.getDownloadInfos().timeRestAllDownloads = 0; } else { daten.getDownloadInfos().timeRestAllDownloads = b / daten.getDownloadInfos().bandwidth; } if (daten.getDownloadInfos().timeRestAllDownloads < daten.getDownloadInfos().timeRestAktDownloads) { daten.getDownloadInfos().timeRestAllDownloads = daten.getDownloadInfos().timeRestAktDownloads; // falsch geraten oder es gibt nur einen } if (daten.getDownloadInfos().anzDownloadsRun == 1) { daten.getDownloadInfos().timeRestAllDownloads = 0; // gibt ja nur noch einen } } if (byteAlleDownloads > 0) { percent = (int) (byteAktDownloads * 100 / byteAlleDownloads); progressMsg(); } roundBandwidth(); } private void progressMsg() { if (!MVConfig.getBool(MVConfig.Configs.SYSTEM_PARAMETER_DOWNLOAD_PROGRESS)) { return; } int progress = daten.getDownloadInfos().percent; if (progress >= 0) { String text = " [ "; int a = progress / 10; for (int i = 0; i < a; ++i) { text += "#"; } for (int i = 0; i < (10 - a); ++i) { text += "-"; } text += " ] " + MVFilmSize.getGroesse(byteAktDownloads) + " von " + MVFilmSize.getGroesse(byteAlleDownloads) + " MByte /"; text += " Downloads: " + daten.getDownloadInfos().anzDownloadsRun + " /"; text += " Bandbreite: " + roundBandwidth(); Log.progress(text); } } private void clean() { anzDownloadsRun = 0; byteAlleDownloads = 0; byteAktDownloads = 0; timeRestAktDownloads = 0; timeRestAllDownloads = 0; bandwidth = 0; percent = -1; } }