

import groovy.json.JsonSlurper
import org.serviio.library.online.ContentURLContainer
import org.serviio.library.online.FeedItemUrlExtractor
import org.serviio.library.online.PreferredQuality
/**
 * Content URL extractor plugin for Daily Motion video feeds.
 *
 * @author Petr Nejedly
 *
 */
class DailyMotion extends FeedItemUrlExtractor {
	
	final VALID_FEED_URL = '^(?:https?://)?(?:www\\.)?dailymotion\\.[a-z]{2,3}/rss/.*$'
	
	String getExtractorName() {
		return 'DailyMotion'
	}
	
	public int getVersion() {
		return 3;
	}
	
	boolean extractorMatches(URL feedUrl) {
		return feedUrl ==~ VALID_FEED_URL
	}
	
	ContentURLContainer extractUrl(Map links, PreferredQuality requestedQuality) {
		def linkUrl = links.default
		def contentUrl
		
		def matcher = linkUrl =~ '^.+/video/([^_/]+)_([^/]+)$'
		assert matcher != null
		assert matcher.hasGroup()
		
		def videoId = matcher[0][1]
		
		// load the video web page and look for stream URL
		String pageHtml = linkUrl.getText()
		def playerJsonMatcher = pageHtml =~ '(?sm)var config = (.*);\\s*buildPlayer'
		assert playerJsonMatcher != null
		String playerJson = playerJsonMatcher[0][1]	
		println(playerJson)
		def json = new JsonSlurper().parseText(playerJson)
		Map jsonResult = (Map) json;
		
		Map qualities = jsonResult['metadata']['qualities'].findAll {it.key != 'auto'}.sort {it.key}
		def qualitiesList = qualities.values()
		def quality = findSuitableQuality(new ArrayList(qualities.values()), requestedQuality)
		return new ContentURLContainer(contentUrl: quality['url'], thumbnailUrl: jsonResult['metadata']['poster_url'])
	}
	
	def Map findSuitableQuality(List qualities, PreferredQuality requestedQuality) {
		if(requestedQuality == PreferredQuality.LOW) {
			// worst quality, get the first from the list
			return qualities.head().head()
		} else if (requestedQuality == PreferredQuality.MEDIUM) {
			// get item from the middle
			return qualities.get(Math.floor(qualities.size()/2).toInteger()).head()
		} else {
			// best quality, take the last url
			return qualities.last().head()
		}
	}
	
	static void main(args) {
		// this is just to test
		DailyMotion extractor = new DailyMotion()
		
		assert extractor.extractorMatches( new URL("http://www.dailymotion.com/rss/user/BASKETUSA/1") )
		assert !extractor.extractorMatches( new URL("http://google.com/feeds/api/standardfeeds/top_rated?time=today") )
		
		Map videoLinks = ['default': new URL('http://www.dailymotion.com/video/x3rv3e7_visite-guidee-du-jordan-brand-store-de-toronto_sport')]
		ContentURLContainer result = extractor.extractUrl(videoLinks, PreferredQuality.MEDIUM)
		println "Result: $result"		 
	}
}