import org.serviio.library.online.WebResourceUrlExtractor
import org.serviio.library.online.WebResourceContainer
import org.serviio.library.online.ContentURLContainer
import org.serviio.library.online.WebResourceItem
import org.serviio.library.online.PreferredQuality
import org.serviio.library.metadata.MediaFileType
/**
 * WebResource extractor Serviio plugin for TELEFE <br/>
 * <b>version</b> 1.0
 *
 * @author Hernan Bazan
 * @since JDK 1.6, Groovy 1.8.6
 */
class TELEFE extends WebResourceUrlExtractor{
    ////////////////////////////////////////////[Constants]////////////////////////////////////////////
    final static VALID_WEB_RESOURCE_URL                     = '^(?:http?://)?(?:www\\.)?telefe.com.*'
    final static DEFAULT_EPISODE_DOMAIN                     = "http://telefe.com.ar"
    final static DEFAULT_VIDEO_DOMAIN                       = "http://repositoriovideo-streaming.educ.ar"
    final static USER_AGENT                                 = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1'
    final static NODEID_REGEX                               = /(?s)nodeId = "(.*?)"/
    final static EPISODE_REGEX                              = /ImageURL\\":\\"(.[^\\]*)\\",\\"Title\\":\\"(.[^\\]*)\\",\\"Link\\":\\"(.[^\\]*)\\",\\"Content/
    final static VIDEO_URL_REGEX                            = /file\s:'(.[^']*)'},\{file\s:'(.[^']*)/
    /////////////////////////////////////////////[Methods]/////////////////////////////////////////////
    @Override
    protected WebResourceContainer extractItems(URL url, int i) {
        def videoURLsSet = retrieveURLs(url);
        return new WebResourceContainer(title: url.toString(), items: videoURLsSet)
    }
    List<WebResourceItem> retrieveURLs(URL url) {
        Set<String> pages = new HashSet<String>();
        List<WebResourceItem> items = []
        String pageSource = openURL(url, USER_AGENT)
        String nodeId = ((pageSource=~NODEID_REGEX))[0][1].toString().trim();
        URL jsnUri = new URL("http://telefe.com/umbraco/surface/TelefeMicrositiosSurface/GetVerMas?categoryId=11&nodeId="+nodeId+"&page=1")
        String jsn = openURL(jsnUri, USER_AGENT)
        (jsn=~EPISODE_REGEX).each {
            Map<String,String> additionalInfo = new HashMap<String, String>();
            additionalInfo.put("thumbnailURL",it[1])
            URL episodeUrl = new URL(it[3])
            String episode = openURL(episodeUrl, USER_AGENT)
            additionalInfo.put("videoURL",((episode=~VIDEO_URL_REGEX))[0][2].toString().trim());
                   
            items << new WebResourceItem(title: it[2], additionalInfo: additionalInfo)
        }
        return items;
    }
    @Override
    protected ContentURLContainer extractUrl(WebResourceItem webResourceItem, PreferredQuality preferredQuality) {
        log(String.format("[%s] Starting video URL extraction for %s",getExtractorName(), webResourceItem))
        ContentURLContainer contentURLContainer = new ContentURLContainer();
        try{
            contentURLContainer.setContentUrl(webResourceItem.getAdditionalInfo().get("videoURL"))
            contentURLContainer.setThumbnailUrl(webResourceItem.getAdditionalInfo().get("thumbnailURL"))
            return contentURLContainer
        }catch (IndexOutOfBoundsException e){
            log.error(String.format("%s , Failed to create resource item for URL: %s",getExtractorName(), it), log.isDebugEnabled()? e:null)
        }
        return null
    }
    @Override
    boolean extractorMatches(URL url) {
        return url ==~ VALID_WEB_RESOURCE_URL
    }

    @Override
    String getExtractorName() {
        return getClass().getName()
    }
    static void main(args) {
        //def TestUrl = new URL("http://telefe.com/avenida-brasil/capitulos-completos")
        def TestUrl = new URL("http://telefe.com/peligro-sin-codificar/capitulos-completos/")
        TELEFE extractor = new TELEFE()
        WebResourceContainer container = extractor.extractItems(TestUrl, -1);
        println "PluginName               : " + extractor.getExtractorName();
        println "TestMatch                : " + extractor.extractorMatches(TestUrl);
        container.getItems().each {
            println "URL                  : " + extractor.extractUrl(it, PreferredQuality.HIGH)
        }
    }
}