/* * 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.tool; import mSearch.Const; import mediathek.config.Daten; import mediathek.config.MVConfig; import mediathek.controller.starter.RuntimeExec; import mediathek.daten.DatenProg; import mediathek.daten.DatenPset; import mediathek.daten.ListePset; import mediathek.gui.dialog.DialogHilfe; import mediathek.gui.dialogEinstellungen.DialogImportPset; import javax.swing.*; import java.awt.*; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import static mSearch.tool.Functions.getOs; public class GuiFunktionenProgramme extends GuiFunktionen { private static final ArrayList<String> winPfade = new ArrayList<>(); private static void setWinProgPfade() { String pfad; if (System.getenv("ProgramFiles") != null) { pfad = System.getenv("ProgramFiles"); if (new File(pfad).exists() && !winPfade.contains(pfad)) { winPfade.add(pfad); } } if (System.getenv("ProgramFiles(x86)") != null) { pfad = System.getenv("ProgramFiles(x86)"); if (new File(pfad).exists() && !winPfade.contains(pfad)) { winPfade.add(pfad); } } String[] PFAD = {"C:\\Program Files", "C:\\Programme", "C:\\Program Files (x86)"}; for (String s : PFAD) { if (new File(s).exists() && !winPfade.contains(s)) { winPfade.add(s); } } } public static String getMusterPfadVlc() { // liefert den Standardpfad für das entsprechende BS // Programm muss auf dem Rechner instelliert sein final String PFAD_LINUX_VLC = "/usr/bin/vlc"; final String PFAD_FREEBSD = "/usr/local/bin/vlc"; final String PFAD_MAC_VLC = "/Applications/VLC.app/Contents/MacOS/VLC"; final String PFAD_WIN = "\\VideoLAN\\VLC\\vlc.exe"; String pfad = ""; try { switch (getOs()) { case LINUX: if (System.getProperty("os.name").toLowerCase().contains("freebsd")) { pfad = PFAD_FREEBSD; } else { pfad = PFAD_LINUX_VLC; } break; case MAC: pfad = PFAD_MAC_VLC; break; default: setWinProgPfade(); for (String s : winPfade) { pfad = s + PFAD_WIN; if (new File(pfad).exists()) { break; } } } if (!new File(pfad).exists() && System.getenv("PATH_VLC") != null) { pfad = System.getenv("PATH_VLC"); } if (!new File(pfad).exists()) { pfad = ""; } } catch (Exception ignore) { } return pfad; } public static String getMusterPfadFlv() { // liefert den Standardpfad für das entsprechende BS // bei Win+Mac wird das Programm mitgeliefert und liegt // im Ordner "bin" der mit dem Programm mitgeliefert wird // bei Linux muss das Programm auf dem Rechner instelliert sein final String PFAD_LINUX_FLV = "/usr/bin/flvstreamer"; final String PFAD_FREEBSD = "/usr/local/bin/flvstreamer"; final String PFAD_MAC_FLV = "bin/flvstreamer_macosx_intel_32bit_latest"; final String PFAD_WINDOWS_FLV = "bin\\flvstreamer_win32_latest.exe"; String pfad = ""; try { switch (getOs()) { case LINUX: if (System.getProperty("os.name").toLowerCase().contains("freebsd")) { pfad = PFAD_FREEBSD; } else { pfad = PFAD_LINUX_FLV; } break; case MAC: pfad = MVFunctionSys.getPathJar() + PFAD_MAC_FLV; break; default: pfad = PFAD_WINDOWS_FLV; } if (!new File(pfad).exists() && System.getenv("PATH_FLVSTREAMER") != null) { pfad = System.getenv("PATH_FLVSTREAMER"); } if (!new File(pfad).exists()) { pfad = ""; } } catch (Exception ignore) { } return pfad; } public static String getMusterPfadFFmpeg() { // liefert den Standardpfad für das entsprechende BS // bei Win+Mac wird das Programm mitgeliefert und liegt // im Ordner "bin" der mit dem Programm mitgeliefert wird // bei Linux muss das Programm auf dem Rechner installiert sein final String PFAD_LINUX_FFMPEG = "/usr/bin/ffmpeg"; final String PFAD_FREEBSD_FFMPEG = "/usr/local/bin/ffmpeg"; final String PFAD_MAC_FFMPEG = "bin/ffmpeg"; final String PFAD_WINDOWS_FFMPEG = "bin\\ffmpeg.exe"; String pfad = ""; try { switch (getOs()) { case LINUX: if (System.getProperty("os.name").toLowerCase().contains("freebsd")) { pfad = PFAD_FREEBSD_FFMPEG; } else { pfad = PFAD_LINUX_FFMPEG; } break; case MAC: pfad = MVFunctionSys.getPathJar() + PFAD_MAC_FFMPEG; break; default: pfad = PFAD_WINDOWS_FFMPEG; } if (!new File(pfad).exists() && System.getenv("PATH_FFMPEG") != null) { pfad = System.getenv("PATH_FFMPEG"); } if (!new File(pfad).exists()) { pfad = ""; } } catch (Exception ignore) { } return pfad; } public static String getPfadScript() { // liefert den Standardpfad zum Script "Ansehen" für das entsprechende BS // liegt im Ordner "bin" der mit dem Programm mitgeliefert wird String pfadScript; final String PFAD_LINUX_SCRIPT = "bin/flv.sh"; final String PFAD_WINDOWS_SCRIPT = "bin\\flv.bat"; switch (getOs()) { case LINUX: pfadScript = getPathJar() + PFAD_LINUX_SCRIPT; break; case MAC: pfadScript = getPathJar() + PFAD_LINUX_SCRIPT; break; default: pfadScript = PFAD_WINDOWS_SCRIPT; } return pfadScript; } public static void addSetVorlagen(JFrame parent, Daten daten, ListePset pSet, boolean auto, boolean setVersion) { if (pSet == null) { if (!auto) { MVMessageDialog.showMessageDialog(null, "Die Datei wurde nicht importiert!", "Fehler", JOptionPane.ERROR_MESSAGE); } return; } if (parent != null) { parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } for (DatenPset ps : pSet) { if (!ps.arr[DatenPset.PROGRAMMSET_ADD_ON].isEmpty()) { if (!addOnZip(ps.arr[DatenPset.PROGRAMMSET_ADD_ON])) { // und Tschüss if (!auto) { MVMessageDialog.showMessageDialog(null, "Die Datei wurde nicht importiert!", "Fehler", JOptionPane.ERROR_MESSAGE); } return; } } } if (parent != null) { parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } if (auto) { if (Daten.listePset.addPset(pSet)) { if (setVersion) { MVConfig.add(MVConfig.Configs.SYSTEM_VERSION_PROGRAMMSET, pSet.version); } } } else { DialogImportPset dialog = new DialogImportPset(parent, true, daten, pSet); dialog.setVisible(true); if (dialog.ok) { if (Daten.listePset.addPset(pSet)) { if (setVersion) { MVConfig.add(MVConfig.Configs.SYSTEM_VERSION_PROGRAMMSET, pSet.version); } MVMessageDialog.showMessageDialog(null, pSet.size() + " Programmset importiert!", "Ok", JOptionPane.INFORMATION_MESSAGE); } else { MVMessageDialog.showMessageDialog(null, "Die Datei wurde nicht importiert!", "Fehler", JOptionPane.ERROR_MESSAGE); } } } } private static boolean addOnZip(String datei) { String zielPfad = addsPfad(getPathJar(), "bin"); File zipFile; int timeout = 10_000; //10 Sekunden int n; URLConnection conn; try { if (!GuiFunktionen.istUrl(datei)) { zipFile = new File(datei); if (!zipFile.exists()) { // und Tschüss return false; } if (datei.endsWith(Const.FORMAT_ZIP)) { if (!entpacken(zipFile, new File(zielPfad))) { // und Tschüss return false; } } else { try (FileInputStream in = new FileInputStream(datei); FileOutputStream fOut = new FileOutputStream(GuiFunktionen.addsPfad(zielPfad, datei))) { final byte[] buffer = new byte[1024]; while ((n = in.read(buffer)) != -1) { fOut.write(buffer, 0, n); } } } } else { conn = new URL(datei).openConnection(); conn.setConnectTimeout(timeout); conn.setReadTimeout(timeout); conn.setRequestProperty("User-Agent", Daten.getUserAgent()); if (datei.endsWith(Const.FORMAT_ZIP)) { File tmpFile = File.createTempFile("mediathek", null); tmpFile.deleteOnExit(); try (BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); FileOutputStream fOut = new FileOutputStream(tmpFile)) { final byte[] buffer = new byte[1024]; while ((n = in.read(buffer)) != -1) { fOut.write(buffer, 0, n); } } if (!entpacken(tmpFile, new File(zielPfad))) { // und Tschüss return false; } } else { String file = GuiFunktionen.getDateiName(datei); File f = new File(GuiFunktionen.addsPfad(zielPfad, file)); try (BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); FileOutputStream fOut = new FileOutputStream(f)) { final byte[] buffer = new byte[1024]; while ((n = in.read(buffer)) != -1) { fOut.write(buffer, 0, n); } } } } } catch (Exception ignored) { } return true; } private static boolean entpacken(File archive, File destDir) throws Exception { if (!destDir.exists()) { return false; } try (ZipFile zipFile = new ZipFile(archive)) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); byte[] buffer = new byte[16384]; int len; while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); String entryFileName = entry.getName(); File dir = buildDirectoryHierarchyFor(entryFileName, destDir); if (!dir.exists()) { dir.mkdirs(); } if (!entry.isDirectory()) { try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir, entryFileName))); BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry))) { while ((len = bis.read(buffer)) > 0) { bos.write(buffer, 0, len); } bos.flush(); } } } } return true; } private static File buildDirectoryHierarchyFor(String entryName, File destDir) { int lastIndex = entryName.lastIndexOf('/'); String internalPathToEntry = entryName.substring(0, lastIndex + 1); return new File(destDir, internalPathToEntry); } public static boolean praefixTesten(String str, String uurl, boolean praefix) { //prüfen ob url beginnt/endet mit einem Argument in str //wenn str leer dann true boolean ret = false; String url = uurl.toLowerCase(); String s1 = ""; if (str.isEmpty()) { ret = true; } else { for (int i = 0; i < str.length(); ++i) { if (str.charAt(i) != ',') { s1 += str.charAt(i); } if (str.charAt(i) == ',' || i >= str.length() - 1) { if (praefix) { //Präfix prüfen if (url.startsWith(s1.toLowerCase())) { ret = true; break; } } else //Suffix prüfen if (url.endsWith(s1.toLowerCase())) { ret = true; break; } s1 = ""; } } } return ret; } public static boolean checkPfadBeschreibbar(String pfad) { boolean ret = false; File testPfad = new File(pfad); try { if (!testPfad.exists()) { testPfad.mkdirs(); } if (pfad.isEmpty()) { } else if (!testPfad.isDirectory()) { } else if (testPfad.canWrite()) { File tmpFile = File.createTempFile("mediathek", "tmp", testPfad); tmpFile.delete(); ret = true; } } catch (Exception ignored) { } return ret; } public static boolean programmePruefen(JFrame jFrame, Daten daten) { // prüfen ob die eingestellten Programmsets passen final String PIPE = "| "; final String LEER = " "; final String PFEIL = " -> "; boolean ret = true; String text = ""; for (DatenPset datenPset : Daten.listePset) { ret = true; if (!datenPset.isFreeLine() && !datenPset.isLable()) { // nur wenn kein Lable oder freeline text += "++++++++++++++++++++++++++++++++++++++++++++" + '\n'; text += PIPE + "Programmgruppe: " + datenPset.arr[DatenPset.PROGRAMMSET_NAME] + '\n'; String zielPfad = datenPset.arr[DatenPset.PROGRAMMSET_ZIEL_PFAD]; if (datenPset.progsContainPath()) { // beim nur Abspielen wird er nicht gebraucht if (zielPfad.isEmpty()) { ret = false; text += PIPE + LEER + "Zielpfad fehlt!\n"; } else // Pfad beschreibbar? if (!checkPfadBeschreibbar(zielPfad)) { //da Pfad-leer und "kein" Pfad schon abgeprüft ret = false; text += PIPE + LEER + "Falscher Zielpfad!\n"; text += PIPE + LEER + PFEIL + "Zielpfad \"" + zielPfad + "\" nicht beschreibbar!" + '\n'; } } for (DatenProg datenProg : datenPset.getListeProg()) { // Programmpfad prüfen if (datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD].isEmpty()) { ret = false; text += PIPE + LEER + "Kein Programm angegeben!\n"; text += PIPE + LEER + PFEIL + "Programmname: " + datenProg.arr[DatenProg.PROGRAMM_NAME] + '\n'; text += PIPE + LEER + LEER + "Pfad: " + datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD] + '\n'; } else if (!new File(datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD]).canExecute()) { // dann noch mit RuntimeExec versuchen RuntimeExec r = new RuntimeExec(datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD]); Process pr = r.exec(false /*log*/); if (pr != null) { // dann passts ja pr.destroy(); } else { // läßt sich nicht starten ret = false; text += PIPE + LEER + "Falscher Programmpfad!\n"; text += PIPE + LEER + PFEIL + "Programmname: " + datenProg.arr[DatenProg.PROGRAMM_NAME] + '\n'; text += PIPE + LEER + LEER + "Pfad: " + datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD] + '\n'; if (!datenProg.arr[DatenProg.PROGRAMM_PROGRAMMPFAD].contains(File.separator)) { text += PIPE + LEER + PFEIL + "Wenn das Programm nicht im Systempfad liegt, " + '\n'; text += PIPE + LEER + LEER + "wird der Start nicht klappen!" + '\n'; } } } } if (ret) { //sollte alles passen text += PIPE + PFEIL + "Ok!" + '\n'; } text += "++++++++++++++++++++++++++++++++++++++++++++" + "\n\n\n"; } } new DialogHilfe(jFrame, true, text).setVisible(true); return ret; } }