package mediathek.mac;
import mSearch.daten.DatenFilm;
import mSearch.tool.Log;
import mediathek.config.Daten;
import mediathek.daten.DatenDownload;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;
import javax.swing.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
/**
* Writes spotlight comments to the downloaded file on OS X.
*/
public class SpotlightCommentWriter {
private final Daten daten;
public SpotlightCommentWriter() {
daten = Daten.getInstance();
}
/**
* Log that MV wasn´t used via the official mac app.
* This is relevant to know for bug reports.
*/
private void logUnofficialMacAppUse() {
Log.errorLog(915263987, "MV wird NICHT über die offizielle Mac App genutzt.");
}
/**
* This will write the content of the film description into the OS X Finder Info Comment Field.
* This enables Spotlight to search for these tags.
*
* @param datenDownload The download information object
*/
public void writeComment(final DatenDownload datenDownload) {
if (datenDownload.film == null) {
// kann bei EinmalDownloads nach einem Neuladen der Filmliste/Programmneustart der Fall sein
return;
}
final Path filmPath = Paths.get(datenDownload.arr[DatenDownload.DOWNLOAD_ZIEL_PFAD_DATEINAME]);
if (Files.exists(filmPath)) {
final String strFilePath = filmPath.toString();
String strComment = datenDownload.film.arr[DatenFilm.FILM_BESCHREIBUNG];
if (strComment != null) {
//no need to write spotlight data when there is no description...
if (strComment.isEmpty()) {
return;
}
//replace quotation marks...
strComment = strComment.replace("\"", "\\\"");
final String script = "tell application \"Finder\"\n"
+ "set my_file to POSIX file \"" + strFilePath + "\" as alias\n"
+ "set comment of my_file to \"" + strComment + "\"\n"
+ "end tell\n";
try {
final ProcessBuilder builder = new ProcessBuilder("/usr/bin/osascript", "-e");
builder.command().add(script);
builder.start();
} catch (Exception ex) {
if (daten.getMediathekGui() != null) {
SwingUtilities.invokeLater(() -> {
final ErrorInfo info = new ErrorInfo(null,
"<html>Es trat ein Fehler beim Schreiben des Spotlight-Kommentars auf.<br>" +
"Sollte dieser häufiger auftreten kontaktieren Sie bitte " +
"das Entwicklerteam.</html>",
null,
null,
ex,
Level.SEVERE,
null);
JXErrorPane.showDialog(daten.getMediathekGui(), info);
});
}
Log.errorLog(915263987, "Fehler beim Spotlight schreiben" + filmPath.toString());
//AppleScript may not be available if user does not use the official MacApp.
//We need to log that as well if there are error reports.
try {
if (!System.getProperty("OSX_OFFICIAL_APP").equalsIgnoreCase("true")) {
logUnofficialMacAppUse();
}
} catch (NullPointerException ignored) {
logUnofficialMacAppUse();
}
}
}
}
}
}