net.chrislongo.hls.Main.java Source code

Java tutorial

Introduction

Here is the source code for net.chrislongo.hls.Main.java

Source

/*
 * Copyright (c) Christopher A Longo
 *
 * 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
 * (at your option) 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 net.chrislongo.hls;

import org.apache.commons.cli.*;

import java.io.File;
import java.io.OutputStream;
import java.io.PrintStream;

public class Main {
    private static final String ARG_KEY = "key";
    private static final String ARG_OUT_FILE = "file";
    private static final String CLI_SYNTAX = "download-hls [options...] <url>";
    private static final String OPT_HELP = "h";
    private static final String OPT_KEY = "k";
    private static final String OPT_KEY_LONG = "force-key";
    private static final String OPT_OUT_FILE = "o";
    private static final String OPT_OUT_FILE_LONG = "output";
    private static final String OPT_SILENT = "s";
    private static final String OPT_OVERWRITE = "y";

    public static void main(String[] args) {
        CommandLine commandLine = parseCommandLine(args);
        String[] commandLineArgs = commandLine.getArgs();

        try {
            String playlistUrl = commandLineArgs[0];
            String outFile = null;
            String key = null;

            if (commandLine.hasOption(OPT_OUT_FILE)) {
                outFile = commandLine.getOptionValue(OPT_OUT_FILE);

                File file = new File(outFile);

                if (file.exists()) {
                    if (!commandLine.hasOption(OPT_OVERWRITE)) {
                        System.out.printf("File '%s' already exists. Overwrite? [y/N] ", outFile);

                        int ch = System.in.read();

                        if (!(ch == 'y' || ch == 'Y')) {
                            System.exit(0);
                        }
                    }

                    file.delete();
                }
            }

            if (commandLine.hasOption(OPT_KEY))
                key = commandLine.getOptionValue(OPT_KEY);

            PlaylistDownloader downloader = new PlaylistDownloader(playlistUrl);

            if (commandLine.hasOption(OPT_SILENT)) {
                System.setOut(new PrintStream(new OutputStream() {
                    public void close() {
                    }

                    public void flush() {
                    }

                    public void write(byte[] b) {
                    }

                    public void write(byte[] b, int off, int len) {
                    }

                    public void write(int b) {
                    }
                }));
            }

            downloader.download(outFile, key);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private static CommandLine parseCommandLine(String[] args) {
        CommandLineParser parser = new PosixParser();
        CommandLine commandLine = null;

        Option help = new Option(OPT_HELP, "help", false, "print this message.");
        Option silent = new Option(OPT_SILENT, "silent", false, "silent mode.");
        Option overwrite = new Option(OPT_OVERWRITE, false, "overwrite output files.");

        Option key = OptionBuilder.withArgName(ARG_KEY).withLongOpt(OPT_KEY_LONG).hasArg()
                .withDescription("force use of the supplied AES-128 key.").create(OPT_KEY);

        Option outFile = OptionBuilder.withArgName(ARG_OUT_FILE).withLongOpt(OPT_OUT_FILE_LONG).hasArg()
                .withDescription("join all transport streams to one file.").create(OPT_OUT_FILE);

        Options options = new Options();

        options.addOption(help);
        options.addOption(silent);
        options.addOption(overwrite);
        options.addOption(key);
        options.addOption(outFile);

        try {
            commandLine = parser.parse(options, args);

            if (commandLine.hasOption(OPT_HELP) || (commandLine.getArgs().length < 1)) {
                new HelpFormatter().printHelp(CLI_SYNTAX, options);
                System.exit(0);
            }

            if (commandLine.hasOption(OPT_KEY)) {
                String optKey = commandLine.getOptionValue(OPT_KEY);

                if (!optKey.matches("[0-9a-fA-F]{32}")) {
                    System.out.printf(
                            "Bad key format: \"%s\". Expected 32-character hex format.\nExample: -key 12ba7f70db4740dec4aab4c5c2c768d9",
                            optKey);
                    System.exit(1);
                }
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            new HelpFormatter().printHelp(CLI_SYNTAX, options);
            System.exit(1);
        }

        return commandLine;
    }
}