• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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