import groovy.json.JsonSlurper
import org.serviio.library.metadata.*
import org.serviio.library.online.*
import org.serviio.util.*
/**
 * WebResource extractor plugin for Walla - nick and nickjr
 * 
 * @author iplem
 * V1 5/1/2012
 *
 * Based on previous Serviio Castalba plugin 
 *
 */
class Walla extends WebResourceUrlExtractor
{
    
    final VALID_FEED_URL = '^http(s)*://(.*?).walla.co.il/\\?w=//(.*?)$'
    
    String getExtractorName() 
    {
        return 'Walla'
    }

    Boolean URLExists(URL fileURL)
    {
        if(((HttpURLConnection) fileURL.openConnection()).getResponseCode() == 404)
        {
            return false
        }
        return true
    }

    boolean extractorMatches(URL feedUrl) 
    {
        return feedUrl ==~ VALID_FEED_URL
    }
    
    WebResourceContainer extractItems(URL resourceUrl, int maxItems) 
    {
        long Refreshi = (30*24*60)
        String secCode
        String rtmpUrl
        String thumbUrl
        String videoTitle
    
        def httpMatcher = resourceUrl.toString() =~ '^http(s)*://(.*?).walla.co.il/\\?w=//(.*?)$'

        String maskUrl = "http://" + httpMatcher[0][2] + ".walla.co.il/?w=//" + httpMatcher[0][3] +"&page="
        String pageUrl = maskUrl +"1"

        def html = new URL(pageUrl).getText()
        def pageMatcher = html =~ '(?s)</h1>(.*?)wp-0-b footerNav'

        String page = pageMatcher[0][1]

        if (page.size() < 100)
        {
            println "No items - returning"
            return null
        }
        def titleMatcher = html =~ '(?s)<title>(.*?)</title>'

        String pageTitle = titleMatcher[0][1].trim()
        //println "\npagetitle = $pageTitle"
        String pageThumb = "http://isc.walla.co.il/w9/t/walla.gif"
        List<WebResourceItem> items = []
        
        def itemsAdded = 0;

        for( int j = 2; j < 10; j++) 
        {
            def videoMatcher = page =~ '(?s).*?src="(.*?)".*?src="(.*?)".*?a href="(.*?)"\\s*?>(.*?)</a>'
            for( int i = 0; i < videoMatcher.size() && (maxItems == -1 || itemsAdded < maxItems) ; i++ ) 
            {
                videoTitle = videoMatcher[i][4].trim()
                //println "Title: $videoTitle\n"
                String linkUrl = "http://nick.walla.co.il/" + videoMatcher[i][3].trim() + "/@@/video/flv_pl&discardAds=1"
                String linkHtml = new URL(linkUrl).getText()

                def rtmpMatcher = linkHtml =~ '(?s).*?<src>(.*?)</src>'
                secCode = rtmpMatcher[0][1].trim()
  
                rtmpUrl = "rtmp://wafla.walla.co.il app=vod playpath=" + secCode 
            
                println "rtmpUrl = $rtmpUrl"
                           
                String Image = videoMatcher[i][2].trim()
                thumbUrl = Image

                if (thumbUrl =~ "gif")
                {
                   Image = videoMatcher[i][1].trim() 
                   thumbUrl = Image
                }

                log("ADDED $videoTitle - $linkUrl")
                //println "thumbUrl = $thumbUrl"
 
                WebResourceItem item = new WebResourceItem(title: videoTitle, additionalInfo: ['resourceUrl':resourceUrl,'secCode':secCode,'rtmpUrl':rtmpUrl,'thumbUrl':thumbUrl,'refreshi':Refreshi])
                items << item
                itemsAdded++            
            }
   
            String npageUrl = maskUrl + j

            if (URLExists(new URL(npageUrl)))
            {
                html = new URL(npageUrl).getText()
                pageMatcher = html =~ '(?s)</h1>(.*?)class="p_'

                if (pageMatcher.size() < 1)
                {
                    println "No items - returning"
                    break
                }

                String npage = pageMatcher[0][1]
                if (npage == page) break
                else page = npage
            }
            else break
        }
        
        return new WebResourceContainer(title: pageTitle, thumbnailUrl: pageThumb, items: items)
    }
    
    ContentURLContainer extractUrl(WebResourceItem item, PreferredQuality requestedQuality) 
    {        
        String videoUrl = item.getAdditionalInfo()['rtmpUrl']
        assert videoUrl != null
        String thumbnailUrl = item.getAdditionalInfo()['thumbUrl']
        assert thumbnailUrl != null
        String resourceUrl = item.getAdditionalInfo()['resourceUrl']
        String secCode = item.getAdditionalInfo()['secCode']
        def cacheKey = resourceUrl + "_" +  secCode
    
        return new ContentURLContainer(fileType: MediaFileType.VIDEO, contentUrl: videoUrl, thumbnailUrl: thumbnailUrl, live: true, cacheKey: cacheKey)
    }
    
    static void main(args) 
    {
        Walla extractor = new Walla()        
        assert extractor.extractorMatches( new URL("http://nickjr.walla.co.il/?w=//1688310") )
        assert !extractor.extractorMatches( new URL("http://google.com/feeds/api/standardfeeds/top_rated?time=today") )
        WebResourceContainer container = extractor.extractItems( new URL("http://nickjr.walla.co.il/?w=//1688310"), -1)
        ContentURLContainer result = extractor.extractUrl(container.getItems()[1], PreferredQuality.MEDIUM)
        print result
    }
}