package org.jcodec.player.filters.http; import static org.jcodec.player.filters.http.HttpUtils.getHttpClient; import static org.jcodec.player.filters.http.HttpUtils.privilegedExecute; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.apache.http.util.EntityUtils; import org.jcodec.player.filters.MediaInfo; import org.jcodec.player.filters.MediaInfo.VideoInfo; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * A media resource exposed via JCodec streaming * * @author The JCodec project * */ public class HttpMedia { private List<HttpPacketSource> tracks = new ArrayList<HttpPacketSource>(); private HttpPacketSource videoTrack; private List<HttpPacketSource> audioTracks = new ArrayList<HttpPacketSource>(); public HttpMedia(URL url, File cacheWhere) throws IOException { cacheWhere = new File(cacheWhere, url.getHost() + "_" + url.getPath().replace("/", "_")); String data = requestInfo(url, getHttpClient(url.toExternalForm())); MediaInfo[] mediaInfos = MediaInfoParser.parseMediaInfos(data); for (int i = 0; i < mediaInfos.length; i++) { if (mediaInfos[i] == null) continue; try { HttpPacketSource ps = new HttpPacketSource(url.toExternalForm() + "/" + i, new File(cacheWhere + "_" + i), mediaInfos[i]); tracks.add(ps); if (mediaInfos[i] instanceof VideoInfo) videoTrack = ps; else audioTracks.add(ps); } catch (IOException e) { e.printStackTrace(); } } } private String requestInfo(URL url, HttpClient client) throws IOException { HttpGet get = new HttpGet(url.toExternalForm()); get.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES); HttpResponse response = privilegedExecute(client, get); if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toString(response.getEntity()); } else throw new IOException("Could not get the media info [" + url.toExternalForm() + "]:" + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase()); } public HttpPacketSource getVideoTrack() { return videoTrack; } public List<HttpPacketSource> getAudioTracks() { return audioTracks; } }