All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moviejukebox.writer.MovieNFOWriter Maven / Gradle / Ivy

There is a newer version: 2.9
Show newest version
/*
 *      Copyright (c) 2004-2012 YAMJ Members
 *      http://code.google.com/p/moviejukebox/people/list
 *
 *      Web: http://code.google.com/p/moviejukebox/
 *
 *      This software is licensed under a Creative Commons License
 *      See this page: http://code.google.com/p/moviejukebox/wiki/License
 *
 *      For any reuse or distribution, you must make clear to others the
 *      license terms of this work.
 */
package com.moviejukebox.writer;

import com.moviejukebox.model.*;
import com.moviejukebox.tools.*;
import java.io.File;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 *
 * @author stuart.boston
 */
public class MovieNFOWriter {

    private static final Logger logger = Logger.getLogger(MovieNFOWriter.class);
    private static final String logMessage = "MovieNFOWriter: ";
    private static boolean writeSimpleNfoFiles = PropertiesUtil.getBooleanProperty("filename.nfo.writeSimpleFiles", Boolean.FALSE.toString());
    private static boolean extractCertificationFromMPAA = PropertiesUtil.getBooleanProperty("imdb.getCertificationFromMPAA", Boolean.TRUE.toString());
    private static boolean enablePeople = PropertiesUtil.getBooleanProperty("mjb.people", Boolean.FALSE.toString());

    /**
     * Write a NFO file for the movie using the data gathered
     *
     * @param jukebox
     * @param movie
     */
    public static void writeNfoFile(Jukebox jukebox, Movie movie) {
        // Don't write NFO files for sets or extras
        if (movie.isSetMaster() || movie.isExtra()) {
            return;
        }

        Document docNFO;
        Element eRoot, eRatings, eCredits, eDirectors, eActors;

        try {
            docNFO = DOMHelper.createDocument();
        } catch (ParserConfigurationException error) {
            logger.warn(logMessage + "Failed to create NFO file for " + movie.getBaseFilename());
            logger.error(SystemTools.getStackTrace(error));
            return;
        }

        String nfoFolder = StringTools.appendToPath(jukebox.getJukeboxTempLocationDetails(), "NFO");
        (new File(nfoFolder)).mkdirs();
        File tempNfoFile = new File(StringTools.appendToPath(nfoFolder, movie.getBaseName() + ".nfo"));

        logger.debug(logMessage + "Writing " + (writeSimpleNfoFiles ? "simple " : "") + "NFO file for " + movie.getBaseName() + ".nfo");
        FileTools.addJukeboxFile(tempNfoFile.getName());

        // Define the root element
        if (movie.isTVShow()) {
            eRoot = docNFO.createElement(MovieNFOReader.TYPE_TVSHOW);
        } else {
            eRoot = docNFO.createElement(MovieNFOReader.TYPE_MOVIE);
        }
        docNFO.appendChild(eRoot);

        for (String site : movie.getIdMap().keySet()) {
            DOMHelper.appendChild(docNFO, eRoot, "id", movie.getId(site), "moviedb", site);
        }

        if (!writeSimpleNfoFiles) {
            if (StringTools.isValidString(movie.getTitle())) {
                DOMHelper.appendChild(docNFO, eRoot, "title", movie.getTitle());
            }

            if (StringTools.isValidString(movie.getOriginalTitle())) {
                DOMHelper.appendChild(docNFO, eRoot, "originaltitle", movie.getOriginalTitle());
            }

            if (StringTools.isValidString(movie.getTitleSort())) {
                DOMHelper.appendChild(docNFO, eRoot, "sorttitle", movie.getTitleSort());
            }

            if (StringTools.isValidString(movie.getYear())) {
                DOMHelper.appendChild(docNFO, eRoot, "year", movie.getYear());
            }

            if (StringTools.isValidString(movie.getOutline())) {
                DOMHelper.appendChild(docNFO, eRoot, "outline", movie.getOutline());
            }

            if (StringTools.isValidString(movie.getPlot())) {
                DOMHelper.appendChild(docNFO, eRoot, "plot", movie.getPlot());
            }

            if (StringTools.isValidString(movie.getTagline())) {
                DOMHelper.appendChild(docNFO, eRoot, "tagline", movie.getTagline());
            }

            if (StringTools.isValidString(movie.getRuntime())) {
                DOMHelper.appendChild(docNFO, eRoot, "runtime", movie.getRuntime());
            }

            if (StringTools.isValidString(movie.getReleaseDate())) {
                DOMHelper.appendChild(docNFO, eRoot, "premiered", movie.getReleaseDate());
            }

            if (StringTools.isValidString(movie.getShowStatus())) {
                DOMHelper.appendChild(docNFO, eRoot, "showStatus", movie.getReleaseDate());
            }

            if (movie.getRating() >= 0) {
                eRatings = docNFO.createElement("ratings");
                eRoot.appendChild(eRatings);

                for (String site : movie.getRatings().keySet()) {
                    DOMHelper.appendChild(docNFO, eRatings, "rating", String.valueOf(movie.getRating(site)), "moviedb", site);
                }
            }

            if (StringTools.isValidString(movie.getCertification())) {
                if (extractCertificationFromMPAA) {
                    DOMHelper.appendChild(docNFO, eRoot, "mpaa", movie.getCertification());
                } else {
                    DOMHelper.appendChild(docNFO, eRoot, "certification", movie.getCertification());
                }
            }

            if (!movie.getGenres().isEmpty()) {
                for (String genre : movie.getGenres()) {
                    DOMHelper.appendChild(docNFO, eRoot, "genre", genre);
                }
            }

            if (StringTools.isValidString(movie.getCompany())) {
                DOMHelper.appendChild(docNFO, eRoot, "company", movie.getCompany());
            }

            if (StringTools.isValidString(movie.getCountry())) {
                DOMHelper.appendChild(docNFO, eRoot, "country", movie.getCountry());
            }

            /*
             * Process the people information from the video If we are using people scraping, use that information,
             * otherwise revert to the standard people
             */
            if (enablePeople) {
                eActors = docNFO.createElement("actor");
                eCredits = docNFO.createElement("credits");
                eDirectors = docNFO.createElement("directors");
                int countActors = 0;
                int countCredits = 0;
                int countDirectors = 0;

                for (Filmography person : movie.getPeople()) {
                    if (person.getDepartment().equalsIgnoreCase(Filmography.DEPT_ACTORS)) {
                        countActors++;
                        DOMHelper.appendChild(docNFO, eActors, "name", person.getName());
                        DOMHelper.appendChild(docNFO, eActors, "role", person.getJob());
                    } else if (person.getDepartment().equalsIgnoreCase(Filmography.DEPT_DIRECTING)) {
                        countDirectors++;
                        DOMHelper.appendChild(docNFO, eDirectors, "director", person.getName());
                    } else {
                        // Add the person to the misc credits section
                        countCredits++;
                        DOMHelper.appendChild(docNFO, eCredits, person.getJob().toLowerCase(), person.getName());
                    }
                }

                // Only add the actors section if there were any
                if (countActors > 0) {
                    eRoot.appendChild(eActors);
                }

                // Only add the directors section if there were any
                if (countDirectors > 0) {
                    eRoot.appendChild(eDirectors);
                }

                // Only add the credits section if there were any
                if (countCredits > 0) {
                    eRoot.appendChild(eCredits);
                }
            } else {
                if (!movie.getCast().isEmpty()) {
                    eActors = docNFO.createElement("actor");
                    for (String actor : movie.getCast()) {
                        DOMHelper.appendChild(docNFO, eActors, "name", actor);
                        DOMHelper.appendChild(docNFO, eActors, "role", Filmography.DEPT_ACTORS);
                    }
                    eRoot.appendChild(eActors);
                }

                if (!movie.getWriters().isEmpty()) {
                    eCredits = docNFO.createElement("credits");
                    for (String writerCredit : movie.getWriters()) {
                        DOMHelper.appendChild(docNFO, eCredits, "writer", writerCredit);
                    }
                    eRoot.appendChild(eCredits);
                }

                if (!movie.getDirectors().isEmpty()) {
                    eDirectors = docNFO.createElement("directors");
                    for (String director : movie.getDirectors()) {
                        DOMHelper.appendChild(docNFO, eDirectors, "director", director);
                    }
                    eRoot.appendChild(eDirectors);
                }
            }

            // Add the fileinfo format
            {
                Element eFileinfo = docNFO.createElement("fileinfo");
                Element eStreamDetails = docNFO.createElement("streamdetails");

                Element eCodec;
                for (Codec codec : movie.getCodecs()) {
                    if (codec.getCodecType() == CodecType.AUDIO) {
                        eCodec = docNFO.createElement("audio");
                        if (StringTools.isValidString(codec.getCodecLanguage())) {
                            DOMHelper.appendChild(docNFO, eCodec, "language", codec.getCodecLanguage());
                        }
                        if (StringTools.isValidString(codec.getCodecBitRate())) {
                            DOMHelper.appendChild(docNFO, eCodec, "bitrate", codec.getCodecBitRate());
                        }
                    } else {
                        eCodec = docNFO.createElement("video");
                        DOMHelper.appendChild(docNFO, eCodec, "aspect", movie.getAspectRatio());
                        String movieResolution = movie.getResolution();
                        if (StringTools.isValidString(movieResolution) && movieResolution.contains("x")) {
                            int locX = movieResolution.indexOf('x');
                            if (locX > 0) {
                                DOMHelper.appendChild(docNFO, eCodec, "width", movieResolution.substring(0, locX));
                                DOMHelper.appendChild(docNFO, eCodec, "height", movieResolution.substring(locX + 1));
                            }
                        }
                    }
                    DOMHelper.appendChild(docNFO, eCodec, "codec", codec.getCodec());
                    eStreamDetails.appendChild(eCodec);
                }

                eFileinfo.appendChild(eStreamDetails);


                eRoot.appendChild(eFileinfo);

            }
        }   // End of detailed NFO

        // Write out the episode details for any tv show files
        if (movie.isTVShow()) {
            for (MovieFile episodeFile : movie.getFiles()) {
                createEpisodeDetails(episodeFile, docNFO, eRoot);
            }
        }

        DOMHelper.writeDocumentToFile(docNFO, tempNfoFile.getAbsolutePath());

    }

    /**
     * Create an episode detail node for the NFO file This may actually create more than one node dependent on the
     * number of parts in the file
     *
     * @param episode
     * @param docNFO
     * @param eRoot
     */
    private static void createEpisodeDetails(MovieFile episode, Document docNFO, Element eRoot) {

        for (int part = episode.getFirstPart(); part <= episode.getLastPart(); part++) {
            Element eEpDetails = docNFO.createElement(MovieNFOReader.TYPE_EPISODE);

            appendValid(docNFO, eEpDetails, "title", episode.getTitle(part));
            appendValid(docNFO, eEpDetails, "rating", episode.getRating(part));
            appendValid(docNFO, eEpDetails, "season", String.valueOf(episode.getSeason()));
            appendValid(docNFO, eEpDetails, "episode", String.valueOf(part));
            appendValid(docNFO, eEpDetails, "plot", episode.getPlot(part));
            appendValid(docNFO, eEpDetails, "aired", episode.getFirstAired(part));

            appendValid(docNFO, eEpDetails, "airsAfterSeason", episode.getAirsAfterSeason(part));
            appendValid(docNFO, eEpDetails, "airsBeforeEpisode", episode.getAirsBeforeEpisode(part));
            appendValid(docNFO, eEpDetails, "airsBeforeSeason", episode.getAirsBeforeSeason(part));

            eRoot.appendChild(eEpDetails);
        }
    }

    /**
     * Only add the node if the value is valid
     *
     * @param docNFO
     * @param eElement
     * @param key
     * @param value
     */
    private static void appendValid(Document docNFO, Element eElement, String key, String value) {
        if (StringTools.isValidString(value)) {
            DOMHelper.appendChild(docNFO, eElement, key, value);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy