1 /* 2 * Copyright (C) 2013 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.leanback; 18 19 import android.content.Context; 20 import android.util.Log; 21 22 import org.json.JSONArray; 23 import org.json.JSONException; 24 import org.json.JSONObject; 25 26 import java.io.BufferedInputStream; 27 import java.io.BufferedReader; 28 import java.io.IOException; 29 import java.io.InputStream; 30 import java.io.InputStreamReader; 31 import java.net.URLConnection; 32 import java.util.ArrayList; 33 import java.util.HashMap; 34 import java.util.List; 35 36 /* 37 * This class loads videos from a backend and saves them into a HashMap 38 */ 39 public class VideoProvider { 40 41 private static final String TAG = "VideoProvider"; 42 private static String TAG_MEDIA = "videos"; 43 private static String TAG_GOOGLE_VIDEOS = "googlevideos"; 44 private static String TAG_CATEGORY = "category"; 45 private static String TAG_STUDIO = "studio"; 46 private static String TAG_SOURCES = "sources"; 47 private static String TAG_DESCRIPTION = "description"; 48 private static String TAG_CARD_THUMB = "card"; 49 private static String TAG_BACKGROUND = "background"; 50 private static String TAG_TITLE = "title"; 51 52 private static HashMap<String, List<Movie>> mMovieList; 53 private static Context mContext; 54 private static String mPrefixUrl; 55 setContext(Context context)56 public static void setContext(Context context) { 57 if (mContext == null) 58 mContext = context; 59 } 60 parseUrl(String urlString)61 protected JSONObject parseUrl(String urlString) { 62 Log.d(TAG, "Parse URL: " + urlString); 63 InputStream is = null; 64 65 mPrefixUrl = mContext.getResources().getString(R.string.prefix_url); 66 67 try { 68 java.net.URL url = new java.net.URL(urlString); 69 URLConnection urlConnection = url.openConnection(); 70 is = new BufferedInputStream(urlConnection.getInputStream()); 71 BufferedReader reader = new BufferedReader(new InputStreamReader( 72 urlConnection.getInputStream(), "iso-8859-1"), 8); 73 StringBuilder sb = new StringBuilder(); 74 String line = null; 75 while ((line = reader.readLine()) != null) { 76 sb.append(line); 77 } 78 String json = sb.toString(); 79 return new JSONObject(json); 80 } catch (Exception e) { 81 Log.d(TAG, "Failed to parse the json for media list", e); 82 return null; 83 } finally { 84 if (null != is) { 85 try { 86 is.close(); 87 } catch (IOException e) { 88 Log.d(TAG, "JSON feed closed", e); 89 } 90 } 91 } 92 } 93 getMovieList()94 public static HashMap<String, List<Movie>> getMovieList() { 95 return mMovieList; 96 } 97 buildMedia(Context ctx, String url)98 public static HashMap<String, List<Movie>> buildMedia(Context ctx, String url) 99 throws JSONException { 100 if (null != mMovieList) { 101 return mMovieList; 102 } 103 mMovieList = new HashMap<String, List<Movie>>(); 104 105 JSONObject jsonObj = new VideoProvider().parseUrl(url); 106 JSONArray categories = jsonObj.getJSONArray(TAG_GOOGLE_VIDEOS); 107 if (null != categories) { 108 Log.d(TAG, "category #: " + categories.length()); 109 String title = new String(); 110 String videoUrl = new String(); 111 String bgImageUrl = new String(); 112 String cardImageUrl = new String(); 113 String studio = new String(); 114 for (int i = 0; i < categories.length(); i++) { 115 JSONObject category = categories.getJSONObject(i); 116 String category_name = category.getString(TAG_CATEGORY); 117 JSONArray videos = category.getJSONArray(TAG_MEDIA); 118 Log.d(TAG, 119 "category: " + i + " Name:" + category_name + " video length: " 120 + videos.length()); 121 List<Movie> categoryList = new ArrayList<Movie>(); 122 if (null != videos) { 123 for (int j = 0; j < videos.length(); j++) { 124 JSONObject video = videos.getJSONObject(j); 125 String description = video.getString(TAG_DESCRIPTION); 126 JSONArray videoUrls = video.getJSONArray(TAG_SOURCES); 127 if (null == videoUrls || videoUrls.length() == 0) { 128 continue; 129 } 130 title = video.getString(TAG_TITLE); 131 videoUrl = getVideoPrefix(category_name, videoUrls.getString(0)); 132 bgImageUrl = getThumbPrefix(category_name, title, 133 video.getString(TAG_BACKGROUND)); 134 cardImageUrl = getThumbPrefix(category_name, title, 135 video.getString(TAG_CARD_THUMB)); 136 studio = video.getString(TAG_STUDIO); 137 categoryList.add(buildMovieInfo(category_name, title, description, studio, 138 videoUrl, cardImageUrl, 139 bgImageUrl)); 140 } 141 mMovieList.put(category_name, categoryList); 142 } 143 } 144 } 145 return mMovieList; 146 } 147 buildMovieInfo(String category, String title, String description, String studio, String videoUrl, String cardImageUrl, String bgImageUrl)148 private static Movie buildMovieInfo(String category, String title, 149 String description, String studio, String videoUrl, String cardImageUrl, 150 String bgImageUrl) { 151 Movie movie = new Movie(); 152 movie.setId(Movie.getCount()); 153 Movie.incCount(); 154 movie.setTitle(title); 155 movie.setDescription(description); 156 movie.setStudio(studio); 157 movie.setCategory(category); 158 movie.setCardImageUrl(cardImageUrl); 159 movie.setBackgroundImageUrl(bgImageUrl); 160 movie.setVideoUrl(videoUrl); 161 162 return movie; 163 } 164 getVideoPrefix(String category, String videoUrl)165 private static String getVideoPrefix(String category, String videoUrl) { 166 String ret = ""; 167 ret = mPrefixUrl + category.replace(" ", "%20") + '/' + 168 videoUrl.replace(" ", "%20"); 169 return ret; 170 } 171 getThumbPrefix(String category, String title, String imageUrl)172 private static String getThumbPrefix(String category, String title, String imageUrl) { 173 String ret = ""; 174 175 ret = mPrefixUrl + category.replace(" ", "%20") + '/' + 176 title.replace(" ", "%20") + '/' + 177 imageUrl.replace(" ", "%20"); 178 return ret; 179 } 180 } 181