181 lines
7.2 KiB
Java
181 lines
7.2 KiB
Java
/*
|
|
* Copyright (c) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.liskovsoft.smartyoutubetv2.tv.old.data;
|
|
|
|
import android.content.ContentValues;
|
|
import android.content.Context;
|
|
import android.media.Rating;
|
|
import androidx.annotation.NonNull;
|
|
import android.util.Log;
|
|
|
|
import com.liskovsoft.smartyoutubetv2.tv.R;
|
|
|
|
import org.json.JSONArray;
|
|
import org.json.JSONException;
|
|
import org.json.JSONObject;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.IOException;
|
|
import java.io.InputStreamReader;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
|
|
/**
|
|
* The VideoDbBuilder is used to grab a JSON file from a server and parse the data
|
|
* to be placed into a local database
|
|
*/
|
|
public class VideoDbBuilder {
|
|
public static final String TAG_MEDIA = "videos";
|
|
public static final String TAG_GOOGLE_VIDEOS = "googlevideos";
|
|
public static final String TAG_CATEGORY = "category";
|
|
public static final String TAG_STUDIO = "studio";
|
|
public static final String TAG_SOURCES = "sources";
|
|
public static final String TAG_DESCRIPTION = "description";
|
|
public static final String TAG_CARD_THUMB = "card";
|
|
public static final String TAG_BACKGROUND = "background";
|
|
public static final String TAG_TITLE = "title";
|
|
|
|
private static final String TAG = "VideoDbBuilder";
|
|
|
|
private Context mContext;
|
|
|
|
/**
|
|
* Default constructor that can be used for tests
|
|
*/
|
|
public VideoDbBuilder() {
|
|
|
|
}
|
|
|
|
public VideoDbBuilder(Context mContext) {
|
|
this.mContext = mContext;
|
|
}
|
|
|
|
/**
|
|
* Fetches JSON data representing videos from a server and populates that in a database
|
|
* @param url The location of the video list
|
|
*/
|
|
public @NonNull List<ContentValues> fetch(String url)
|
|
throws IOException, JSONException {
|
|
JSONObject videoData = fetchJSON(url);
|
|
return buildMedia(videoData);
|
|
}
|
|
|
|
/**
|
|
* Takes the contents of a JSON object and populates the database
|
|
* @param jsonObj The JSON object of videos
|
|
* @throws JSONException if the JSON object is invalid
|
|
*/
|
|
public List<ContentValues> buildMedia(JSONObject jsonObj) throws JSONException {
|
|
|
|
JSONArray categoryArray = jsonObj.getJSONArray(TAG_GOOGLE_VIDEOS);
|
|
List<ContentValues> videosToInsert = new ArrayList<>();
|
|
|
|
for (int i = 0; i < categoryArray.length(); i++) {
|
|
JSONArray videoArray;
|
|
|
|
JSONObject category = categoryArray.getJSONObject(i);
|
|
String categoryName = category.getString(TAG_CATEGORY);
|
|
videoArray = category.getJSONArray(TAG_MEDIA);
|
|
|
|
for (int j = 0; j < videoArray.length(); j++) {
|
|
JSONObject video = videoArray.getJSONObject(j);
|
|
|
|
// If there are no URLs, skip this video entry.
|
|
JSONArray urls = video.optJSONArray(TAG_SOURCES);
|
|
if (urls == null || urls.length() == 0) {
|
|
continue;
|
|
}
|
|
|
|
String title = video.optString(TAG_TITLE);
|
|
String description = video.optString(TAG_DESCRIPTION);
|
|
String videoUrl = (String) urls.get(0); // Get the first video only.
|
|
String bgImageUrl = video.optString(TAG_BACKGROUND);
|
|
String cardImageUrl = video.optString(TAG_CARD_THUMB);
|
|
String studio = video.optString(TAG_STUDIO);
|
|
|
|
ContentValues videoValues = new ContentValues();
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_CATEGORY, categoryName);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_NAME, title);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_DESC, description);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_VIDEO_URL, videoUrl);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_CARD_IMG, cardImageUrl);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_BG_IMAGE_URL, bgImageUrl);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_STUDIO, studio);
|
|
|
|
// Fixed defaults.
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_CONTENT_TYPE, "video/mp4");
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_IS_LIVE, false);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_AUDIO_CHANNEL_CONFIG, "2.0");
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_PRODUCTION_YEAR, 2014);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_DURATION, 0);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_RATING_STYLE,
|
|
Rating.RATING_5_STARS);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_RATING_SCORE, 3.5f);
|
|
if (mContext != null) {
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_PURCHASE_PRICE,
|
|
mContext.getResources().getString(R.string.buy_2));
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_RENTAL_PRICE,
|
|
mContext.getResources().getString(R.string.rent_2));
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_ACTION,
|
|
mContext.getResources().getString(R.string.global_search));
|
|
}
|
|
|
|
// TODO: Get these dimensions.
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_VIDEO_WIDTH, 1280);
|
|
videoValues.put(VideoContract.VideoEntry.COLUMN_VIDEO_HEIGHT, 720);
|
|
|
|
videosToInsert.add(videoValues);
|
|
}
|
|
}
|
|
return videosToInsert;
|
|
}
|
|
|
|
/**
|
|
* Fetch JSON object from a given URL.
|
|
*
|
|
* @return the JSONObject representation of the response
|
|
* @throws JSONException
|
|
* @throws IOException
|
|
*/
|
|
private JSONObject fetchJSON(String urlString) throws JSONException, IOException {
|
|
BufferedReader reader = null;
|
|
java.net.URL url = new java.net.URL(urlString);
|
|
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
|
|
try {
|
|
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),
|
|
"utf-8"));
|
|
StringBuilder sb = new StringBuilder();
|
|
String line;
|
|
while ((line = reader.readLine()) != null) {
|
|
sb.append(line);
|
|
}
|
|
String json = sb.toString();
|
|
return new JSONObject(json);
|
|
} finally {
|
|
urlConnection.disconnect();
|
|
if (null != reader) {
|
|
try {
|
|
reader.close();
|
|
} catch (IOException e) {
|
|
Log.e(TAG, "JSON feed closed", e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|