import org.serviio.library.metadata.*
import org.serviio.library.online.*

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * BetaUitzendinggemistNl content URL extractor plugin v0.1 
 *  
 * @author Appie Mulder
 *
 */
class BetaUitzendinggemistNl extends FeedItemUrlExtractor {
    
    final VALID_FEED_URL = '^http(s)*://beta.uitzendinggemist.nl/.*$'
    String Cookie = ''

    String getExtractorName() {
        return getClass().getName()
    }
    
    boolean extractorMatches(URL feedUrl) {
        return feedUrl ==~ VALID_FEED_URL
    }
    
    ContentURLContainer extractUrl(Map links, PreferredQuality requestedQuality) {
        def linkUrl = links.default
        def contentUrl
        
        def matcher = linkUrl =~ 'http://gemi.st/(\\d+)/?$'
        assert matcher != null
        assert matcher.hasGroup()

        def videoId = matcher[0][1]

        def SecurityCode = getSecurityCode( videoId )
        //println "SecurityCode: $SecurityCode"

        def url1 = new URL("http://player.omroep.nl/xml/metaplayer.xml.php?aflID=" + videoId + "&md5=" + SecurityCode)
        URLConnection conn1 = url1.openConnection()
        conn1.setRequestProperty('Cookie', Cookie);
        conn1.connect()

        String metaxml = conn1.getContent().getText()
        //println "metaxml: $metaxml"

        def packageNode = new XmlParser().parseText( metaxml )
        //println "packageNode: $packageNode"
        
        def strTitle = packageNode.aflevering.tite.text()

        //def asfUrl = find("<stream compressie_kwaliteit='bb' compressie_formaat='wmv'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='bb' compressie_formaat='sl'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='bb' compressie_formaat='mov'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='sb' compressie_formaat='mov'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='sb' compressie_formaat='wmv'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='sb' compressie_formaat='mov'>(.*?)</stream>", metaxml);
        def asfUrl = find("<stream compressie_kwaliteit='std' compressie_formaat='mov'>(.*?)</stream>", metaxml);
        //def asfUrl = find("<stream compressie_kwaliteit='std' compressie_formaat='wvc1'>(.*?)</stream>", metaxml);

        def data1_url = new URL( asfUrl ) //.getText()
        URLConnection data1_conn = data1_url.openConnection()
        data1_conn.connect()
        def data1 = ''
        def asfUrl2 = ''
        if(data1_conn.getContentLength() > 0) {
            data1 = data1_conn.getContent().getText()
            //asfUrl2 = find("href=\"(.*?)\" />", data1);
            asfUrl2 = find("href=\"(.*?)?", data1);
        } else {
            //asfUrl2 = data1_conn.getHeaderField('Location') // + '\"'
            asfUrl2 = data1_conn.getHeaderField('Location')
            //println "asfUrl2: $asfUrl2"
            asfUrl2 = find("(.*?).m4v", asfUrl2 ) + '.m4v'
        }
        //println "data1: $data1"
        //println "asfUrl2: $asfUrl2"

        return new ContentURLContainer(fileType: MediaFileType.VIDEO, contentUrl: asfUrl2)
    }
    
    static void main(args) {
        // this is just to test
        BetaUitzendinggemistNl extractor = new BetaUitzendinggemistNl()

        assert extractor.extractorMatches( new URL("http://beta.uitzendinggemist.nl/7dagen/vandaag.rss") ) 
        assert !extractor.extractorMatches( new URL("http://google.com/feeds/api/standardfeeds/top_rated?time=today") ) 

        Map links = ['default': new URL('http://gemi.st/13071545')] 
        ContentURLContainer result = extractor.extractUrl(links, PreferredQuality.MEDIUM)
        println "Result: $result"
    }
    
    String getSecurityCode(String aid) {
        //
        def url1 = new URL('http://player.omroep.nl/?aflID=' + aid)
        def url2 = new URL('http://player.omroep.nl/js/initialization.js.php?aflID=' + aid)
        
        URLConnection conn1 = url1.openConnection()
        URLConnection conn2 = url2.openConnection()
        conn1.connect()

        String key
        String value
        def x = 1
        while(x > 0) {
            key = conn1.getHeaderFieldKey(x)
            if(key == null) { 
                x = 0
            } else {
                value = conn1.getHeaderField(x)
                //println key + ': ' + value
                if(key.toLowerCase()  == 'set-cookie') {
                    //println ">" + key + ': ' + value
                    if(Cookie.size() > 0) { Cookie += '; '}
                    Cookie += value
                }
                x++
            }            
        }
        conn2.setRequestProperty('Cookie', Cookie);
        conn2.connect()

        def jsbestandinhoud = conn2.getContent().getText()

        String securityCode = find("var securityCode = '(.*?)';", jsbestandinhoud);
    
        return securityCode
    }

    private static String find(String regex, String XMLcontent) {
        Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(XMLcontent);
        if (!m.find()) {
            return null;
        }
        return m.group(1).trim();
    }
    
}