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); } }