package tv.danmaku.media.vsl; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import org.apache.http.HttpException; import org.json.JSONException; import org.videolan.vlc.segments.LibVlcVslIndex; import org.videolan.vlc.segments.LibVlcVslSegment; import org.xml.sax.SAXException; import tv.danmaku.media.resource.PlayIndex; import tv.danmaku.media.resource.ResolveException; import tv.danmaku.media.resource.Segment; import tv.danmaku.media.resource.Mrl; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; public class LibVlcVideoSegmentListLoader { private static final int MAX_TRY = 3; public static final String ACCESS_SINA = "sina"; public static final String ACCESS_SINA_INDEX = "sinaindex"; public static final String ACCESS_SINA_SEGMENT = "sinasegment"; public static final String ACCESS_YOUKU = "youku"; public static final String ACCESS_YOUKU_INDEX = "youkuindex"; public static final String ACCESS_YOUKU_SEGMENT = "youkusegment"; public static final String ACCESS_CNTV = "cntv"; public static final String ACCESS_CNTV_INDEX = "cntvindex"; public static final String ACCESS_CNTV_SEGMENT = "cntvsegment"; public static final String ACCESS_SOHU = "sohu"; public static final String ACCESS_SOHU_INDEX = "sohuindex"; public static final String ACCESS_SOHU_SEGMENT = "sohusegment"; public static final String ACCESS_LETV = "letv"; public static final String ACCESS_LETV_INDEX = "letvindex"; public static final String ACCESS_LETV_SEGMENT = "letvsegment"; public static final String ACCESS_VSL = "vsl"; public static final String ACCESS_VSL_INDEX = "vslindex"; public static final String ACCESS_VSL_SEGMENT = "vslsegment"; private WeakReference<Context> mWeakContext; private Mrl mMrl; public String mVlcIndexAccess; public String mVlcSegmentAccess; private String mIndexLock = "lock"; private PlayIndex mPlayIndex; private Bundle mIndexBundle; private PlayIndex.Resolver mResolver; private boolean mIsVslIndex; public LibVlcVideoSegmentListLoader(Context context, PlayIndex.Resolver resolver) { mWeakContext = new WeakReference<Context>(context); mResolver = resolver; } public boolean parseIndexMrl(String mrl) { mMrl = Mrl.parse(mrl); mIsVslIndex = false; String pseduoAccess = mMrl.getPseudoAccess(); if (TextUtils.isEmpty(pseduoAccess)) return false; if (pseduoAccess.equalsIgnoreCase(ACCESS_SINA)) { mVlcIndexAccess = ACCESS_SINA_INDEX; mVlcSegmentAccess = ACCESS_SINA_SEGMENT; } else if (pseduoAccess.equalsIgnoreCase(ACCESS_YOUKU)) { mVlcIndexAccess = ACCESS_YOUKU_INDEX; mVlcSegmentAccess = ACCESS_YOUKU_SEGMENT; } else if (pseduoAccess.equalsIgnoreCase(ACCESS_CNTV)) { mVlcIndexAccess = ACCESS_CNTV_INDEX; mVlcSegmentAccess = ACCESS_CNTV_SEGMENT; } else if (pseduoAccess.equalsIgnoreCase(ACCESS_SOHU)) { mVlcIndexAccess = ACCESS_SOHU_INDEX; mVlcSegmentAccess = ACCESS_SOHU_SEGMENT; } else if (pseduoAccess.equalsIgnoreCase(ACCESS_LETV)) { mVlcIndexAccess = ACCESS_LETV_INDEX; mVlcSegmentAccess = ACCESS_LETV_SEGMENT; } else { mVlcIndexAccess = ACCESS_VSL_INDEX; mVlcSegmentAccess = ACCESS_VSL_SEGMENT; } mMrl.dump(); if (TextUtils.isEmpty(mVlcIndexAccess) || TextUtils.isEmpty(mVlcSegmentAccess)) return false; mIsVslIndex = true; return true; } final public String getIndexMrlForVlcPlayer() { if (!mIsVslIndex) return mMrl.getRawMrl(); return String.format("%s:%s", mVlcIndexAccess, mMrl.getSchemeSpecificPart()); } final public String getSegmentMrlForVlcPlayer(PlayIndex playIndex, int order) { if (!mIsVslIndex) { ArrayList<Segment> segList = playIndex.mSegmentList; if (segList != null && segList.size() > order) { return segList.get(order).mUrl; } } return String.format("%s://%d", mVlcSegmentAccess, order); } public boolean loadIndex(boolean forceReload) { Context context = getContext(); if (context == null) return false; if (!forceReload && getIndexBundle() != null) return true; try { PlayIndex playIndex = mResolver.resolve(context, forceReload, MAX_TRY); if (playIndex == null || playIndex.mSegmentList == null || playIndex.mSegmentList.isEmpty()) return false; Bundle indexBundle = new Bundle(); LibVlcVslIndex.putCount(indexBundle, playIndex.mSegmentList.size()); int order = 0; for (Segment segment : playIndex.mSegmentList) { segment.putIntoVslBundle(indexBundle, order); LibVlcVslSegment.putSegmentMrl(indexBundle, order, getSegmentMrlForVlcPlayer(playIndex, order)); order += 1; } setIndexBundle(indexBundle, playIndex); return true; } catch (IOException e) { e.printStackTrace(); } catch (HttpException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ResolveException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return false; } public Context getContext() { return mWeakContext.get(); } public void setIndexBundle(Bundle indexBundle, PlayIndex playIndex) { synchronized (mIndexLock) { mIndexBundle = indexBundle; mPlayIndex = playIndex; } } public Bundle getIndexBundle() { synchronized (mIndexLock) { return mIndexBundle; } } public PlayIndex getPlayIndex() { synchronized (mIndexLock) { return mPlayIndex; } } }