Add samba

This commit is contained in:
FongMi 2025-04-09 01:55:00 +08:00
parent ba61d27925
commit e2584d6283
7 changed files with 234 additions and 10 deletions

View File

@ -28,5 +28,11 @@
# Sardine # Sardine
-keep class com.thegrizzlylabs.sardineandroid.** { *; } -keep class com.thegrizzlylabs.sardineandroid.** { *; }
# SMBJ
-keep class com.hierynomus.** { *; }
-keep class net.engio.mbassy.** { *; }
-dontwarn org.ietf.jgss.**
-dontwarn javax.**
# Logger # Logger
-keep class com.orhanobut.logger.** { *; } -keep class com.orhanobut.logger.** { *; }

View File

@ -0,0 +1,97 @@
package com.github.catvod.bean.samba;
import android.net.Uri;
import android.text.TextUtils;
import com.github.catvod.bean.Class;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import java.lang.reflect.Type;
import java.util.List;
public class Drive {
@SerializedName("name")
private String name;
@SerializedName("server")
private String server;
private Connection connection;
private SMBClient smbClient;
private DiskShare diskShare;
private Session session;
public static List<Drive> arrayFrom(String str) {
Type listType = new TypeToken<List<Drive>>() {}.getType();
return new Gson().fromJson(str, listType);
}
public Drive(String name) {
this.name = name;
}
public String getName() {
return TextUtils.isEmpty(name) ? "" : name;
}
public String getServer() {
return TextUtils.isEmpty(server) ? "" : server;
}
public DiskShare getShare() {
if (diskShare == null) init();
return diskShare;
}
public Class toType() {
return new Class(getName(), getName(), "1");
}
public void init() {
try {
smbClient = new SMBClient();
Uri uri = Uri.parse(getServer());
String share = uri.getPath().replaceFirst("^/", "").split("/")[0];
connection = smbClient.connect(uri.getHost(), uri.getPort() != -1 ? uri.getPort() : SMBClient.DEFAULT_PORT);
session = connection.authenticate(getAuthentication(uri));
diskShare = (DiskShare) session.connectShare(share);
} catch (Exception e) {
e.printStackTrace();
}
}
private AuthenticationContext getAuthentication(Uri uri) {
String userInfo = uri.getUserInfo();
if (userInfo == null) return AuthenticationContext.guest();
String[] parts = userInfo.split(":", 2);
String username = parts[0];
char[] password = parts.length > 1 ? parts[1].toCharArray() : new char[0];
return new AuthenticationContext(username, password, null);
}
public void release() {
try {
if (diskShare != null) diskShare.close();
if (session != null) session.close();
if (connection != null) connection.close();
if (smbClient != null) smbClient.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Drive)) return false;
Drive it = (Drive) obj;
return getName().equals(it.getName());
}
}

View File

@ -71,16 +71,12 @@ public class AList extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
try { ext = extend;
ext = extend; fetchRule();
fetchRule();
} catch (Exception ignored) {
}
} }
@Override @Override
public String homeContent(boolean filter) throws Exception { public String homeContent(boolean filter) throws Exception {
fetchRule();
List<Class> classes = new ArrayList<>(); List<Class> classes = new ArrayList<>();
LinkedHashMap<String, List<Filter>> filters = new LinkedHashMap<>(); LinkedHashMap<String, List<Filter>> filters = new LinkedHashMap<>();
for (Drive drive : drives) if (!drive.hidden()) classes.add(drive.toType()); for (Drive drive : drives) if (!drive.hidden()) classes.add(drive.toType());
@ -90,7 +86,6 @@ public class AList extends Spider {
@Override @Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) throws Exception { public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) throws Exception {
fetchRule();
String type = extend.containsKey("type") ? extend.get("type") : ""; String type = extend.containsKey("type") ? extend.get("type") : "";
String order = extend.containsKey("order") ? extend.get("order") : ""; String order = extend.containsKey("order") ? extend.get("order") : "";
List<Item> folders = new ArrayList<>(); List<Item> folders = new ArrayList<>();
@ -113,7 +108,6 @@ public class AList extends Spider {
@Override @Override
public String detailContent(List<String> ids) throws Exception { public String detailContent(List<String> ids) throws Exception {
fetchRule();
String id = ids.get(0); String id = ids.get(0);
String key = id.contains("/") ? id.substring(0, id.indexOf("/")) : id; String key = id.contains("/") ? id.substring(0, id.indexOf("/")) : id;
String path = id.substring(0, id.lastIndexOf("/")); String path = id.substring(0, id.lastIndexOf("/"));
@ -142,7 +136,6 @@ public class AList extends Spider {
@Override @Override
public String searchContent(String keyword, boolean quick) throws Exception { public String searchContent(String keyword, boolean quick) throws Exception {
fetchRule();
List<Vod> list = new ArrayList<>(); List<Vod> list = new ArrayList<>();
List<Job> jobs = new ArrayList<>(); List<Job> jobs = new ArrayList<>();
ExecutorService executor = Executors.newCachedThreadPool(); ExecutorService executor = Executors.newCachedThreadPool();

View File

@ -0,0 +1,122 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.bean.Class;
import com.github.catvod.bean.Result;
import com.github.catvod.bean.Vod;
import com.github.catvod.bean.samba.Drive;
import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Image;
import com.github.catvod.utils.Util;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation;
import com.hierynomus.protocol.commons.EnumWithValue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class Samba extends Spider {
private List<Drive> drives;
private String extend;
private void fetchRule() {
if (drives != null && !drives.isEmpty()) return;
if (extend.startsWith("http")) extend = OkHttp.string(extend);
drives = Drive.arrayFrom(extend);
}
private Drive getDrive(String name) {
return drives.get(drives.indexOf(new Drive(name)));
}
private boolean isFolder(FileIdBothDirectoryInformation item) {
return EnumWithValue.EnumUtils.isSet(item.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY);
}
private boolean isFile(FileIdBothDirectoryInformation item) {
return !EnumWithValue.EnumUtils.isSet(item.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY);
}
@Override
public void init(Context context, String extend) {
this.extend = extend;
fetchRule();
}
@Override
public String homeContent(boolean filter) {
List<Class> classes = new ArrayList<>();
for (Drive drive : drives) classes.add(drive.toType());
return Result.string(classes);
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> hashMap) {
String key = tid.contains("/") ? tid.substring(0, tid.indexOf("/")) : tid;
String path = tid.contains("/") ? tid.substring(tid.indexOf("/") + 1) : "";
Drive drive = getDrive(key);
List<Vod> list = new ArrayList<>();
for (FileIdBothDirectoryInformation item : getList(drive, path)) {
String vodId = TextUtils.join("/", path.isEmpty() ? Arrays.asList(key, item.getFileName()) : Arrays.asList(key, path, item.getFileName()));
if (isFolder(item)) list.add(new Vod(vodId, item.getFileName(), Image.FOLDER, "", true));
if (isFile(item)) list.add(new Vod(vodId, item.getFileName(), Image.VIDEO, "", false));
}
return Result.get().vod(list).page().string();
}
@Override
public String detailContent(List<String> ids) {
String tid = ids.get(0);
String key = tid.contains("/") ? tid.substring(0, tid.indexOf("/")) : tid;
String path = tid.contains("/") ? tid.substring(tid.indexOf("/") + 1) : "";
String parent = path.substring(0, path.lastIndexOf("/"));
String name = parent.substring(parent.lastIndexOf("/") + 1);
Drive drive = getDrive(key);
List<String> playUrls = new ArrayList<>();
for (FileIdBothDirectoryInformation item : getList(drive, parent)) {
if (isFile(item)) {
playUrls.add(item.getFileName() + "$" + drive.getServer() + "/" + parent + "/" + item.getFileName());
}
}
Vod vod = new Vod();
vod.setVodId(name);
vod.setVodName(name);
vod.setVodPlayFrom(key);
vod.setVodPlayUrl(TextUtils.join("#", playUrls));
return Result.string(vod);
}
@Override
public String playerContent(String flag, String id, List<String> vipFlags) {
return Result.get().url(id).string();
}
private List<FileIdBothDirectoryInformation> getList(Drive drive, String path) {
List<FileIdBothDirectoryInformation> items = drive.getShare().list(path);
Iterator<FileIdBothDirectoryInformation> iterator = items.iterator();
while (iterator.hasNext()) {
FileIdBothDirectoryInformation item = iterator.next();
if (isFolder(item) && item.getFileName().startsWith(".")) iterator.remove();
if (isFile(item) && !Util.MEDIA.contains(Util.getExt(item.getFileName()))) iterator.remove();
}
Collections.sort(items, (o1, o2) -> {
if (isFolder(o1) && isFile(o2)) return -1;
if (isFile(o1) && isFolder(o2)) return 1;
return o1.getFileName().toLowerCase().compareTo(o2.getFileName().toLowerCase());
});
return items;
}
@Override
public void destroy() {
for (Drive drive : drives) drive.release();
}
}

Binary file not shown.

View File

@ -1 +1 @@
81b9ffd846c583616cd66635e8a34eb7 5ff6b67b0a828c1a512c9df7c0d1e626

6
json/samba.json Normal file
View File

@ -0,0 +1,6 @@
[
{
"name": "Tangsan",
"server": "smb://192.168.0.2/Users"
}
]