package org.openedit.entermedia.fetch; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.openedit.OpenEditException; public class YoutubeParser { private static Log log = LogFactory.getLog(YoutubeParser.class); public Map<String, String> parseUrl( String inYoutubeUrl ) { if( inYoutubeUrl == null || !inYoutubeUrl.contains("youtube.com") ) { return null; } HttpClient client = new org.apache.commons.httpclient.HttpClient(); GetMethod req = new GetMethod(inYoutubeUrl); Map<String, String> result = new HashMap<String, String>(); Map<String, Pattern> patterns = new HashMap<String, Pattern>(); patterns.put("video", Pattern.compile("\"fmt_url_map\"\\s*:\\s*\"[^\"]*(http[^\"]+?)*(http[^\"]+)\"")); patterns.put("thumb", Pattern.compile("\"rv\\.\\d\\.thumbnailUrl\"\\s*:\\s*\"(.+?)\"")); patterns.put("id", Pattern.compile("'VIDEO_ID'\\s*:\\s*'(.+?)'")); patterns.put("assettitle", Pattern.compile("'VIDEO_TITLE'\\s*:\\s*'(.+?)'")); try { client.executeMethod(req); if( req.getStatusCode() < 200 || req.getStatusCode() > 299 ) { throw new OpenEditException("Did not get a 200 status code."); } BufferedReader in = new BufferedReader(new InputStreamReader(req.getResponseBodyAsStream())); do { String line = in.readLine(); if(line == null) { break; } for(String item: patterns.keySet()) { Matcher m = patterns.get(item).matcher(line); if(m.find()) { String value = m.group(m.groupCount()); value = URLDecoder.decode(value, "UTF-8"); if( value != null) { value = value.replace("\\\"", "\""); } result.put(item, value); log.debug("Got " + item + ": " + value); } } } while(true); } catch (Exception e) { log.info("Couldn't get YouTube video: " + e.getLocalizedMessage()); return null; } return result; } public static void main(String[] args) { YoutubeParser ytp = new YoutubeParser(); ytp.parseUrl("http://www.youtube.com/watch?v=pEpQpyKapcQ"); } }