okjack
FongMi 2 years ago
parent 7312536dcb
commit 7771c568d0
  1. 39
      app/src/main/java/com/fongmi/android/tv/server/Go.java
  2. 4
      app/src/main/java/com/fongmi/android/tv/server/Nano.java
  3. 22
      app/src/main/java/com/fongmi/android/tv/server/Server.java
  4. 222
      app/src/main/java/com/fongmi/android/tv/utils/ShellUtil.java
  5. 21
      catvod/src/main/java/com/github/catvod/utils/Path.java
  6. 26
      catvod/src/main/java/com/github/catvod/utils/Shell.java
  7. 7
      forcetech/src/main/java/com/gsoft/mitv/MainActivity.java

@ -1,45 +1,24 @@
package com.fongmi.android.tv.server;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.utils.ShellUtil;
import com.github.catvod.Init;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Shell;
import java.io.File;
public class Go {
public static void prepare() {
App.execute(() -> {
try {
File file = new File(Init.context().getFilesDir().getAbsolutePath() + "/go_proxy_video");
if (file.exists()) return;
file.createNewFile();
Path.copy(Init.context().getAssets().open("go_proxy_video"), file);
file.setExecutable(true);
} catch (Exception e) {
e.printStackTrace();
}
});
}
private static final String GO = "go_proxy_video";
public void start() {
public static void start() {
new Thread(() -> {
try {
File file = new File(Init.context().getFilesDir().getAbsolutePath() + "/go_proxy_video");
if (!file.exists()) return;
file.setExecutable(true);
ShellUtil.execCommand("nohup " + file.getAbsolutePath(), false);
} catch (Exception e) {
e.printStackTrace();
}
File file = Path.cache(GO);
if (!file.exists()) Path.copy(Path.getAsset(GO), file);
Shell.exec("chmod 777 " + file);
Shell.exec("nohup " + file);
}).start();
}
public void stop() {
new Thread(() -> {
ShellUtil.execCommand(new String[]{"killall -9 go_proxy_video"}, false);
}).start();
public static void stop() {
new Thread(() -> Shell.exec("killall -9 " + GO)).start();
}
}

@ -10,7 +10,7 @@ import com.fongmi.android.tv.server.process.Cache;
import com.fongmi.android.tv.server.process.Local;
import com.fongmi.android.tv.server.process.Process;
import com.fongmi.android.tv.utils.M3U8;
import com.github.catvod.Init;
import com.github.catvod.utils.Path;
import com.google.common.net.HttpHeaders;
import java.io.ByteArrayInputStream;
@ -120,7 +120,7 @@ public class Nano extends NanoHTTPD {
private Response getAssets(String path) {
try {
if (path.isEmpty()) path = "index.html";
InputStream is = Init.context().getAssets().open(path);
InputStream is = Path.getAsset(path);
return newFixedLengthResponse(Response.Status.OK, getMimeTypeForFile(path), is, is.available());
} catch (IOException e) {
return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_HTML, null);

@ -4,9 +4,9 @@ import com.github.catvod.Proxy;
import com.github.catvod.utils.Util;
public class Server {
private Nano nano;
private int port;
private Go go;
private static class Loader {
static volatile Server INSTANCE = new Server();
@ -37,12 +37,8 @@ public class Server {
}
public void go() {
if (go != null) {
go.start();
return;
}
go = new Go();
go.start();
Go.stop();
Go.start();
}
public void start() {
@ -59,17 +55,11 @@ public class Server {
nano = null;
}
} while (port < 9999);
Go.prepare();
}
public void stop() {
if (nano != null) {
nano.stop();
nano = null;
}
if (go != null) {
go.stop();
go = null;
}
if (nano != null) nano.stop();
nano = null;
Go.stop();
}
}

@ -1,222 +0,0 @@
package com.fongmi.android.tv.utils;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
/**
* ShellUtil
* <ul>
* <strong>Check root</strong>
* <li>{@link ShellUtil#checkRootPermission()}</li>
* </ul>
* <ul>
* <strong>Execte command</strong>
* <li>{@link ShellUtil#execCommand(String, boolean)}</li>
* <li>{@link ShellUtil#execCommand(String, boolean, boolean)}</li>
* <li>{@link ShellUtil#execCommand(List, boolean)}</li>
* <li>{@link ShellUtil#execCommand(List, boolean, boolean)}</li>
* <li>{@link ShellUtil#execCommand(String[], boolean)}</li>
* <li>{@link ShellUtil#execCommand(String[], boolean, boolean)}</li>
* </ul>
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16
*/
public class ShellUtil {
public static final String COMMAND_SU = "su";
public static final String COMMAND_SH = "sh";
public static final String COMMAND_EXIT = "exit\n";
public static final String COMMAND_LINE_END = "\n";
private ShellUtil() {
throw new AssertionError();
}
/**
* check whether has root permission
*
* @return
*/
public static boolean checkRootPermission() {
return execCommand("echo root", true, false).result == 0;
}
/**
* execute shell command, default return result msg
*
* @param command command
* @param isRoot whether need to run with root
* @return
* @see ShellUtil#execCommand(String[], boolean, boolean)
*/
public static CommandResult execCommand(String command, boolean isRoot) {
return execCommand(new String[] {command}, isRoot, true);
}
/**
* execute shell commands, default return result msg
*
* @param commands command list
* @param isRoot whether need to run with root
* @return
* @see ShellUtil#execCommand(String[], boolean, boolean)
*/
public static CommandResult execCommand(List<String> commands, boolean isRoot) {
return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true);
}
/**
* execute shell commands, default return result msg
*
* @param commands command array
* @param isRoot whether need to run with root
* @return
* @see ShellUtil#execCommand(String[], boolean, boolean)
*/
public static CommandResult execCommand(String[] commands, boolean isRoot) {
return execCommand(commands, isRoot, true);
}
/**
* execute shell command
*
* @param command command
* @param isRoot whether need to run with root
* @param isNeedResultMsg whether need result msg
* @return
* @see ShellUtil#execCommand(String[], boolean, boolean)
*/
public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {
return execCommand(new String[] {command}, isRoot, isNeedResultMsg);
}
/**
* execute shell commands
*
* @param commands command list
* @param isRoot whether need to run with root
* @param isNeedResultMsg whether need result msg
* @return
* @see ShellUtil#execCommand(String[], boolean, boolean)
*/
public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {
return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg);
}
/**
* execute shell commands
*
* @param commands command array
* @param isRoot whether need to run with root
* @param isNeedResultMsg whether need result msg
* @return <ul>
* <li>if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and
* {@link CommandResult#errorMsg} is null.</li>
* <li>if {@link CommandResult#result} is -1, there maybe some excepiton.</li>
* </ul>
*/
public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {
int result = -1;
if (commands == null || commands.length == 0) {
return new CommandResult(result, null, null);
}
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = null;
StringBuilder errorMsg = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
os = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
continue;
}
// donnot use os.writeBytes(commmand), avoid chinese charset error
os.write(command.getBytes());
os.writeBytes(COMMAND_LINE_END);
os.flush();
}
os.writeBytes(COMMAND_EXIT);
os.flush();
result = process.waitFor();
// get command result
if (isNeedResultMsg) {
successMsg = new StringBuilder();
errorMsg = new StringBuilder();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null
: errorMsg.toString());
}
/**
* result of command
* <ul>
* <li>{@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in
* linux shell</li>
* <li>{@link CommandResult#successMsg} means success message of command result</li>
* <li>{@link CommandResult#errorMsg} means error message of command result</li>
* </ul>
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16
*/
public static class CommandResult {
/** result of command **/
public int result;
/** success message of command result **/
public String successMsg;
/** error message of command result **/
public String errorMsg;
public CommandResult(int result) {
this.result = result;
}
public CommandResult(int result, String successMsg, String errorMsg) {
this.result = result;
this.successMsg = successMsg;
this.errorMsg = errorMsg;
}
}
}

@ -115,9 +115,17 @@ public class Path {
return file2.exists() ? file2 : file1.exists() ? file1 : new File(path);
}
public static InputStream getAsset(String fileName) {
try {
return Init.context().getAssets().open(fileName);
} catch (Exception e) {
return null;
}
}
public static String asset(String fileName) {
try {
return read(Init.context().getAssets().open(fileName));
return read(getAsset(fileName));
} catch (Exception e) {
return "";
}
@ -184,13 +192,11 @@ public class Path {
}
public static void copy(InputStream in, OutputStream out) throws IOException {
int read;
byte[] buffer = new byte[8192];
int amountRead;
while ((amountRead = in.read(buffer)) != -1) {
out.write(buffer, 0, amountRead);
}
in.close();
while ((read = in.read(buffer)) != -1) out.write(buffer, 0, read);
out.close();
in.close();
}
public static void newFile(File file) {
@ -213,8 +219,7 @@ public class Path {
public static File chmod(File file) {
try {
Process process = Runtime.getRuntime().exec("chmod 777 " + file);
process.waitFor();
Shell.exec("chmod 777 " + file);
return file;
} catch (Exception e) {
e.printStackTrace();

@ -0,0 +1,26 @@
package com.github.catvod.utils;
import java.io.DataOutputStream;
public class Shell {
private static final String COMMAND_SH = "sh";
private static final String COMMAND_EXIT = "exit\n";
private static final String COMMAND_LINE_END = "\n";
public static void exec(String command) {
try {
Process p = Runtime.getRuntime().exec(COMMAND_SH);
DataOutputStream dos = new DataOutputStream(p.getOutputStream());
dos.write(command.getBytes());
dos.writeBytes(COMMAND_LINE_END);
dos.writeBytes(COMMAND_EXIT);
dos.flush();
dos.close();
p.waitFor();
p.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -6,7 +6,6 @@ import android.os.IBinder;
import com.anymediacloud.iptv.standard.ForceTV;
import com.forcetech.Util;
import com.github.catvod.Init;
import com.github.catvod.utils.Path;
import java.io.File;
@ -25,10 +24,10 @@ public class MainActivity extends Service {
}
}
private void checkLibrary() throws Exception {
private void checkLibrary() {
String name = "libmitv.so";
File cache = Path.cache(name);
if (!cache.exists()) Path.copy(Init.context().getAssets().open(name), cache);
File file = Path.cache(name);
if (!file.exists()) Path.copy(Path.getAsset(name), file);
}
@Override

Loading…
Cancel
Save