· 5 years ago · May 04, 2020, 11:44 PM
1#!/bin/env python
2
3
4import os
5import re
6import json
7import glob
8import requests
9import dicttoxml
10import xml.dom.minidom
11from xml.dom.minidom import parseString
12from pathlib import Path
13
14# Define Global Varables #
15address = 'http://localhost:8111'
16key = None
17importfolders = []
18sep = os.path.sep
19aid = None
20# Grab Shoko Auth Key #
21
22
23def authentication():
24
25 ApiHeaders = {
26 'Content-Type': 'application/json',
27 'Accept': 'application/json',
28 }
29
30 ApiData = '{"user": "Default", "pass": "", "device": "CLI"}'
31
32 auth = requests.post(address + '/api/auth',
33 headers=ApiHeaders, data=ApiData)
34 global key
35 key = json.loads(auth.text)['apikey']
36
37
38authentication()
39
40# print(key)
41
42# Get Import Folder #
43
44
45def grabfolder():
46 FolderHeader = {
47 'accept': 'application/json',
48 'apikey': key
49 }
50
51 topfolder = requests.get(
52 address + '/api/folder/list', headers=FolderHeader)
53 returnfolder = json.loads(topfolder.text)
54 global importfolders
55 #importfolder = returnfolder.get('ImportFolderLocation')
56 # print(returnfolder)
57 importfolders = [element['ImportFolderLocation']
58 for element in returnfolder if element['ImportFolderLocation'].count('/') >= 2]
59
60
61grabfolder()
62
63print(importfolders)
64
65
66# Grabbing And Exporting Episode Data #
67def episodeinfo(epname, epath, noext):
68 EpisodeHeaders = {
69 'accept': 'text/plain',
70 'apikey': key
71 }
72
73 EpisodeParams = (
74 ('filename',
75 epname),
76 ('pic', '1'),
77
78 )
79
80 fileinfo = requests.get(
81 address + '/api/ep/getbyfilename', headers=EpisodeHeaders, params=EpisodeParams)
82
83 # Mapping Data from Shoko to Jellyfin NFO #
84
85 # stringtest = json.loads(fileinfo.text)
86 # print(stringtest)
87 global aid
88 eplot = json.loads(fileinfo.text).get('summary', None)
89 etitle = json.loads(fileinfo.text).get('name', None)
90 eyear = json.loads(fileinfo.text).get('year', None)
91 episode = json.loads(fileinfo.text).get('epnumber', None)
92 season = json.loads(fileinfo.text).get('season', '1x1')
93 aid = json.loads(fileinfo.text).get('aid', '-1')
94 seasonnum = season.split('x')
95
96 # Debug Stuff #
97
98 # print(aid)
99 # print(eplot)
100 # print(etitle)
101 # print(eyear)
102 # print(episode)
103 # print(seasonnum[0])
104 # print(season)
105
106 # Create Dictionary From Mapped Data #
107
108 show = {
109 "plot": eplot,
110 "title": etitle,
111 "year": eyear,
112 "episode": episode,
113 "season": seasonnum[0],
114 }
115
116 # print(show)
117
118 # Create and Write XML NFO File #
119
120 showxml = dicttoxml.dicttoxml(
121 show, custom_root='episodedetails', attr_type=False)
122 showparse = xml.dom.minidom.parseString(showxml)
123 showprint = showparse.toprettyxml()
124 if os.path.isfile(epath + sep + noext + ".nfo"):
125 print("Nfo File For This Episode Exists")
126 else:
127 showfile = open(epath + sep + noext + ".nfo", "w")
128 showfile.write(showprint)
129 showfile.close()
130
131 # More Data Grabbing #
132
133
134def tvshowinfo(aid, epath):
135
136 ShowHeaders = {
137 'accept': 'text/plain',
138 'apikey': key
139 }
140
141 ShowParams = (
142 ('id',
143 aid),
144
145 )
146 # More Data Mapping #
147 showinfo = requests.get(
148 address + '/api/serie/fromaid', headers=ShowHeaders, params=ShowParams)
149
150 splot = json.loads(showinfo.text).get('summary', None)
151 soutline = json.loads(showinfo.text).get('summary', None)
152 stitle = json.loads(showinfo.text).get('name', None)
153 syear = json.loads(showinfo.text).get('year', None)
154 air = json.loads(showinfo.text).get('premiered', None)
155
156 show = {
157 "plot": splot,
158 "outline": soutline,
159 "title": stitle,
160 "year": syear,
161 "premiered": air,
162 "anidbid": aid,
163 }
164 # print(soutline)
165 # print(splot)
166 # print(stitle)
167 # print(syear)
168 # print(air)
169 # print(aid)
170
171 # Creating tvshow.nfo XML Table and Writing It #
172
173 showxml = dicttoxml.dicttoxml(
174 show, custom_root='tvshowdetails', attr_type=False)
175 showparse = xml.dom.minidom.parseString(showxml)
176 showprint = showparse.toprettyxml()
177 if os.path.isfile(epath + sep + "tvshow.nfo"):
178 print()
179 else:
180 showfile = open(epath + sep + "tvshow.nfo", "w")
181 showfile.write(showprint)
182 showfile.close()
183
184
185extlist = ('*.mkv', '*.avi', '*.mp4')
186
187for ext in extlist:
188 for importfolder in importfolders:
189 for files in glob.iglob(importfolder + "**" + sep + ext, recursive=True):
190 epname = os.path.basename(files)
191 epath = os.path.dirname(files)
192 noext = os.path.splitext(epname)[0]
193 print(epname)
194 # print(folder)
195 episodeinfo(epname, epath, noext)
196 if aid == "-1":
197 print("Release not on Anidb")
198 else:
199 tvshowinfo(aid, epath)