340 lines
15 KiB
Java
340 lines
15 KiB
Java
package com.yutou.nas.utils;
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import com.yutou.nas.Datas.Jellyfin.Episode;
|
|
import com.yutou.nas.Datas.Jellyfin.EpisodeData;
|
|
import com.yutou.nas.Datas.Jellyfin.ItemInfo;
|
|
import com.yutou.nas.Datas.Jellyfin.LibsItem;
|
|
import com.yutou.nas.bangumi.BangumiTools;
|
|
import com.yutou.nas.interfaces.DownloadInterface;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.*;
|
|
|
|
public class JellyfinAPIManager {
|
|
private List<LibsItem> mediaItem = new ArrayList<>();
|
|
private static final String userId="389438aeda0a4972ac66a23cbe5c289c";
|
|
|
|
public JellyfinAPIManager() {
|
|
mediaItem = getAllItem();
|
|
}
|
|
|
|
public LibsItem getLibs(String key) {
|
|
HashMap<String, String> header = getHeader();
|
|
String httpText = HttpTools.https_get("http://192.168.31.88:8096/Users/"+userId+"/Items", header);
|
|
JSONObject json = JSON.parseObject(httpText);
|
|
if (key == null) {
|
|
return null;
|
|
}
|
|
JSONArray items = json.getJSONArray("Items");
|
|
for (Object o : items) {
|
|
LibsItem item = JSON.parseObject(o.toString(), LibsItem.class);
|
|
if (item.getName().equals(key)) {
|
|
return item;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public ItemInfo getInfo(String id) {
|
|
String http = HttpTools.https_get("http://192.168.31.88:8096/Users/"+userId+"/Items/" + id, getHeader());
|
|
return JSON.parseObject(http, ItemInfo.class);
|
|
}
|
|
|
|
public List<LibsItem> getAllItem() {
|
|
String http = HttpTools.https_get("http://192.168.31.88:8096/Users/"+userId+"/Items?SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Series&Recursive=true&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo&ImageTypeLimit=1&EnableImageTypes=Primary%2CBackdrop%2CBanner%2CThumb&ParentId=28e774baf8f2fd279e7d58da9890a7d2", getHeader());
|
|
JSONObject json = JSON.parseObject(http);
|
|
|
|
JSONArray items = json.getJSONArray("Items");
|
|
List<LibsItem> list = JSON.parseArray(items.toJSONString(), LibsItem.class);
|
|
for (LibsItem item : list) {
|
|
item.setInfo(getInfo(item.getId()));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public List<LibsItem> getLibsItems(String id) {
|
|
String httpText = HttpTools.https_get("http://192.168.31.88:8096/Users/"+userId+"/Items?ParentId=" + id, getHeader());
|
|
JSONObject json = JSON.parseObject(httpText);
|
|
JSONArray items = json.getJSONArray("Items");
|
|
return JSON.parseArray(items.toJSONString(), LibsItem.class);
|
|
}
|
|
|
|
public JSONObject getItemShows(String id) {
|
|
String data = HttpTools.https_get(String.format("http://192.168.31.88:8096/Shows/%s/Seasons?userId="+userId+"",
|
|
id
|
|
), getHeader());
|
|
return JSON.parseObject(data);
|
|
}
|
|
|
|
public JSONObject getEpisodesForJson(String parentID, String id) {
|
|
String data = HttpTools.https_get(String.format("http://192.168.31.88:8096/Shows/%s/Episodes?seasonId=%s&userId="+userId+"",
|
|
parentID,
|
|
id
|
|
), getHeader());
|
|
return JSON.parseObject(data);
|
|
}
|
|
|
|
public List<Episode> getEpisodes(String parentId, String id) {
|
|
JSONObject json = getEpisodesForJson(parentId, id);
|
|
JSONArray episodes = json.getJSONArray("Items");
|
|
return JSON.parseArray(episodes.toJSONString(), Episode.class);
|
|
}
|
|
|
|
public JSONObject getEpisodesDataForJson(String id) {
|
|
String data = HttpTools.https_get(String.format("http://192.168.31.88:8096/Users/"+userId+"/Items/%s",
|
|
id
|
|
), getHeader());
|
|
return JSON.parseObject(data);
|
|
}
|
|
|
|
public EpisodeData getEpisodeData(String id) {
|
|
return JSON.parseObject(getEpisodesDataForJson(id).toString(), EpisodeData.class);
|
|
}
|
|
|
|
public String getPathForEpisode(String parentId, String id) {
|
|
List<Episode> list = getEpisodes(parentId, id);
|
|
if (!list.isEmpty()) {
|
|
return getEpisodeData(list.get(0).getId()).getPath();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
public void uploadImage(File image, String id, String model) {
|
|
try {
|
|
HashMap<String, String> header = getHeader();
|
|
header.put("Content-Type", "image/jpg");
|
|
String url = String.format("http://192.168.31.88:8096/Items/%s/Images/%s",
|
|
id,
|
|
model
|
|
);
|
|
//url="http://tools.yutou233.cn/public/request.do";
|
|
HttpTools.http_post(
|
|
url,
|
|
Base64.getEncoder().encode(StreamTools.fileToByte(image)),
|
|
4,
|
|
header
|
|
|
|
);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public void saveJellyfinMetaData(JSONObject info, LibsItem item) {
|
|
JSONArray airDate = new JSONArray();
|
|
airDate.add(info.getString("air_date"));
|
|
JSONObject providerIds = new JSONObject();
|
|
providerIds.put("Imdb", "");
|
|
providerIds.put("Tmdb", "");
|
|
providerIds.put("Zap2It", "");
|
|
JSONObject metadata = new JSONObject();
|
|
metadata.put("Id", item.getId());
|
|
metadata.put("Name", info.getString("name_cn"));
|
|
metadata.put("OriginalTitle", info.getString("name"));
|
|
metadata.put("ForcedSortName", "");
|
|
metadata.put("CommunityRating", info.getJSONObject("rating").getFloat("score") + "");
|
|
metadata.put("CriticRating", "");
|
|
metadata.put("IndexNumber", "null");
|
|
metadata.put("AirsBeforeSeasonNumber", "");
|
|
metadata.put("AirsAfterSeasonNumber", "");
|
|
metadata.put("AirsBeforeEpisodeNumber", "");
|
|
metadata.put("ParentIndexNumber", "null");
|
|
metadata.put("DisplayOrder", "");
|
|
metadata.put("Album", "");
|
|
metadata.put("AlbumArtists", new JSONArray());
|
|
metadata.put("ArtistItems", new JSONArray());
|
|
metadata.put("Overview", info.getString("summary"));
|
|
metadata.put("Status", "");
|
|
metadata.put("AirDays", new JSONArray());
|
|
metadata.put("AirTime", "");
|
|
metadata.put("Genres", new JSONArray());
|
|
metadata.put("Tags", new JSONArray());
|
|
metadata.put("Studios", new JSONArray());
|
|
metadata.put("PremiereDate", "null");
|
|
metadata.put("DateCreated", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(new Date()));
|
|
metadata.put("EndDate", "null");
|
|
metadata.put("ProductionYear", info.getString("air_date").split("-")[0]);
|
|
metadata.put("AspectRatio", "");
|
|
metadata.put("Video3DFormat", "");
|
|
metadata.put("OfficialRating", "14+");
|
|
metadata.put("CustomRating", "");
|
|
metadata.put("People", BangumiTools.getPeople(info.getInteger("id")));
|
|
metadata.put("LockData", false);
|
|
metadata.put("LockedFields", new JSONArray());
|
|
metadata.put("ProviderIds", providerIds);
|
|
// metadata.put("Path", path);
|
|
metadata.put("PreferredMetadataLanguage", "");
|
|
metadata.put("PreferredMetadataCountryCode", "");
|
|
metadata.put("RunTimeTicks", 0);
|
|
metadata.put("Taglines", new JSONArray());
|
|
HashMap<String, String> headers = getHeader();
|
|
headers.put("Content-Type", "application/json");
|
|
System.out.println(metadata.toString().replace("\"null\"", "null"));
|
|
String ret = HttpTools.http_post("http://192.168.31.88:8096/Items/" + item.getId()
|
|
, metadata.toString().replace("\"null\"", "null").getBytes(StandardCharsets.UTF_8)
|
|
, 4
|
|
, headers);
|
|
System.out.println(ret);
|
|
HttpTools.download(
|
|
info.getJSONObject("images").getString("large").replace("http:", "https:"),
|
|
item.getName() + "_poster.jpg",
|
|
new DownloadInterface() {
|
|
@Override
|
|
public void onDownload(File file) {
|
|
super.onDownload(file);
|
|
uploadImage(file, item.getId(), "Primary");
|
|
JSONObject items = getItemShows(item.getId());
|
|
for (Object o : items.getJSONArray("Items")) {
|
|
JSONObject json = (JSONObject) o;
|
|
uploadImage(file, json.getString("Id"), "Primary");
|
|
}
|
|
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
public HashMap<String, String> getHeader() {
|
|
HashMap<String, String> header = new HashMap<>();
|
|
header.put("X-Emby-Authorization", "MediaBrowser Client=\"Jellyfin CLI\", Device=\"Jellyfin-CLI\", DeviceId=\"None\", Version=\"10.7.6\", Token=\"81be0169523e463a8c36a7b752d60ab2\"");
|
|
return header;
|
|
}
|
|
|
|
|
|
public void testItem(String id) {
|
|
JellyfinAPIManager manager = new JellyfinAPIManager();
|
|
LibsItem item = manager.getLibs("番剧");
|
|
if (item != null) {
|
|
List<LibsItem> list;
|
|
list = manager.getLibsItems(item.getId());
|
|
for (LibsItem libsItem : list) {
|
|
if ("轻音少女".equals(libsItem.getName())) {
|
|
/* saveJellyfinMetaData(
|
|
BangumiTools.getBangumiInfo(1424),
|
|
libsItem
|
|
);*/
|
|
System.out.println("libsItem = " + libsItem);
|
|
System.out.println(manager.getItemShows(libsItem.getId()));
|
|
JSONObject json = manager.getItemShows(libsItem.getId());
|
|
JSONArray array = json.getJSONArray("Items");
|
|
for (Object o : array) {
|
|
JSONObject _json = (JSONObject) o;
|
|
System.out.println(_json.getString("Name"));
|
|
|
|
if (_json.getString("Name").equals("第一季")) {
|
|
LibsItem _item = JSON.parseObject(_json.toJSONString(), LibsItem.class);
|
|
manager.saveJellyfinMetaData(
|
|
BangumiTools.getBangumiInfo(1424),
|
|
_item
|
|
);
|
|
} else if (_json.getString("Name").equals("第二季")) {
|
|
LibsItem _item = JSON.parseObject(_json.toJSONString(), LibsItem.class);
|
|
manager.saveJellyfinMetaData(
|
|
BangumiTools.getBangumiInfo(3774),
|
|
_item
|
|
);
|
|
} else if (_json.getString("Name").contains("[剧场版]")) {
|
|
LibsItem _item = JSON.parseObject(_json.toJSONString(), LibsItem.class);
|
|
manager.saveJellyfinMetaData(
|
|
BangumiTools.getBangumiInfo(12426),
|
|
_item
|
|
);
|
|
}
|
|
|
|
|
|
}
|
|
/* System.out.println("libsItem = " + libsItem);
|
|
testItem(libsItem.getId());*/
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public JSONArray getAnimPaths() {
|
|
JSONArray array = new JSONArray();
|
|
for (LibsItem item : mediaItem) {
|
|
JSONObject json = new JSONObject();
|
|
json.put("name", item.getInfo().getName());
|
|
List<LibsItem> list = getLibsItems(item.getId());
|
|
json.put("size",list.size());
|
|
JSONArray _items = new JSONArray();
|
|
if (list.size() > 1) {
|
|
for (LibsItem libsItem : list) {
|
|
JSONObject _item = new JSONObject();
|
|
_item.put("name", libsItem.getName());
|
|
_item.put("path", getInfo(libsItem.getId()).getPath());
|
|
_items.add(_item);
|
|
}
|
|
json.put("path",_items);
|
|
}
|
|
json.put("root",item.getInfo().getPath());
|
|
array.add(json);
|
|
}
|
|
return array;
|
|
}
|
|
|
|
public void init(File path,String id) {
|
|
if (id != null) {
|
|
for (LibsItem item : mediaItem) {
|
|
List<LibsItem> _temp = getLibsItems(item.getId());
|
|
if (_temp.size() == 1) {
|
|
if (item.getInfo().getPath().contains(path.getPath())) {
|
|
System.out.println(item.getName() + " " + id);
|
|
new JellyfinAPIManager().saveJellyfinMetaData(BangumiTools.getBangumiInfo(Integer.parseInt(id)), item);
|
|
break;
|
|
}
|
|
} else {
|
|
System.out.println(item.getName() + " > " + _temp.size());
|
|
for (LibsItem libsItem : _temp) {
|
|
ItemInfo info = getInfo(libsItem.getId());
|
|
if (info.getPath() != null) {
|
|
if (info.getPath().contains(path.getPath())) {
|
|
System.out.println("list > " + item.getName() + " " + id);
|
|
new JellyfinAPIManager().saveJellyfinMetaData(BangumiTools.getBangumiInfo(Integer.parseInt(id)), libsItem);
|
|
break;
|
|
}
|
|
} else {
|
|
String ep_Path = getPathForEpisode(info.getParentID(), info.getId());
|
|
if (ep_Path != null && ep_Path.contains(path.getPath())) {
|
|
System.out.println("list > " + item.getName() + " " + id);
|
|
new JellyfinAPIManager().saveJellyfinMetaData(BangumiTools.getBangumiInfo(Integer.parseInt(id)), libsItem);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (item.getInfo().getPath().contains(path.getPath())) {
|
|
System.out.println(item.getName() + " " + id);
|
|
new JellyfinAPIManager().saveJellyfinMetaData(BangumiTools.getBangumiInfo(Integer.parseInt(id)), item);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
/*for (File file : path.listFiles()) {
|
|
if (file.isDirectory()) {
|
|
// System.out.println("搜索目录:"+file.getAbsolutePath());
|
|
init(file);
|
|
}
|
|
}*/
|
|
|
|
}
|
|
|
|
public static String mainPath = "Z:\\download\\anim\\";
|
|
|
|
public static void main(String[] args) {
|
|
File file = new File("Z:\\download\\anim\\白沙的水族馆");
|
|
//new JellyfinAPIManager().search(file.getName(), file);
|
|
JellyfinAPIManager manager = new JellyfinAPIManager();
|
|
manager.init(file,"325281");
|
|
//JSONArray search = manager.getAnimPaths();
|
|
//System.out.println(search);
|
|
}
|
|
}
|