import org.serviio.library.metadata.*
import org.serviio.library.online.*

/**
 * YouTube.com content URL extractor plugin. 
 * 
 * Based on youtube_dl Python script (http://rg3.github.com/youtube-dl/)
 *  
 * @author Petr Nejedly
 *
 */
class S4cUrlExtractor extends FeedItemUrlExtractor {

    final VALID_PLAYER_URL = '^((?:https?://)?(?:youtu\\.be/|(?:\\w+\\.)?youtube(?:-nocookie)?\\.com/)(?:(?:(?:v|embed|e)/)|(?:(?:watch(?:_popup)?(?:\\.php)?)?(?:\\?|#!?)(?:.+&)?v=)))?([0-9A-Za-z_-]+)(.+)?$'
    final VALID_FEED_URL = '^http(s)*://.*s4c\\..*$'
	/* Listed in order of quality */
    final availableFormats = ['38', '37', '22', '45', '35', '34', '43', '18', '6', '5', '17', '13']
    
    //def linkUrl = 'http://www.youtube.com/watch?v=fkVyBdvXzpU&feature=youtube_gdata';
    //def linkUrl = 'http://www.youtube.com/watch?v=HYwUQxFYnkc&feature=player_embedded'
    
    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 contentUrl
        def thumbnailUrl
		def expiryDate
def contentHtml

println "link size" + links.size()

println "linkUrl:" + linkUrl


		def connection = linkUrl.openConnection()

		if(connection.responseCode == 200){

			contentHtml = connection.content.text
println "got content" 

		}

		else{
println "not got content" + connection.responseCode

			return null

		}

println "do match" 

		//def streamMatcher = (contentHtml =~ '.*(streamer:.*)\\]\\]')
		def streamer
		def streamMatcher = (contentHtml =~ /.*streamer:.*/)

		assert streamMatcher != null

		if(streamMatcher.size() > 0)
		{
			streamer = streamMatcher[0]
		} else {
println " no match: " 
			return null
		}

streamer=streamer.trim()

def start = streamer.indexOf("\"")
def end = streamer.lastIndexOf("\"")
streamer = streamer.substring(start+1,end)

                def filename
                def fileMatcher = (contentHtml =~ /.*file:.*/)

                assert fileMatcher != null

                if(fileMatcher.size() > 0)
                {
                        filename = fileMatcher[0]
                } else {
println " no match: "
                        return null
                }


def start2 = filename.indexOf("\"")
def end2 = filename.lastIndexOf("\"")
filename=filename.substring(start2+1,end2)

contentUrl = streamer + filename


		
        return new ContentURLContainer(fileType: MediaFileType.VIDEO, contentUrl: contentUrl)
    }
 
    def addParameter(parameterString, parameters, separator) {
        def values = parameterString.split(separator)
        if( values.length == 2 ) {    
             parameters.put(values[0], values[1])
        }
    }   
	
	def sortAvailableFormatUrls(List formatIds, Map sourceMap, Map targetMap) {
		formatIds.each{formatId ->
			if(sourceMap.containsKey(formatId) ) {				
				 targetMap.put(formatId, sourceMap.get(formatId))
			}
		}
	}
    
    static void main(args) {
		// this is just to test
        S4cUrlExtractor extractor = new S4cUrlExtractor()
		
		assert extractor.extractorMatches( new URL("http://www.s4c.co.uk/cymraeg_s4c_atom_programme_feed.xml") )
		assert !extractor.extractorMatches( new URL("http://google.com/feeds/api/standardfeeds/top_rated?time=today") )
		
        Map links = ['alternate': new URL('http://www.s4c.co.uk/clic/c_level2.shtml?programme_id=494864916')] 
        ContentURLContainer result = extractor.extractUrl(links, PreferredQuality.MEDIUM)
        println "Result: $result"
    }
}
