Update workflows/publish_pypi.yml
[manga-dl.git] / manga_py / crypt / sunday_webry_com.py
bloba8de4d55fa398e502af15c0c4c4a73f4290382fb
1 from PIL import Image
4 # DO NOT SEE HERE! IT WORKED!
7 class MatrixSunday:
8 __image_src = None
9 __image_dst = None
11 def de_scramble(self, path_src: str, path_dst: str, data: list):
12 self.__image_src = Image.open(path_src, 'r')
13 self.__process(data)
14 self.__image_dst.save(path_dst)
15 self.__image_src.close()
16 self.__image_dst.close()
18 def __process(self, data: list):
19 size_src = self.__image_src.size
21 self.__image_dst = Image.new(self.__image_src.mode, size_src)
23 for i in data:
24 x, y = i['srcX'] + i['width'], i['srcY'] + i['height']
25 dx, dy = i['destX'] + i['width'], i['destY'] + i['height']
27 c1 = i['srcX'] < size_src[0]
28 c2 = i['srcX'] + i['width'] >= 0
29 c3 = i['srcY'] < size_src[1]
30 c4 = i['srcY'] + i['height'] >= 0
31 if c1 and c2 and c3 and c4:
32 region = self.__image_src.crop((i['destX'], i['destY'], dx, dy))
33 self.__image_dst.paste(region, (i['srcX'], i['srcY'], x, y))
36 class SundayWebryCom: # pragma: no cover
37 _result = None
39 def solve_by_img(self, src: str, element_width: int, element_height: int, n: int):
40 img = Image.open(src)
41 sizes = img.size
42 img.close()
43 return self.solve(*sizes, element_width, element_height, n)
45 def solve(self, width: int, height: int, element_width: int, element_height: int, n: int):
46 e = width
47 t = height
48 r = element_width
49 i = element_height
51 y = int(e / r)
52 g = int(t / i)
53 f = e % r
54 b = t % i
55 self._result = []
57 s = y - 43 * n % y
58 if s % y == 0:
59 s = (y - 4) % y
61 a = g - 47 * n % g
62 if a % g == 0:
63 a = (g - 4) % g
64 if 0 == a:
65 a = g - 1
67 self.def1(f, b, s, r, a, i)
69 self.def2(y, i, n, a, s, f, r, g, b)
71 if f > 0:
72 self.def3(g, n, s, a, y, b, i, r, f)
74 self.def4(y, g, n, r, f, s, a, i, b)
76 return self._result
78 def def1(self, f, b, s, r, a, i):
79 if f > 0 and b > 0:
80 o = s * r
81 u = a * i
82 self._result.append({
83 'srcX': o,
84 'srcY': u,
85 'destX': o,
86 'destY': u,
87 'width': f,
88 'height': b,
89 # 'debug': 1
92 def def2(self, y, i, n, a, s, f, r, g, b):
93 for l in range(y):
94 d = self._calc_x_x(l, y, n)
95 h = self._calc_y_x(d, s, a, g, n)
96 c = self._calc_pos_rest(d, s, f, r)
97 p = h * i
98 o = self._calc_pos_rest(l, s, f, r)
99 u = a * i
100 self._result.append({
101 'srcX': o,
102 'srcY': u,
103 'destX': c,
104 'destY': p,
105 'width': r,
106 'height': b,
107 # 'debug': 2
110 def def3(self, g, n, s, a, y, b, i, r, f):
111 for m in range(g):
112 h = self._calc_y_y(m, g, n)
113 d = self._calc_x_y(h, s, a, y, n)
114 p = self._calc_pos_rest(h, a, b, i)
115 u = self._calc_pos_rest(m, a, b, i)
116 self._result.append({
117 'srcX': s * r,
118 'srcY': u,
119 'destX': d * r,
120 'destY': p,
121 'width': f,
122 'height': i,
123 # 'debug': 3
126 def def4(self, y, g, n, r, f, s, a, i, b):
127 for l in range(y):
128 for m in range(g):
129 d = (l + 29 * n + 31 * m) % y
130 h = (m + 37 * n + 41 * d) % g
131 c = d * r + (f if d >= self._calc_x_y(h, s, a, y, n) else 0)
132 p = h * i + (b if h >= self._calc_y_x(d, s, a, g, n) else 0)
133 o = l * r + (f if l >= s else 0)
134 u = m * i + (b if m >= a else 0)
135 self._result.append({
136 'srcX': o,
137 'srcY': u,
138 'destX': c,
139 'destY': p,
140 'width': r,
141 'height': i,
142 # 'debug': 4
145 @staticmethod
146 def _calc_pos_rest(e, t, r, i):
147 m = 0
148 if e >= t:
149 m = r
150 return e * i + m
152 @staticmethod
153 def _calc_x_x(e, t, r):
154 return (e + 61 * r) % t
156 @staticmethod
157 def _calc_x_y(e, t, r, i, n):
158 o = (n % 2 == 1)
159 if (e < r and o) or (e >= r and not o):
160 a = i - t
161 s = t
162 else:
163 a = t
164 s = 0
165 return (e + 67 * n + t + 71) % a + s
167 @staticmethod
168 def _calc_y_x(e, t, r, i, n):
169 o = (n % 2 == 1)
170 if (e < t and o) or (e >= t and not o):
171 a = r
172 s = 0
173 else:
174 a = i - r
175 s = r
176 return (e + 53 * n + 59 * r) % a + s
178 @staticmethod
179 def _calc_y_y(e, t, r):
180 return (e + 73 * r) % t