neembuu.release1.externalImpl.linkhandler.SaveVideoYoutubeLinkHandlerProvider.java Source code

Java tutorial

Introduction

Here is the source code for neembuu.release1.externalImpl.linkhandler.SaveVideoYoutubeLinkHandlerProvider.java

Source

/*
 * Copyright (C) 2014 davidepastore
 *
 * 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 neembuu.release1.externalImpl.linkhandler;

import davidepastore.StringUtils;
import java.net.URLEncoder;
import java.util.logging.Level;
import java.util.logging.Logger;
import neembuu.release1.api.file.OnlineFile;
import neembuu.release1.api.file.PropertyProvider;
import neembuu.release1.api.linkhandler.LinkHandler;
import neembuu.release1.api.linkhandler.LinkHandlerProvider;
import neembuu.release1.api.linkhandler.TrialLinkHandler;
import neembuu.release1.api.log.LoggerUtil;
import neembuu.release1.defaultImpl.external.ELHProvider;
import neembuu.release1.defaultImpl.file.BasicOnlineFile;
import neembuu.release1.defaultImpl.file.BasicPropertyProvider;
import neembuu.release1.defaultImpl.linkhandler.BasicLinkHandler;
import neembuu.release1.defaultImpl.linkhandler.Utils;
import neembuu.release1.httpclient.NHttpClient;
import neembuu.release1.httpclient.utils.NHttpClientUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * Youtube link handler provider based on save-video.com
 * @author davidepastore
 */
@ELHProvider(checkingRegex = YoutubeLinkHandlerProvider.REG_EXP)
public class SaveVideoYoutubeLinkHandlerProvider implements LinkHandlerProvider {

    private static final Logger LOGGER = LoggerUtil.getLogger(SaveVideoYoutubeLinkHandlerProvider.class.getName()); // all logs go into an html file

    @Override
    public TrialLinkHandler tryHandling(final String url) {
        return new YoutubeLinkHandlerProvider.YT_TLH(url);
    }

    @Override
    public LinkHandler getLinkHandler(TrialLinkHandler tlh) throws Exception {
        if (!(tlh instanceof YoutubeLinkHandlerProvider.YT_TLH) || !tlh.canHandle()) {
            return null;
        }
        BasicLinkHandler.Builder linkHandlerBuilder = saveVideoExtraction(tlh);
        return linkHandlerBuilder.build();
    }

    /**
     * Use http://www.save-video.com service to get the urls.
     * @param url the youtube url.
     * @return A BasicLinkHandler.Builder with all the urls found for this video.
     */
    private BasicLinkHandler.Builder saveVideoExtraction(TrialLinkHandler tlh) throws Exception {
        return saveVideoExtraction(tlh, 0);
    }

    private BasicLinkHandler.Builder saveVideoExtraction(TrialLinkHandler tlh, int retryCount) throws Exception {
        String url = tlh.getReferenceLinkString();
        BasicLinkHandler.Builder linkHandlerBuilder = BasicLinkHandler.Builder.create();

        try {
            DefaultHttpClient httpClient = NHttpClient.getNewInstance();
            String requestUrl = "http://www.save-video.com/download.php?url=" + URLEncoder.encode(url, "UTF-8");

            final String responseString = NHttpClientUtils.getData(requestUrl, httpClient);

            //Set the group name as the name of the video
            String nameOfVideo = getVideoName(url);

            String fileName = "text";

            linkHandlerBuilder.setGroupName(nameOfVideo);

            long c_duration = -1;

            Document doc = Jsoup.parse(responseString);

            Elements elements = doc.select(".sv-download-links ul li a");

            for (Element element : elements) {
                String singleUrl = element.attr("href");

                if (!singleUrl.startsWith("DownloadFile.php")) {
                    fileName = element.text();
                    singleUrl = Utils.normalize(singleUrl);
                    LOGGER.log(Level.INFO, "Normalized URL: {0}", singleUrl);
                    long length = NHttpClientUtils.calculateLength(singleUrl, httpClient);

                    //LOGGER.log(Level.INFO,"Length: " + length);

                    if (length <= 0) {
                        continue;
                        /*skip this url*/ }

                    BasicOnlineFile.Builder fileBuilder = linkHandlerBuilder.createFile();

                    try { // finding video/audio length
                        //                        String dur = StringUtils.stringBetweenTwoStrings(singleUrl, "dur=", "&");
                        //                        long duration = (int)(Double.parseDouble(dur)*1000);
                        //                        if(c_duration < 0 ){ c_duration = duration; }
                        //                        fileBuilder.putLongPropertyValue(PropertyProvider.LongProperty.MEDIA_DURATION_IN_MILLISECONDS, duration);
                        //                        LOGGER.log(Level.INFO,"dur="+dur);
                    } catch (NumberFormatException a) {
                        // ignore
                    }

                    try { // finding the quality short name
                        //                        String type = fileName.substring(fileName.indexOf("(")+1);
                        String type = fileName;
                        fileBuilder.putStringPropertyValue(PropertyProvider.StringProperty.VARIANT_DESCRIPTION,
                                type);
                        LOGGER.log(Level.INFO, "type={0}", type);
                    } catch (Exception a) {
                        a.printStackTrace();
                    }

                    fileName = nameOfVideo + " " + fileName;

                    fileBuilder.setName(fileName).setUrl(singleUrl).setSize(length).next();
                }
            }

            for (OnlineFile of : linkHandlerBuilder.getFiles()) {
                long dur = of.getPropertyProvider()
                        .getLongPropertyValue(PropertyProvider.LongProperty.MEDIA_DURATION_IN_MILLISECONDS);
                if (dur < 0 && c_duration > 0 && of.getPropertyProvider() instanceof BasicPropertyProvider) {
                    ((BasicPropertyProvider) of.getPropertyProvider()).putLongPropertyValue(
                            PropertyProvider.LongProperty.MEDIA_DURATION_IN_MILLISECONDS, c_duration);
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return linkHandlerBuilder;
    }

    /**
     * Returns the name of the video.
     * @param url The url of the video.
     * @return Returns the title of the video.
     */
    private String getVideoName(String url) throws Exception {
        final String responseString = NHttpClientUtils.getData(url, NHttpClient.getNewInstance());
        Document doc = Jsoup.parse(responseString);
        return doc.select("meta[name=title]").attr("content");
    }

}