import groovy.util.Node

import org.serviio.library.metadata.*
import org.serviio.library.online.*
import org.serviio.util.*

import java.security.MessageDigest

/**
 * Content URL extractor plugin for TF1
 * 
 * List of RSS : http://www.tf1.fr/rss/
 * RSS sample : http://www.tf1.fr/xml/rss/0,,988,00.xml
 *
 * @author Illico
 *
 * Version : 1.2
 */
class TF1 extends FeedItemUrlExtractor {
	
	final VALID_FEED_URL = '^http://www.tf1.fr/xml/rss/.*.xml$'
	final DOMAIN = "www.wat.tv"
	final DOMAIN1 = "videos.tf1.fr"
	final URLPLAYER  = "http://www.wat.tv/images/v40/PlayerWat.swf?revision=4.1.017.23"
	final URLPLAYER1 = "http://www.wat.tv/images/v40/loaderexport.swf"
	
	String getExtractorName() {
		return getClass().getName()
	}
	
	boolean extractorMatches(URL feedUrl) {
		return feedUrl ==~ VALID_FEED_URL
	}
	
	ContentURLContainer extractUrl(Map links, PreferredQuality requestedQuality) {
		def linkUrl = links.alternate != null ? links.alternate : links.default
		def webPage = linkUrl.getText()
		// ThumbnailUrl
		def matcher1 = webPage =~ '<meta property="og:image" content="(.*?)"'
		assert matcher1 != null, log("Error: Cette page ne contient pas de vignette");
		def ThumbnailUrl = matcher1[0][1].toString()
		// Video Url
		def matcher2 = webPage =~ '<meta property="og:url" content="(.*?)"'
		assert matcher2 != null, log("Error(url): Cette page ne contient pas d'Url");
		def VideoUrl = matcher2[0][1].toString()
		// Video Id
		def matcher3 = webPage =~ 'WATPlayer.showSyndicated.*,mediaId :(\\d*?),'
		assert matcher3 != null, log("Error(VideoId): Cette page ne contient pas d'Url");
		def VideoId= matcher3[0][1].toString()
		
		// GET Video Info
		String VideoInfoUrl = "http://" + DOMAIN + "/interface/contentv3/${VideoId}"
		log("VideoInfoUrl : $VideoInfoUrl"); println "VideoInfoUrl : $VideoInfoUrl"
		def VideoInfoPage = new URL(VideoInfoUrl).getText()
		// fileId
		def matcher4 = VideoInfoPage =~ 'files":\\[\\{"id":(\\d*?),"'
		assert matcher4 != null, log("Error(fileId): Ce contenu n'est pas disponible, il est probablement en cours d'encodage");
		def fileId = matcher4[0][1].toString()
		log("fileId : $fileId"); println "fileId : $fileId"
		// isHD
		def isHD
		def matcher5 = VideoInfoPage =~ '"hasHD":(.*?)\\}\\],'
		if (matcher5.getCount() > 0){
			isHD = matcher5[0][1].toString()
			} else {
			isHD = "no"
			}
		log("isHD : $isHD"); println "isHD : $isHD"
		// GET token in MD5
		MessageDigest digest = MessageDigest.getInstance("MD5")
		def watURL
		if ( ( isHD == "true" ) && (requestedQuality == PreferredQuality.HIGH)){
			watURL = "/webhd/" + fileId
			} else {
			watURL = "/web/" + fileId
			}
		def key = "9b673b13fa4682ed14c3cfa5af5310274b514c4133e9b3a81e6e3aba00912564"		
		def dthex = String.format("%X", (System.currentTimeMillis()/1000).toInteger())
		digest.update((key + watURL + dthex).bytes)
		BigInteger big = new BigInteger(1,digest.digest())		
		String md5 = big.toString(16).padLeft(32,"0")
		def token = md5 + "/" + dthex
		// GET Content Url
		def url4videoPath
		def contentUrl
		if ( ( isHD == "true" ) && (requestedQuality == PreferredQuality.HIGH)){
			url4videoPath = "http://" + DOMAIN + "/get/webhd/" + fileId + "?token=" + token + "&domain=" + DOMAIN1 + "&context=swfpu&country=FR&getURL=1&version=LNX%2011,1,102,55"
			} else {
			url4videoPath = "http://" + DOMAIN + "/get/web/" + fileId + "?token=" + token + "&domain=" + DOMAIN1 + "&context=swfpu&country=FR&getURL=1&version=LNX%2011,1,102,55"    
			}
		log("url4videoPath : $url4videoPath"); println "url4videoPath : $url4videoPath"
		def rtmpUrlpage = (new URL(url4videoPath)).getText()
		if ( rtmpUrlpage.startsWith('rtmp') ) {
			def rtmpUrlmatcher = rtmpUrlpage.split(":")
			def rtmpprotocol = rtmpUrlmatcher[0].split(",")
			def rtmpServermatcher = rtmpUrlpage.split("/")
			def RTMP_Server = rtmpServermatcher[2] + ":80/" + rtmpServermatcher[3] // wsel3.wat.tv, wske.wat.tv
			contentUrl = rtmpprotocol[0] + "://" + RTMP_Server + " app=" + rtmpServermatcher[3] + " swfUrl=" + URLPLAYER + " playpath=mp4:" + rtmpUrlmatcher[2] + " swfVfy=1"
			println "contentUrl(rtmp) : " + contentUrl
			} else {
		    contentUrl = rtmpUrlpage
			println "contentUrl(http) : " + contentUrl
			}
		def cacheKey = getClass().getName() + "_${fileId}_${requestedQuality}"
		return new ContentURLContainer(contentUrl: contentUrl, thumbnailUrl: ThumbnailUrl, expiresImmediately: true, cacheKey : cacheKey)
	}
	
	static void main(args) {
		// this is just to test
		TF1 extractor = new TF1()
		Map videoLinks = ['default': new URL("http://rss.feedsportal.com/c/32788/f/524027/s/1bd60791/l/0Lvideos0Btf10Bfr0Csept0Ea0Ehuit0Cmaud0E590Eans0Eraconte0Esa0Egarde0Ea0Evue0Etraumatisante0E69350A120Bhtml/story01.htm")] 
		
		println "Name : " + extractor.getExtractorName();
		println "TestMatch : " + extractor.extractorMatches( new URL("http://www.tf1.fr/xml/rss/0,,987,00.xml"));
		println "**** HIGH ****";extractor.extractUrl(videoLinks, PreferredQuality.HIGH);
		println "**** MEDIUM ****";extractor.extractUrl(videoLinks, PreferredQuality.MEDIUM);
		println "**** LOW ****";extractor.extractUrl(videoLinks, PreferredQuality.LOW);
	}
}