package io.github.xwz.sbs.api;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.github.xwz.sbs.content.ContentManager;
public class SBSAuthApi extends SBSApiBase {
private static final String TAG = "SBSAuthApi";
private final String id;
private static final Pattern SRC_PATTERN = Pattern.compile("<video src=\"([^\"]+)\"");
public SBSAuthApi(Context context, String id) {
super(context);
setEnableCache(false);
this.id = id;
}
@Override
protected Void doInBackground(String... urls) {
Log.d(TAG, "Doing AUTH");
if (urls.length > 0) {
buildAuth(urls[0]);
}
return null;
}
private void buildAuth(String href) {
Uri url = createStreamUrl(href);
if (url != null) {
String content = fetchUrlSkipLocalCache(url, 0);
if (content != null) {
parseContent(content);
} else {
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_ERROR, ContentManager.AUTH_FAILED_NETWORK, id);
}
}
}
private void parseContent(String content) {
String f = "var playerParams = {";
int pos = content.indexOf(f);
if (pos >= 0) {
int start = pos + f.length();
int end = content.indexOf("};", start);
if (end > pos) {
String data = content.substring(start - 1, end + 1);
Log.d(TAG, "data:" + data);
Gson gson = new Gson();
try {
PlayerParams params = gson.fromJson(data, PlayerParams.class);
Log.d(TAG, "params: " + params);
if (params != null && params.releaseUrls != null) {
String release = params.releaseUrls.getUrl();
if (release != null && release.length() > 0) {
Uri.Builder builder = Uri.parse(release).buildUpon();
Uri url = builder.build();
loadPlayList(url);
return;
}
}
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
}
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_ERROR, ContentManager.AUTH_FAILED_TOKEN, id);
}
private void loadPlayList(Uri url) {
String content = fetchUrlSkipLocalCache(url, 0);
if (content != null) {
parsePlayList(content);
} else {
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_ERROR, ContentManager.AUTH_FAILED_NETWORK, id);
}
}
protected void onPreExecute() {
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_START);
}
private void parsePlayList(String content) {
Matcher m = SRC_PATTERN.matcher(content);
if (m.find()) {
Uri.Builder builder = Uri.parse(m.group(1)).buildUpon();
Uri url = builder.build();
Log.d(TAG, "Stream URL:" + url);
ContentManager.cache().putStreamUrl(id, url);
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_DONE, id);
} else {
ContentManager.getInstance().broadcastChange(ContentManager.CONTENT_AUTH_ERROR, ContentManager.AUTH_FAILED_TOKEN, id);
}
}
static class ReleaseUrl {
private String progressive;
private String html;
private String standard;
public String getUrl() {
if (html != null) {
String url = html.toLowerCase();
if (url.startsWith("http://") || url.startsWith("https://")) {
return html;
}
if (url.startsWith("//")) {
return "http:" + html;
}
Log.d(TAG, "Invalid release URL: " + this);
}
return null;
}
public String toString() {
return progressive + " | " + html + " | " + standard;
}
}
static class PlayerParams {
private ReleaseUrl releaseUrls;
public String toString() {
return "url:" + releaseUrls;
}
}
}