/*
* MediathekView
* Copyright (C) 2008 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 mSearch.daten.DatenFilm;
import mSearch.tool.*;
import mediathek.config.Daten;
import mediathek.config.Konstanten;
import mediathek.config.MVConfig;
import mediathek.controller.MVUsedUrl;
import mediathek.controller.starter.Start;
import mediathek.tool.GuiFunktionen;
import mediathek.tool.MVFilmSize;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
public final class DatenDownload extends MVData<DatenDownload> {
// Quelle - start über einen Button - Download - Abo
public static final byte QUELLE_ALLE = -1;
public static final byte QUELLE_BUTTON = 1;
public static final byte QUELLE_DOWNLOAD = 2;
public static final byte QUELLE_ABO = 3;
public static final String QUELLE_ALLE_TXT = "Alle";
public static final String QUELLE_BUTTON_TXT = "Button";
public static final String QUELLE_DOWNLOAD_TXT = "Download";
public static final String QUELLE_ABO_TXT = "Abo";
// Art: direkter Download: http... oder über ein externes Programm: rtmp...
public static final byte ART_DOWNLOAD = 1; // direkter Download
public static final byte ART_PROGRAMM = 2; // Download über ein Programm
public static final String ART_DOWNLOAD_TXT = "direkter Download";
public static final String ART_PROGRAMM_TXT = "Programm";
private static final GermanStringSorter sorter = GermanStringSorter.getInstance();
private static final SimpleDateFormat sdf_datum_zeit = new SimpleDateFormat("dd.MM.yyyyHH:mm:ss");
private static final SimpleDateFormat sdf_datum = new SimpleDateFormat("dd.MM.yyyy");
public static final int DOWNLOAD_NR = 0;
public static final int DOWNLOAD_FILM_NR = 1;// nur ein Platzhalter für: "film.nr"
public static final int DOWNLOAD_ABO = 2; // wenn das Feld gefüllt ist, ist der Download ein Abo
public static final int DOWNLOAD_SENDER = 3;
public static final int DOWNLOAD_THEMA = 4;
public static final int DOWNLOAD_TITEL = 5;
public static final int DOWNLOAD_BUTTON_START = 6;
public static final int DOWNLOAD_BUTTON_DEL = 7;
public static final int DOWNLOAD_PROGRESS = 8;
public static final int DOWNLOAD_RESTZEIT = 9;
public static final int DOWNLOAD_BANDBREITE = 10;
public static final int DOWNLOAD_GROESSE = 11;
public static final int DOWNLOAD_DATUM = 12;
public static final int DOWNLOAD_ZEIT = 13;
public static final int DOWNLOAD_DAUER = 14;
public static final int DOWNLOAD_HD = 15;
public static final int DOWNLOAD_UT = 16;
public static final int DOWNLOAD_UNTERBROCHEN = 17;
public static final int DOWNLOAD_GEO = 18;
public static final int DOWNLOAD_FILM_URL = 19;
public static final int DOWNLOAD_HISTORY_URL = 20;
public static final int DOWNLOAD_URL = 21;
public static final int DOWNLOAD_URL_RTMP = 22;
public static final int DOWNLOAD_URL_SUBTITLE = 23;
public static final int DOWNLOAD_PROGRAMMSET = 24;
public static final int DOWNLOAD_PROGRAMM = 25;
public static final int DOWNLOAD_PROGRAMM_AUFRUF = 26;
public static final int DOWNLOAD_PROGRAMM_AUFRUF_ARRAY = 27;
public static final int DOWNLOAD_PROGRAMM_RESTART = 28;
public static final int DOWNLOAD_ZIEL_DATEINAME = 29;
public static final int DOWNLOAD_ZIEL_PFAD = 30;
public static final int DOWNLOAD_ZIEL_PFAD_DATEINAME = 31;
public static final int DOWNLOAD_ART = 32;//Art des Downloads: direkter Dateidownload oder über ein Programm
public static final int DOWNLOAD_QUELLE = 33; //Quelle: gestartet über einen Button, Download, Abo
public static final int DOWNLOAD_ZURUECKGESTELLT = 34;
public static final int DOWNLOAD_INFODATEI = 35;
public static final int DOWNLOAD_SPOTLIGHT = 36;
public static final int DOWNLOAD_SUBTITLE = 37;// Untertitel anlegen ja/nein
public static final int DOWNLOAD_PROGRAMM_DOWNLOADMANAGER = 38;
public static final int DOWNLOAD_REF = 39;
//
public static final String TAG = "Downlad";
public static final int MAX_ELEM = 40;
public static final String[] COLUMN_NAMES = {"Nr", "Filmnr", "Abo", "Sender", "Thema", "Titel", "", "",
"Fortschritt", "Restzeit", "Geschwindigkeit", "Größe [MB]",
"Datum", "Zeit", "Dauer", "HD", "UT",
"Pause", "Geo", "Url Film", "Url History", "Url", "Url RTMP", "Url Untertitel",
"Programmset", "Programm", "Programmaufruf", "Programmaufruf Array", "Restart",
"Dateiname", "Pfad", "Pfad-Dateiname", "Art", "Quelle",
"Zurückgestellt", "Infodatei", "Spotlight", "Untertitel", "Remote Download", "Ref"};
public static final String[] XML_NAMES = {"Nr", "Filmnr", "Abo", "Sender", "Thema", "Titel", "Button-Start", "Button-Del",
"Fortschritt", "Restzeit", "Geschwindigkeit", "Groesse"/*DOWNLOAD_GROESSE*/,
"Datum", "Zeit", "Dauer", "HD", "UT",
"Pause", "Geo", "Film-URL", "History-URL", "URL", "URL-rtmp", "URL-Untertitel",
"Programmset", "Programm", "Programmaufruf_", "Programmaufruf", "Restart",
"Dateiname", "Pfad", "Pfad-Dateiname", "Art", "Quelle",
"Zurueckgestellt", "Infodatei", "Spotlight", "Untertitel", "Remote-Download", "Ref"};
public static boolean[] spaltenAnzeigen = new boolean[MAX_ELEM];
public String[] arr;
public Datum datumFilm = new Datum(0);
public DatenFilm film = null;
public MVFilmSize mVFilmSize = new MVFilmSize();
public Start start = null;
public DatenPset pSet = null;
public DatenAbo abo = null;
public int nr = 0;
public byte quelle = QUELLE_ALLE;
public byte art = ART_DOWNLOAD;
public DatenDownload() {
makeArr();
}
public DatenDownload(DatenPset pSet, DatenFilm film, byte quelle, DatenAbo abo, String name, String pfad, String aufloesung) {
makeArr();
this.film = film;
this.pSet = pSet;
this.abo = abo;
arr[DOWNLOAD_FILM_NR] = film.arr[DatenFilm.FILM_NR];
arr[DOWNLOAD_SENDER] = film.arr[DatenFilm.FILM_SENDER];
arr[DOWNLOAD_THEMA] = film.arr[DatenFilm.FILM_THEMA];
arr[DOWNLOAD_TITEL] = film.arr[DatenFilm.FILM_TITEL];
arr[DOWNLOAD_FILM_URL] = film.arr[DatenFilm.FILM_URL];
arr[DOWNLOAD_URL_SUBTITLE] = film.getUrlSubtitle();
arr[DOWNLOAD_DATUM] = film.arr[DatenFilm.FILM_DATUM];
arr[DOWNLOAD_ZEIT] = film.arr[DatenFilm.FILM_ZEIT];
arr[DOWNLOAD_URL_RTMP] = film.arr[DatenFilm.FILM_URL_RTMP];
arr[DOWNLOAD_DAUER] = film.arr[DatenFilm.FILM_DAUER];
arr[DOWNLOAD_HD] = film.isHD() ? "1" : "0";
arr[DOWNLOAD_UT] = film.hasUT() ? "1" : "0";
arr[DOWNLOAD_QUELLE] = String.valueOf(quelle);
arr[DOWNLOAD_HISTORY_URL] = film.getUrlHistory();
if (aufloesung.isEmpty()) {
arr[DOWNLOAD_URL] = film.getUrlFuerAufloesung(pSet.arr[DatenPset.PROGRAMMSET_AUFLOESUNG]);
arr[DOWNLOAD_URL_RTMP] = film.getUrlRtmpFuerAufloesung(pSet.arr[DatenPset.PROGRAMMSET_AUFLOESUNG]);
} else {
arr[DOWNLOAD_URL] = film.getUrlFuerAufloesung(aufloesung);
arr[DOWNLOAD_URL_RTMP] = film.getUrlRtmpFuerAufloesung(aufloesung);
}
arr[DatenDownload.DOWNLOAD_INFODATEI] = pSet.arr[DatenPset.PROGRAMMSET_INFODATEI];
arr[DatenDownload.DOWNLOAD_SUBTITLE] = pSet.arr[DatenPset.PROGRAMMSET_SUBTITLE];
arr[DatenDownload.DOWNLOAD_SPOTLIGHT] = pSet.arr[DatenPset.PROGRAMMSET_SPOTLIGHT];
arr[DatenDownload.DOWNLOAD_GEO] = film.arr[DatenFilm.FILM_GEO];
// und jetzt noch die Dateigröße für die entsp. URL
setGroesseFromFilm();
//setGroesse(""); //dann dauert das Starten uu sehr lange
aufrufBauen(pSet, film, abo, name, pfad);
init();
}
public void setGroesseFromFilm() {
if (film != null) {
if (film.arr[DatenFilm.FILM_URL].equals(arr[DOWNLOAD_URL])) {
mVFilmSize.setSize(film.arr[DatenFilm.FILM_GROESSE]);
} else {
mVFilmSize.setSize("");
}
}
}
public void setGroesse(String groesse) {
if (film != null) {
if (!groesse.isEmpty()) {
mVFilmSize.setSize(groesse);
} else {
mVFilmSize.setSize(film.getDateigroesse(arr[DOWNLOAD_URL]));
}
}
}
public static boolean anzeigen(int i) {
if (spaltenAnzeigen == null) {
return true;
} else {
return spaltenAnzeigen[i];
}
}
public final void init() {
datumFilm = getDatumForObject();
try {
art = Byte.parseByte(arr[DOWNLOAD_ART]);
quelle = Byte.parseByte(arr[DOWNLOAD_QUELLE]);
} catch (Exception ex) {
Log.errorLog(649632580, ex, "Art: " + arr[DOWNLOAD_ART] + " Quelle: " + arr[DOWNLOAD_QUELLE]);
art = ART_PROGRAMM;
quelle = QUELLE_BUTTON;
}
if (film == null) {
//damit die Sortierunt bei gespeicherten Downloads bei denen der
//Film nicht mehr ermittelt werden kann stimmt
arr[DOWNLOAD_HD] = "0";
arr[DOWNLOAD_UT] = "0";
}
}
public boolean istZurueckgestellt() {
return arr[DOWNLOAD_ZURUECKGESTELLT].equals(Boolean.TRUE.toString());
}
public void zurueckstellen() {
if (start != null) {
if (start.status > Start.STATUS_INIT) {
// zu spät
return;
}
}
arr[DOWNLOAD_ZURUECKGESTELLT] = Boolean.TRUE.toString();
resetDownload();
}
public boolean isInterrupted() {
return !isFinished() && arr[DOWNLOAD_UNTERBROCHEN].equals(Boolean.TRUE.toString());
}
public void interrupt() {
arr[DOWNLOAD_UNTERBROCHEN] = Boolean.TRUE.toString();
}
public void interruptRestart() {
arr[DOWNLOAD_UNTERBROCHEN] = Boolean.FALSE.toString();
Listener.notify(Listener.EREIGNIS_RESET_INTERRUPT, DatenDownload.class.getName());
}
public boolean notStarted() {
return (start == null);
}
public boolean isWaiting() {
return (start != null) && (start.status == Start.STATUS_INIT);
}
public boolean isFinished() {
return (start != null) && (start.status == Start.STATUS_FERTIG);
}
public boolean runNotFinished() {
if (start != null && start.status < Start.STATUS_FERTIG) {
return true;
}
return false;
}
public boolean running() {
if (start != null && start.status == Start.STATUS_RUN) {
return true;
}
return false;
}
public void resetDownload() {
mVFilmSize.reset();
start = null;
}
public void startDownload(Daten aDaten) {
// Start erstellen und zur Liste hinzufügen
this.start = new Start();
// gestartete Filme (originalURL des Films) auch in die History eintragen
if (film != null) {
aDaten.getListeFilmeHistory().add(film);
}
aDaten.history.zeileSchreiben(arr[DatenDownload.DOWNLOAD_THEMA], arr[DatenDownload.DOWNLOAD_TITEL], arr[DatenDownload.DOWNLOAD_HISTORY_URL]);
Listener.notify(Listener.EREIGNIS_START_EVENT, this.getClass().getSimpleName());
}
public static void startenDownloads(Daten ddaten, ArrayList<DatenDownload> downloads) {
// Start erstellen und zur Liste hinzufügen
String zeit = new SimpleDateFormat("dd.MM.yyyy").format(new Date());
LinkedList<MVUsedUrl> urlList = new LinkedList<>();
for (DatenDownload d : downloads) {
d.start = new Start();
urlList.add(new MVUsedUrl(zeit,
d.arr[DatenDownload.DOWNLOAD_THEMA],
d.arr[DatenDownload.DOWNLOAD_TITEL],
d.arr[DatenDownload.DOWNLOAD_HISTORY_URL]));
}
if (!urlList.isEmpty()) {
ddaten.history.zeilenSchreiben(urlList);
}
Listener.notify(Listener.EREIGNIS_START_EVENT, DatenDownload.class.getSimpleName());
}
public DatenDownload getCopy() {
DatenDownload ret = new DatenDownload();
System.arraycopy(this.arr, 0, ret.arr, 0, arr.length);
ret.datumFilm = this.datumFilm;
ret.film = this.film;
ret.mVFilmSize = this.mVFilmSize;
ret.start = this.start;
ret.pSet = this.pSet;
ret.abo = this.abo;
ret.nr = this.nr;
ret.quelle = this.quelle;
ret.art = this.art;
return ret;
}
public void aufMichKopieren(DatenDownload datenDownload) {
System.arraycopy(datenDownload.arr, 0, arr, 0, arr.length);
datumFilm = datenDownload.datumFilm;
film = datenDownload.film;
mVFilmSize = datenDownload.mVFilmSize;// die Auflösung des Films kann sich ändern
start = datenDownload.start;
pSet = datenDownload.pSet;
abo = datenDownload.abo;
nr = datenDownload.nr;
quelle = datenDownload.quelle;
art = datenDownload.art;
}
public boolean istAbo() {
return !arr[DatenDownload.DOWNLOAD_ABO].isEmpty();
}
public boolean isRestart() {
if (arr[DOWNLOAD_PROGRAMM_RESTART].equals("")) {
return false;
}
return Boolean.parseBoolean(arr[DOWNLOAD_PROGRAMM_RESTART]);
}
public boolean isDownloadManager() {
if (arr[DOWNLOAD_PROGRAMM_DOWNLOADMANAGER].equals("")) {
return false;
}
return Boolean.parseBoolean(arr[DOWNLOAD_PROGRAMM_DOWNLOADMANAGER]);
}
public boolean isInfoFile() {
if (arr[DOWNLOAD_INFODATEI].equals("")) {
return false;
}
return Boolean.parseBoolean(arr[DOWNLOAD_INFODATEI]);
}
public boolean isSubtitle() {
if (arr[DOWNLOAD_SUBTITLE].equals("")) {
return false;
}
return Boolean.parseBoolean(arr[DOWNLOAD_SUBTITLE]);
}
public boolean isSpotlight() {
if (arr[DOWNLOAD_SPOTLIGHT].equals("")) {
return false;
}
return Boolean.parseBoolean(arr[DOWNLOAD_SPOTLIGHT]);
}
public String getTextRestzeit() {
if (start != null) {
if (start.status < Start.STATUS_FERTIG && start.status >= Start.STATUS_RUN && start.restSekunden > 0) {
if (start.restSekunden > 300) {
return Long.toString(Math.round(start.restSekunden / 60.0)) + " Min.";
} else if (start.restSekunden > 230) {
return "5 Min.";
} else if (start.restSekunden > 170) {
return "4 Min.";
} else if (start.restSekunden > 110) {
return "3 Min.";
} else if (start.restSekunden > 60) {
return "2 Min.";
} else if (start.restSekunden > 30) {
return "1 Min.";
} else if (start.restSekunden > 20) {
return "30 s";
} else if (start.restSekunden > 10) {
return "20 s";
} else {
return "10 s";
}
}
}
return "";
}
public String getTextBandbreite() {
// start.bandbreite -->> bytes per second
if (start != null) {
if (/*start.status < Start.STATUS_FERTIG &&*/start.status >= Start.STATUS_RUN) {
return getTextBandbreite(start.bandbreite);
}
}
return "";
}
public static String getTextBandbreite(long b) {
if (b > 1000 * 1000) {
String s = String.valueOf(b / 1000);
if (s.length() >= 4) {
s = s.substring(0, s.length() - 3) + "," + s.substring(s.length() - 3);
}
return s + " MB/s";
} else if (b > 1000) {
return (b / 1000) + " kB/s";
} else if (b > 1) {
return b + " B/s";
} else {
return "";
}
}
public boolean checkAufrufBauen() {
return (pSet != null && film != null);
}
public void aufrufBauen() {
aufrufBauen(pSet, film, abo, arr[DOWNLOAD_ZIEL_DATEINAME], arr[DOWNLOAD_ZIEL_PFAD]);
}
private void aufrufBauen(DatenPset pSet, DatenFilm film, DatenAbo abo, String nname, String ppfad) {
//zieldatei und pfad bauen und eintragen
try {
DatenProg programm = pSet.getProgUrl(arr[DOWNLOAD_URL]);
// ##############################################
// für die alten Versionen:
pSet.arr[DatenPset.PROGRAMMSET_ZIEL_DATEINAME] = pSet.arr[DatenPset.PROGRAMMSET_ZIEL_DATEINAME].replace("%n", "");
pSet.arr[DatenPset.PROGRAMMSET_ZIEL_DATEINAME] = pSet.arr[DatenPset.PROGRAMMSET_ZIEL_DATEINAME].replace("%p", "");
pSet.arr[DatenPset.PROGRAMMSET_ZIEL_PFAD] = pSet.arr[DatenPset.PROGRAMMSET_ZIEL_PFAD].replace("%n", "");
pSet.arr[DatenPset.PROGRAMMSET_ZIEL_PFAD] = pSet.arr[DatenPset.PROGRAMMSET_ZIEL_PFAD].replace("%p", "");
for (DatenProg prog : pSet.getListeProg()) {
prog.arr[DatenProg.PROGRAMM_ZIEL_DATEINAME] = prog.arr[DatenProg.PROGRAMM_ZIEL_DATEINAME].replace("%n", "");
prog.arr[DatenProg.PROGRAMM_ZIEL_DATEINAME] = prog.arr[DatenProg.PROGRAMM_ZIEL_DATEINAME].replace("%p", "");
}
// ##############################################
// pSet und ... eintragen
arr[DOWNLOAD_PROGRAMMSET] = pSet.arr[DatenPset.PROGRAMMSET_NAME];
// Direkter Download nur wenn url passt und wenn im Programm ein Zielpfad ist sonst Abspielen
art = (pSet.checkDownloadDirekt(arr[DOWNLOAD_URL])
&& pSet.progsContainPath()/*legt fest, dass NICHT Abspielen, Abspielen immer über Programm!*/) ? ART_DOWNLOAD : ART_PROGRAMM;
arr[DOWNLOAD_ART] = String.valueOf(art);
if (art == ART_DOWNLOAD) {
arr[DatenDownload.DOWNLOAD_PROGRAMM] = ART_DOWNLOAD_TXT;
} else {
arr[DatenDownload.DOWNLOAD_PROGRAMM] = programm.arr[DatenProg.PROGRAMM_NAME];
}
arr[DOWNLOAD_PROGRAMM_RESTART] = String.valueOf(programm.isRestart());
arr[DOWNLOAD_PROGRAMM_DOWNLOADMANAGER] = String.valueOf(programm.isDownloadManager());
dateinamePfadBauen(pSet, film, abo, nname, ppfad);
programmaufrufBauen(programm);
} catch (Exception ex) {
Log.errorLog(825600145, ex);
}
}
private void programmaufrufBauen(DatenProg programm) {
if (art == ART_DOWNLOAD) {
arr[DOWNLOAD_PROGRAMM_AUFRUF] = "";
arr[DOWNLOAD_PROGRAMM_AUFRUF_ARRAY] = "";
} else {
String befehlsString = programm.getProgrammAufruf();
befehlsString = replaceExec(befehlsString);
arr[DOWNLOAD_PROGRAMM_AUFRUF] = befehlsString;
String progArray = programm.getProgrammAufrufArray();
progArray = replaceExec(progArray);
arr[DOWNLOAD_PROGRAMM_AUFRUF_ARRAY] = progArray;
}
}
private String replaceExec(String befehlsString) {
befehlsString = befehlsString.replace("**", arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
befehlsString = befehlsString.replace("%f", arr[DOWNLOAD_URL]);
befehlsString = befehlsString.replace("%F", arr[DOWNLOAD_URL_RTMP]);
befehlsString = befehlsString.replace("%a", arr[DOWNLOAD_ZIEL_PFAD]);
befehlsString = befehlsString.replace("%b", arr[DOWNLOAD_ZIEL_DATEINAME]);
return befehlsString;
}
private void dateinamePfadBauen(DatenPset pSet, DatenFilm film, DatenAbo abo, String nname, String ppfad) {
// nname und ppfad sind nur belegt, wenn der Download über den DialogAddDownload gestartet wurde (aus TabFilme)
String name;
String path;
if (!pSet.progsContainPath()) {
// dann können wir uns das sparen
arr[DatenDownload.DOWNLOAD_ZIEL_DATEINAME] = "";
arr[DatenDownload.DOWNLOAD_ZIEL_PFAD] = "";
return;
}
// ##############################################
// Name
// ##############################################
if (!nname.equals("")) {
// wenn vorgegeben, dann den nehmen
name = nname;
} else {
name = pSet.getZielDateiname(arr[DOWNLOAD_URL]);
arr[DatenDownload.DOWNLOAD_ZIEL_DATEINAME] = name;
// ##############################
// Name sinnvoll belegen
if (name.equals("")) {
name = getHeute_yyyyMMdd() + "_" + arr[DatenDownload.DOWNLOAD_THEMA] + "-" + arr[DatenDownload.DOWNLOAD_TITEL] + ".mp4";
}
//Tags ersetzen
name = replaceString(name, film); // %D ... ersetzen
String suff = "";
if (name.contains(".")) {
//Suffix (und den . ) nicht ändern
suff = name.substring(name.lastIndexOf("."));
if (suff.length() <= 4 && suff.length() > 1) {
//dann ist es sonst was??
name = name.substring(0, name.lastIndexOf("."));
} else {
suff = "";
}
}
name = FilenameUtils.replaceLeerDateiname(name, false /*pfad*/,
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_USE_REPLACETABLE)),
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ONLY_ASCII)));
name = name + suff;
// prüfen ob das Suffix 2x vorkommt
if (name.length() > 8) {
String suf1 = name.substring(name.length() - 8, name.length() - 4);
String suf2 = name.substring(name.length() - 4);
if (suf1.startsWith(".") && suf2.startsWith(".")) {
if (suf1.equalsIgnoreCase(suf2)) {
name = name.substring(0, name.length() - 4);
}
}
}
// Kürzen
if (Boolean.parseBoolean(pSet.arr[DatenPset.PROGRAMMSET_LAENGE_BESCHRAENKEN])) {
int laenge = Konstanten.LAENGE_DATEINAME;
if (!pSet.arr[DatenPset.PROGRAMMSET_MAX_LAENGE].equals("")) {
laenge = Integer.parseInt(pSet.arr[DatenPset.PROGRAMMSET_MAX_LAENGE]);
}
name = GuiFunktionen.cutName(name, laenge);
}
}
// ##############################################
// Pfad
// ##############################################
if (!ppfad.isEmpty()) {
// wenn vorgegeben, dann den nehmen
path = ppfad;
} else {
// Pfad sinnvoll belegen
if (pSet.getZielPfad().isEmpty()) {
path = GuiFunktionen.getStandardDownloadPath();
} else {
path = pSet.getZielPfad();
}
if (abo != null) {
//Abos: den Namen des Abos eintragen
arr[DatenDownload.DOWNLOAD_ABO] = abo.arr[DatenAbo.ABO_NAME];
if (Boolean.parseBoolean(pSet.arr[DatenPset.PROGRAMMSET_THEMA_ANLEGEN])) {
//und Abopfad an den Pfad anhängen
path = GuiFunktionen.addsPfad(path, FilenameUtils.removeIllegalCharacters(abo.arr[DatenAbo.ABO_ZIELPFAD], true));
}
} else //Downloads
if (Boolean.parseBoolean(pSet.arr[DatenPset.PROGRAMMSET_THEMA_ANLEGEN])) {
//und den Namen des Themas an den Zielpfad anhängen
path = GuiFunktionen.addsPfad(path, FilenameUtils.replaceLeerDateiname(arr[DatenDownload.DOWNLOAD_THEMA], true /*pfad*/,
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_USE_REPLACETABLE)),
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ONLY_ASCII))));
}
path = replaceString(path, film); // %D ... ersetzen
}
if (path.endsWith(File.separator)) {
path = path.substring(0, path.length() - 1);
}
//###########################################################
// zur Sicherheit bei Unsinn im Set
if (path.isEmpty()) {
path = GuiFunktionen.getStandardDownloadPath();
}
if (name.isEmpty()) {
name = getHeute_yyyyMMdd() + "_" + arr[DatenDownload.DOWNLOAD_THEMA] + "-" + arr[DatenDownload.DOWNLOAD_TITEL] + ".mp4";
}
// in Win dürfen die Pfade nicht länger als 255 Zeichen haben (für die Infodatei kommen noch ".txt" dazu)
String[] pathName = {path, name};
GuiFunktionen.checkLengthPath(pathName);
arr[DOWNLOAD_ZIEL_DATEINAME] = pathName[1];
arr[DOWNLOAD_ZIEL_PFAD] = pathName[0];
arr[DOWNLOAD_ZIEL_PFAD_DATEINAME] = GuiFunktionen.addsPfad(pathName[0], pathName[1]);
}
private String replaceString(String replStr, DatenFilm film) {
//hier wird nur ersetzt!
//Felder mit variabler Länge, evtl. vorher kürzen
int laenge = -1;
if (Boolean.parseBoolean(pSet.arr[DatenPset.PROGRAMMSET_LAENGE_FIELD_BESCHRAENKEN])) {
// nur dann ist was zu tun
laenge = Konstanten.LAENGE_FELD;
if (!pSet.arr[DatenPset.PROGRAMMSET_MAX_LAENGE_FIELD].equals("")) {
laenge = Integer.parseInt(pSet.arr[DatenPset.PROGRAMMSET_MAX_LAENGE_FIELD]);
}
}
replStr = replStr.replace("%t", getField(film.arr[DatenFilm.FILM_THEMA], laenge));
replStr = replStr.replace("%T", getField(film.arr[DatenFilm.FILM_TITEL], laenge));
replStr = replStr.replace("%s", getField(film.arr[DatenFilm.FILM_SENDER], laenge));
replStr = replStr.replace("%N", getField(GuiFunktionen.getDateiName(this.arr[DatenDownload.DOWNLOAD_URL]), laenge));
//Felder mit fester Länge werden immer ganz geschrieben
replStr = replStr.replace("%D", film.arr[DatenFilm.FILM_DATUM].equals("") ? getHeute_yyyyMMdd() : datumDatumZeitReinigen(datumDrehen(film.arr[DatenFilm.FILM_DATUM])));
replStr = replStr.replace("%d", film.arr[DatenFilm.FILM_ZEIT].equals("") ? getJetzt_HHMMSS() : datumDatumZeitReinigen(film.arr[DatenFilm.FILM_ZEIT]));
replStr = replStr.replace("%H", getHeute_yyyyMMdd());
replStr = replStr.replace("%h", getJetzt_HHMMSS());
replStr = replStr.replace("%1", getDMY("%1", film.arr[DatenFilm.FILM_DATUM].equals("") ? getHeute_yyyy_MM_dd() : film.arr[DatenFilm.FILM_DATUM]));
replStr = replStr.replace("%2", getDMY("%2", film.arr[DatenFilm.FILM_DATUM].equals("") ? getHeute_yyyy_MM_dd() : film.arr[DatenFilm.FILM_DATUM]));
replStr = replStr.replace("%3", getDMY("%3", film.arr[DatenFilm.FILM_DATUM].equals("") ? getHeute_yyyy_MM_dd() : film.arr[DatenFilm.FILM_DATUM]));
replStr = replStr.replace("%4", getHMS("%4", film.arr[DatenFilm.FILM_ZEIT].equals("") ? getJetzt_HH_MM_SS() : film.arr[DatenFilm.FILM_ZEIT]));
replStr = replStr.replace("%5", getHMS("%5", film.arr[DatenFilm.FILM_ZEIT].equals("") ? getJetzt_HH_MM_SS() : film.arr[DatenFilm.FILM_ZEIT]));
replStr = replStr.replace("%6", getHMS("%6", film.arr[DatenFilm.FILM_ZEIT].equals("") ? getJetzt_HH_MM_SS() : film.arr[DatenFilm.FILM_ZEIT]));
replStr = replStr.replace("%i", String.valueOf(film.nr));
String res = "";
if (arr[DOWNLOAD_URL].equals(film.getUrlFuerAufloesung(DatenFilm.AUFLOESUNG_NORMAL))) {
res = "H";
} else if (arr[DOWNLOAD_URL].equals(film.getUrlFuerAufloesung(DatenFilm.AUFLOESUNG_HD))) {
res = "HD";
} else if (arr[DOWNLOAD_URL].equals(film.getUrlFuerAufloesung(DatenFilm.AUFLOESUNG_KLEIN))) {
res = "L";
} else if (arr[DOWNLOAD_URL].equals(film.getUrlRtmpFuerAufloesung(DatenFilm.AUFLOESUNG_NORMAL))) {
res = "H";
} else if (arr[DOWNLOAD_URL].equals(film.getUrlRtmpFuerAufloesung(DatenFilm.AUFLOESUNG_HD))) {
res = "HD";
} else if (arr[DOWNLOAD_URL].equals(film.getUrlRtmpFuerAufloesung(DatenFilm.AUFLOESUNG_KLEIN))) {
res = "L";
}
replStr = replStr.replace("%q", res); //%q Qualität des Films ("HD", "H", "L")
replStr = replStr.replace("%S", GuiFunktionen.getSuffixFromUrl(this.arr[DatenDownload.DOWNLOAD_URL]));
replStr = replStr.replace("%Z", GuiFunktionen.getHash(this.arr[DatenDownload.DOWNLOAD_URL]));
replStr = replStr.replace("%z", GuiFunktionen.getHash(this.arr[DatenDownload.DOWNLOAD_URL])
+ "." + GuiFunktionen.getSuffixFromUrl(this.arr[DatenDownload.DOWNLOAD_URL]));
return replStr;
}
private String getField(String name, int length) {
name = FilenameUtils.replaceLeerDateiname(name, false /*pfad*/,
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_USE_REPLACETABLE)),
Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_ONLY_ASCII)));
if (length < 0) {
return name;
}
if (name.length() > length) {
name = name.substring(0, length);
}
return name;
}
private String getJetzt_HHMMSS() {
return new SimpleDateFormat("HHmmss").format(new Date());
}
private String getJetzt_HH_MM_SS() {
return new SimpleDateFormat("HH:mm:ss").format(new Date());
}
private String getHeute_yyyyMMdd() {
return new SimpleDateFormat("yyyyMMdd").format(new Date());
}
private String getHeute_yyyy_MM_dd() {
return new SimpleDateFormat("dd.MM.yyyy").format(new Date());
}
private static String getDMY(String s, String datum) {
// liefert das Datum: Jahr - Monat - Tag aus dd.MM.yyyy
// %1 - Tag
// %2 - Monat
// %3 - Jahr
String ret = "";
if (!datum.equals("")) {
try {
if (datum.length() == 10) {
switch (s) {
case "%1":
ret = datum.substring(0, 2); // Tag
break;
case "%2":
ret = datum.substring(3, 5); // Monat
break;
case "%3":
ret = datum.substring(6); // Jahr
break;
}
}
} catch (Exception ex) {
Log.errorLog(775421006, ex, datum);
}
}
return ret;
}
private static String getHMS(String s, String zeit) {
// liefert die Zeit: Stunde, Minute, Sekunde aus "HH:mm:ss"
// %4 - Stunde
// %5 - Minute
// %6 - Sekunde
String ret = "";
if (!zeit.equals("")) {
try {
if (zeit.length() == 8) {
switch (s) {
case "%4":
ret = zeit.substring(0, 2); // Stunde
break;
case "%5":
ret = zeit.substring(3, 5); // Minute
break;
case "%6":
ret = zeit.substring(6); // Sekunde
break;
}
}
} catch (Exception ex) {
Log.errorLog(775421006, ex, zeit);
}
}
return ret;
}
private static String datumDrehen(String datum) {
String ret = "";
if (!datum.equals("")) {
try {
if (datum.length() == 10) {
String tmp = datum.substring(6); // Jahr
tmp += "." + datum.substring(3, 5); // Monat
tmp += "." + datum.substring(0, 2); // Tag
ret = tmp;
}
} catch (Exception ex) {
Log.errorLog(775421006, ex, datum);
}
}
return ret;
}
private static String datumDatumZeitReinigen(String datum) {
String ret;
ret = datum;
ret = ret.replace(":", "");
ret = ret.replace(".", "");
return ret;
}
private void makeArr() {
arr = new String[MAX_ELEM];
for (int i = 0; i < arr.length; ++i) {
arr[i] = "";
}
arr[DOWNLOAD_ZURUECKGESTELLT] = Boolean.FALSE.toString();
arr[DOWNLOAD_UNTERBROCHEN] = Boolean.FALSE.toString();
}
public Datum getDatumForObject() {
Datum tmp = new Datum(0);
if (!arr[DatenDownload.DOWNLOAD_DATUM].equals("")) {
try {
if (!arr[DatenDownload.DOWNLOAD_ZEIT].equals("")) {
tmp.setTime(sdf_datum_zeit.parse(arr[DatenDownload.DOWNLOAD_DATUM] + arr[DatenDownload.DOWNLOAD_ZEIT]).getTime());
} else {
tmp.setTime(sdf_datum.parse(arr[DatenDownload.DOWNLOAD_DATUM]).getTime());
}
} catch (Exception ex) {
Log.errorLog(649897321, ex,
new String[]{"Datum: " + arr[DatenDownload.DOWNLOAD_DATUM], "Zeit: " + arr[DatenDownload.DOWNLOAD_ZEIT]});
}
}
return tmp;
}
public String getFileNameWithoutSuffix() {
return GuiFunktionen.getFileNameWithoutSuffix(arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
}
public String getFileNameSuffix() {
return GuiFunktionen.getFileNameSuffix(arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
}
@Override
public int compareTo(DatenDownload arg0) {
int ret;
if ((ret = sorter.compare(arr[DatenDownload.DOWNLOAD_SENDER], arg0.arr[DatenDownload.DOWNLOAD_SENDER])) == 0) {
return sorter.compare(arr[DatenDownload.DOWNLOAD_THEMA], arg0.arr[DatenDownload.DOWNLOAD_THEMA]);
}
return ret;
}
}