unRar(String extName, byte[] data, String objPath) {
67 | Runtime rt = Runtime.getRuntime();
68 | StringBuffer result = new StringBuffer();
69 | try {
70 | logger.info("在临时目录中解压:"+objPath);
71 | if(!new File(objPath).exists()) {
72 | MyFileUtil.dirCreate(objPath, true);
73 | }
74 | String objFile = String.format("%s/data.%s", objPath, extName);
75 | MyFileUtil.fileWriteBin(objFile, data);
76 | //String execStr = String.format("%s e -r -o+ -ap %s -ad %s", osPath(binPath), osPath(objFile), osPath(objPath));
77 | String execStr = String.format("%s e \"%s\" -o\"%s\" -aoa", osPath(binPath), osPath(objFile), osPath(objPath+"/data"));
78 | Process p = rt.exec(execStr);//rt.exec(execStr, null, new File(objPath));
79 | logger.info("解压命令: "+execStr);
80 |
81 | InputStream fis = p.getInputStream();
82 | InputStreamReader isr = new InputStreamReader(fis,"GBK");
83 | BufferedReader br = new BufferedReader(isr);
84 | String line = null;
85 | while ((line = br.readLine()) != null) {
86 | result.append(line);
87 | result.append("\r\n");
88 | }
89 | logger.info(result.toString());
90 | if(result.indexOf("Everything is Ok") > 0) {//if(result.indexOf("全部正常") > 0) {
91 | logger.info("解压成功");
92 | }else {
93 | logger.error("解压失败");
94 | return null;
95 | }
96 | }catch(Exception e) {
97 | e.printStackTrace();
98 | return null;
99 | }
100 | return MyFileUtil.getFileList(objPath, true);
101 | }
102 |
103 | }
104 |
--------------------------------------------------------------------------------
/src/main/java/zimu/util/regex/AbstractReplaceCallBack.java:
--------------------------------------------------------------------------------
1 | package zimu.util.regex;
2 |
3 | import java.util.regex.Matcher;
4 |
5 | public abstract class AbstractReplaceCallBack implements ReplaceCallBack {
6 |
7 | protected Matcher matcher;
8 |
9 | /*
10 | * (non-Javadoc)
11 | *
12 | * @see utils.ReplaceCallBack#replace(java.lang.String, int, java.util.regex.Matcher)
13 | */
14 | final public String replace(String text, int index, Matcher matcher) {
15 | this.matcher = matcher;
16 | try {
17 | return doReplace(text, index, matcher);
18 | } finally {
19 | this.matcher = null;
20 | }
21 | }
22 |
23 | /**
24 | * 将text转化为特定的字串返回
25 | *
26 | * @param text
27 | * 指定的字符串
28 | * @param index
29 | * 替换的次序
30 | * @param matcher
31 | * Matcher对象
32 | * @return
33 | */
34 | public abstract String doReplace(String text, int index, Matcher matcher);
35 |
36 | /**
37 | * 获得matcher中的组数据
38 | *
39 | * 等同于matcher.group(group)
40 | *
41 | * 该函数只能在{@link #doReplace(String, int, Matcher)} 中调用
42 | *
43 | * @param group
44 | * @return
45 | */
46 | protected String $(int group) {
47 | String data = matcher.group(group);
48 | return data == null ? "" : data;
49 | }
50 |
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/zimu/util/regex/RegexUtil.java:
--------------------------------------------------------------------------------
1 | package zimu.util.regex;
2 |
3 | import java.util.regex.Matcher;
4 | import java.util.regex.Pattern;
5 |
6 | import cn.hutool.core.util.StrUtil;
7 | import cn.hutool.json.JSONArray;
8 |
9 |
10 |
11 | /**
12 |
13 |
14 | 多个flags 这样使用 Pattern.CASE_INSENSITIVE|Pattern.DOTALL
15 | Pattern.CASE_INSENSITIVE
16 | 将启动对ASCII字符不区分大小写匹配
17 | Pattern.UNICODE_CASE
18 | 将启动Unicode字符不区分大小写匹配
19 | Pattern.DOTALL
20 | 将启动dotall模式,该模式下,"."将表示任意字符,包括回车符
21 |
22 | Pattern.CANON_EQ 当且仅当两个字符的”正规分解(canonical decomposition)”都完全相同的情况下,才认定匹配.比如用了这个标志之后,表达式”a\u030A”会匹配”?”.默认情况下,不考虑”规范相等性(canonical equivalence)”.
23 |
24 | Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集.这个标志能让表达式忽略大小写进行匹配.要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了.
25 |
26 | Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的”\s”,而是指表达式里的空格,tab,回车之类).注释从#开始,一直到这行结束.可以通过嵌入式的标志来启用Unix行模式.
27 |
28 | Pattern.DOTALL(?s)在这种模式下,表达式’.’可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.’不匹配行的结束符.
29 |
30 | Pattern.MULTILINE(?m)在这种模式下,’\^’和’$’分别匹配一行的开始和结束.此外,’^’仍然匹配字符串的开始,’$’也匹配字符串的结束.默认情况下,这两个表达式仅仅匹配字符串的开始和结束.
31 |
32 | Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配.默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集.
33 |
34 | Pattern.UNIX_LINES(?d) 在这个模式下,只有’\n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配.
35 |
36 | *
37 | */
38 | public class RegexUtil {
39 | public static void main(String[] args) {
40 | System.out.println(getMatchStr("aaaabb=123bccc", "aaaabb=([\\d]+)"));
41 | System.out.println(getMatchList("aaaabb=123bccc345AAA,aaaabb123bccc345AAA,aaaabb123bccc345AAA", "aaaabb=([\\d]+)[^,]+(AAA)"));
42 | }
43 |
44 | /**
45 | * 获取匹配字符串
46 | *
47 | * @return
48 | */
49 | public static String getMatchStr(String str, String regex) {
50 | if (str == null) {
51 | return "";
52 | }
53 | Pattern pattern = Pattern.compile(regex);
54 | Matcher m = pattern.matcher(str);
55 | if (m.find()) {
56 | return m.group(1);
57 | }
58 | return "";
59 | }
60 | public static String getMatchStr(String str, String regex, int flags) {
61 | if (str == null) {
62 | return "";
63 | }
64 | Pattern pattern = Pattern.compile(regex, flags);
65 | Matcher m = pattern.matcher(str);
66 | if (m.find()) {
67 | return m.group(1);
68 | }
69 | return "";
70 | }
71 | /**
72 | * 获取匹配列表--1维数组
73 | * @param str
74 | * @param regex
75 | * @return
76 | */
77 | public static String[] getMatchArray(String str, String regex) {
78 | if (str == null) {
79 | return new String[]{};
80 | }
81 | Pattern pattern = Pattern.compile(regex);
82 | Matcher m = pattern.matcher(str);
83 | while (m.find()) {
84 | String[] arr = new String[m.groupCount()];
85 | for(int i = 1; i <= m.groupCount(); i++){
86 | arr[i-1] = m.group(i);
87 | }
88 | return arr;
89 | }
90 | return new String[]{};
91 | }
92 |
93 | public static String[] getMatchArray(String str, String regex, int flags) {
94 | if (str == null) {
95 | return new String[]{};
96 | }
97 | Pattern pattern = Pattern.compile(regex, flags);
98 | Matcher m = pattern.matcher(str);
99 | while (m.find()) {
100 | String[] arr = new String[m.groupCount()];
101 | for(int i = 1; i <= m.groupCount(); i++){
102 | arr[i-1] = m.group(i);
103 | }
104 | return arr;
105 | }
106 | return new String[]{};
107 | }
108 |
109 | /**
110 | * 获取匹配列表--2维数组
111 | * @param str
112 | * @param regex
113 | * @return
114 | */
115 | public static JSONArray getMatchList(String str, String regex) {
116 | JSONArray list = new JSONArray();
117 | if (str == null) {
118 | return list;
119 | }
120 | Pattern pattern = Pattern.compile(regex);
121 | Matcher m = pattern.matcher(str);
122 | while (m.find()) {
123 | JSONArray row = new JSONArray();
124 | for(int i = 1; i <= m.groupCount(); i++){
125 | row.add(m.group(i));
126 | }
127 | list.add(row);
128 | }
129 | return list;
130 | }
131 | public static JSONArray getMatchList(String str, String regex, int flags) {
132 | JSONArray list = new JSONArray();
133 | if (str == null) {
134 | return list;
135 | }
136 | Pattern pattern = Pattern.compile(regex, flags);
137 | Matcher m = pattern.matcher(str);
138 | while (m.find()) {
139 | JSONArray row = new JSONArray();
140 | for(int i = 1; i <= m.groupCount(); i++){
141 | row.add(m.group(i));
142 | }
143 | list.add(row);
144 | }
145 | return list;
146 | }
147 |
148 | /**
149 | * 将String中的所有regex匹配的字串全部替换掉
150 | *
151 | * @param string
152 | * 代替换的字符串
153 | * @param regex
154 | * 替换查找的正则表达式
155 | * @param replacement
156 | * 替换函数
157 | * @return
158 | */
159 | public static String replaceAll(String string, String regex, ReplaceCallBack replacement) {
160 | return replaceAll(string, Pattern.compile(regex), replacement);
161 | }
162 | public static String replaceAll(String string, String regex, int flags, ReplaceCallBack replacement) {
163 | return replaceAll(string, Pattern.compile(regex, flags), replacement);
164 | }
165 |
166 | /**
167 | * 将String中的所有pattern匹配的字串替换掉
168 | *
169 | * @param string
170 | * 代替换的字符串
171 | * @param pattern
172 | * 替换查找的正则表达式对象
173 | * @param replacement
174 | * 替换函数
175 | * @return
176 | */
177 | public static String replaceAll(String string, Pattern pattern, ReplaceCallBack replacement) {
178 | if (string == null) {
179 | return null;
180 | }
181 | Matcher m = pattern.matcher(string);
182 | if (m.find()) {
183 | StringBuffer sb = new StringBuffer();
184 | int index = 0;
185 | while (true) {
186 | m.appendReplacement(sb, replacement.replace(m.group(0), index++, m));
187 | if (!m.find()) {
188 | break;
189 | }
190 | }
191 | m.appendTail(sb);
192 | return sb.toString();
193 | }
194 | return string;
195 | }
196 |
197 | /**
198 | * 将String中的regex第一次匹配的字串替换掉
199 | *
200 | * @param string
201 | * 代替换的字符串
202 | * @param regex
203 | * 替换查找的正则表达式
204 | * @param replacement
205 | * 替换函数
206 | * @return
207 | */
208 | public static String replaceFirst(String string, String regex, ReplaceCallBack replacement) {
209 | return replaceFirst(string, Pattern.compile(regex), replacement);
210 | }
211 | public static String replaceFirst(String string, String regex, int flags, ReplaceCallBack replacement) {
212 | return replaceFirst(string, Pattern.compile(regex, flags), replacement);
213 | }
214 |
215 | /**
216 | * 将String中的pattern第一次匹配的字串替换掉
217 | *
218 | * @param string
219 | * 代替换的字符串
220 | * @param pattern
221 | * 替换查找的正则表达式对象
222 | * @param replacement
223 | * 替换函数
224 | * @return
225 | */
226 | public static String replaceFirst(String string, Pattern pattern, ReplaceCallBack replacement) {
227 | if (string == null) {
228 | return null;
229 | }
230 | Matcher m = pattern.matcher(string);
231 | StringBuffer sb = new StringBuffer();
232 | if (m.find()) {
233 | m.appendReplacement(sb, replacement.replace(m.group(0), 0, m));
234 | }
235 | m.appendTail(sb);
236 | return sb.toString();
237 | }
238 |
239 |
240 |
241 | /**
242 | * 转义正则特殊字符 ($()*+.[]?\^{},|)
243 | *
244 | * @param keyword
245 | * @return
246 | */
247 | public static String escapeExprSpecialWord(String keyword) {
248 | if (StrUtil.isNotEmpty(keyword)) {
249 | //Java过滤正则表达式特殊字代码如下(注意:\\需要第一个替换,否则replace方法替换时会有逻辑bug)
250 | String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
251 | for (String key : fbsArr) {
252 | if (keyword.contains(key)) {
253 | keyword = keyword.replace(key, "\\" + key);
254 | }
255 | }
256 | }
257 | return keyword;
258 | }
259 | }
260 |
--------------------------------------------------------------------------------
/src/main/java/zimu/util/regex/ReplaceCallBack.java:
--------------------------------------------------------------------------------
1 | package zimu.util.regex;
2 |
3 | import java.util.regex.Matcher;
4 |
5 | /**
6 | * 字符串替换的回调接口
7 | *
8 | * @author yeyong
9 | *
10 | */
11 | public interface ReplaceCallBack {
12 | /**
13 | * 将text转化为特定的字串返回
14 | *
15 | * @param text
16 | * 指定的字符串
17 | * @param index
18 | * 替换的次序
19 | * @param matcher
20 | * Matcher对象
21 | * @return
22 | */
23 | public String replace(String text, int index, Matcher matcher);
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/zimu/util/regex/Test.java:
--------------------------------------------------------------------------------
1 | package zimu.util.regex;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 | import java.util.regex.Matcher;
6 |
7 | public class Test {
8 |
9 | public static void main(String[] args) {
10 | String string = "the quick-brown fox jumps over the lazy-dog.";
11 | String pattern = "\\b(\\w)(\\w*?)\\b";
12 | // 将每个单词改为首字大写其他字母小写
13 | System.out.println(RegexUtil.replaceAll(string, pattern, new AbstractReplaceCallBack() {
14 | public String doReplace(String text, int index, Matcher matcher) {
15 | return $(1).toUpperCase() + $(2).toLowerCase();
16 | }
17 | }));
18 | // 输出:The Quick-Brown Fox Jumps Over The Lazy-Dog.
19 |
20 | // 将文本中类似aaa-bbb-ccc的替换为AaaBbbCcc
21 | string = "the quick-brown fox jumps over the lazy-dog. aaa-bbbb-cccc-ddd";
22 | pattern = "\\b\\w+(?:-\\w+)+\\b";
23 | System.out.println(RegexUtil.replaceAll(string, pattern, new AbstractReplaceCallBack() {
24 | private ReplaceCallBack callBack = new AbstractReplaceCallBack() {
25 | public String doReplace(String text, int index, Matcher matcher) {
26 | return $(1).toUpperCase() + $(2).toLowerCase();
27 | }
28 | };
29 |
30 | public String doReplace(String text, int index, Matcher matcher) {
31 | return RegexUtil.replaceAll(text, "(?:\\b|-)(\\w)(\\w*?)\\b", callBack);
32 | }
33 | }));
34 | // 输出: the QuickBrown fox jumps over the LazyDog. AaaBbbbCcccDdd
35 |
36 | // 过滤安全字符... TODO 应提取为一个方法
37 | final Map map = new HashMap() {
38 | private static final long serialVersionUID = 1L;
39 | {
40 | put("<", "<");
41 | put(">", ">");
42 | put("\"", """);
43 | put("'", "'");
44 | }
45 | };
46 | ReplaceCallBack callBack = new ReplaceCallBack() {
47 | public String replace(String text, int index, Matcher matcher) {
48 | return map.get(text);
49 | }
50 | };
51 | string = "xxxxx 1<4 & 7>5";
52 | System.out.println(RegexUtil.replaceAll(string.replace("&", "&"), "[<>\"\']", callBack));
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/src/main/resources/html/extract_dialog.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ExtractDialog
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
40 |
44 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/src/main/resources/html/images/btn_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/btn_about.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/css/style.css:
--------------------------------------------------------------------------------
1 | /*公共属性*/
2 | body, dl, dt, dd, ol, ul, pre, form,input, textarea, select, button, file, field, p, blockquote, h1, h2, h3, h4, h5, h6,th, td {
3 | font-family:"微软雅黑","Microsoft Yahei","Source Sans Pro", Helvetica, Arial, sans-serif,"宋体";
4 | margin:0; padding:0;
5 |
6 | font-size:12px;
7 | }
8 |
9 | a{text-decoration:none;}
10 | a:link, a:visited { text-decoration:none; }
11 | a:hover, a:active { text-decoration:underline; }
12 |
13 |
14 | ul, ol { list-style:none;list-style-type:none;}
15 | img { border:0;}
16 |
17 |
18 | b{font-size:bold;}
19 | :focus {
20 | outline: 0;
21 | }
22 | input,textarea,button{
23 | outline:none;
24 | resize:none;
25 |
26 | -webkit-appearance:none;
27 | appearance:none;
28 |
29 | -webkit-border-radius: 0px;
30 | -moz-border-radius: 0px;
31 | border-radius: 0px;
32 |
33 | }
34 | button,input[type=button],input[type=submit],input[type=reset]{
35 |
36 | }
37 |
38 | select, input, textarea, button {outline:none; resize:none;}
39 |
40 |
41 |
42 | .clearfix {
43 | *zoom: 1;
44 | }
45 | .clearfix:before,
46 | .clearfix:after {
47 | display: table;
48 | content: "";
49 | line-height: 0;
50 | }
51 | .clearfix:after {
52 | clear: both;
53 | }
54 |
55 | body{
56 | -webkit-touch-callout: none;
57 | -webkit-user-select: none;
58 | -moz-user-select: none;
59 | -ms-user-select: none;
60 | user-select: none;
61 | background:#fff;
62 | }
63 |
64 | html,body{
65 | height:100%;
66 | box-sizing:border-box;
67 | overflow: hidden;
68 | }
69 |
70 |
71 | .input {height:22px; line-height:22px;background:#FFFFFF; color:#666666; border:1px solid #CCCCCC; padding:1px}
72 | .input:hover {background:#FFFAF0; color:#666666; border:1px solid #7F9DB9;}
73 | .input:focus {background:#FFFFFF; color:#14238A; border:1px solid #7F9DB9;}
74 | .input[readonly] {background:#eeeeee; color:#888888; border:1px solid #CCCCCC;}
75 | .input[disabled] {background:#efefef; color:#aaa; border:1px solid #ddd;}
76 |
77 |
78 | .textarea {background:#FFFFFF; color:#666666; border:1px solid #CCCCCC; padding:1px}
79 | .textarea:hover {background:#FFFAF0; color:#666666; border:1px solid #7F9DB9;}
80 | .textarea:focus {background:#FFFFFF; color:#14238A; border:1px solid #7F9DB9;}
81 | .textarea[readonly] {background:#eeeeee; color:#888888; border:1px solid #CCCCCC;}
82 | .textarea[disabled] {background:#efefef; color:#aaa; border:1px solid #ddd;}
83 |
84 |
85 |
86 | .button1{
87 | box-sizing:border-box;
88 | -moz-box-sizing:border-box;
89 | -webkit-box-sizing:border-box;
90 |
91 | padding:6px 10px 6px 10px;
92 | height:28px;
93 | line-height:28px;
94 |
95 | color: #565f64;
96 |
97 | border: 1px solid #cecece;
98 | background: #fcfcfc;
99 | background: -webkit-linear-gradient(top,#fcfcfc 0,#fcfcfc 50%,#e7e7e7 100%);
100 | background: -moz-linear-gradient(top,#fcfcfc 0,#fcfcfc 50%,#e7e7e7 100%);
101 | background: -ms-linear-gradient(top,#fcfcfc 0,#fcfcfc 50%,#e7e7e7 100%);
102 | background: -o-linear-gradient(top,#fcfcfc 0,#fcfcfc 50%,#e7e7e7 100%);
103 | background: linear-gradient(top,#fcfcfc 0,#fcfcfc 50%,#e7e7e7 100%);
104 |
105 | border-radius: 2px;
106 |
107 | cursor:pointer;
108 | text-decoration:none;
109 | }
110 | input.button1{
111 | padding:4px 10px 4px 10px;
112 | height:26px;
113 | line-height:16px;
114 | }
115 | .button1:hover{
116 | text-decoration:none;
117 | color: #565f64;
118 | background: #fcfcfc;
119 | background: -webkit-linear-gradient(top,#fcfcfc 0,#e7e7e7 100%);
120 | background: -moz-linear-gradient(top,#fcfcfc 0,#e7e7e7 100%);
121 | background: -ms-linear-gradient(top,#fcfcfc 0,#e7e7e7 100%);
122 | background: -o-linear-gradient(top,#fcfcfc 0,#e7e7e7 100%);
123 | background: linear-gradient(top,#fcfcfc 0,#e7e7e7 100%)
124 | }
125 | .button1:active{
126 | text-decoration:none;
127 | background: #f7f7f7;
128 | box-shadow: inset 3px 3px 5px -2px #cecece;
129 | }
130 |
131 | .button1:focus{
132 | text-decoration:none;
133 | border-color: #9b9b9b
134 | }
135 | .button1[disabled]{
136 | cursor:default;
137 | border:0px;
138 | background:#E1E1E1;
139 | color:#AAAAAA;
140 | }
141 |
142 |
143 | .button2{
144 | box-sizing:border-box;
145 | -moz-box-sizing:border-box;
146 | -webkit-box-sizing:border-box;
147 |
148 | padding:6px 10px 6px 10px;
149 | height:24px;
150 | line-height:24px;
151 |
152 | color: #fff;
153 |
154 | border: 0;
155 | background:#A3A3A3;
156 |
157 | border-radius: 2px;
158 |
159 | cursor:pointer;
160 | text-decoration:none;
161 | }
162 | input.button2{
163 | padding:4px 10px 4px 10px;
164 | height:26px;
165 | line-height:16px;
166 | }
167 | .button2:hover{
168 | text-decoration:none;
169 | background:#666666;
170 | color:#fff;
171 |
172 | -webkit-transition: all 0.20s ease-in;
173 | -moz-transition: all 0.20s ease-in;
174 | -o-transition: all 0.20s ease-in;
175 | -ms-transition: all 0.20s ease-in;
176 | transition: all 0.20s ease-in;
177 | }
178 | .button2:active{
179 | text-decoration:none;
180 | background:#666666;
181 | color:#fff;
182 |
183 | -webkit-transition: all 0.20s ease-in;
184 | -moz-transition: all 0.20s ease-in;
185 | -o-transition: all 0.20s ease-in;
186 | -ms-transition: all 0.20s ease-in;
187 | transition: all 0.20s ease-in;
188 | }
189 |
190 | .button2:focus{
191 | text-decoration:none;
192 | border-color: #9b9b9b
193 | }
194 | .button2[disabled]{
195 | cursor:default;
196 | border:0px;
197 | background:#E1E1E1;
198 | color:#AAAAAA;
199 | }
200 |
201 |
202 | #search_box{
203 | background:#eee;
204 | }
205 | #search_box .con{
206 | padding:5px;
207 | }
208 | #list_body{
209 | overflow-y:scroll;
210 |
211 | height:100px;
212 |
213 | -webkit-user-select: text;
214 | -moz-user-select: text;
215 | -ms-user-select: text;
216 | user-select: text;
217 | }
218 | #list_header{
219 |
220 | }
221 | #list_footer{
222 | position:fixed;
223 | bottom:0;
224 | left:0;
225 | width:100%;
226 | line-height:40px;
227 | background:#eee;
228 | }
229 |
230 | .list_table {
231 | width: 100%;
232 | border-collapse: collapse;
233 | background:#ffffff;
234 | }
235 | .list_table>tbody>tr{
236 | background:#F9F9F9;
237 | }
238 | .list_table>tbody>tr>td:nth-child(even){
239 | background:#FFFFFF;
240 | }
241 | .list_table>tbody>tr:nth-child(even){
242 | background:#EEEEEE;
243 | }
244 | .list_table>tbody>tr:nth-child(even)>td:nth-child(even){
245 | background:#F6F6F6;
246 | }
247 |
248 | .list_table>tbody>tr:hover>td{
249 | background:#F2ED7C !important;
250 | }
251 | .list_table>tbody>tr:hover>td:nth-child(even){
252 | background:#FCF790 !important;
253 | }
254 | .list_table>tbody>tr .td_op{
255 | background:#F0EDE8 !important;
256 | }
257 | .list_table>tbody>tr:nth-child(even) .td_op{
258 | background:#DFDFDF !important;
259 | }
260 | .list_table>tbody>tr:hover>td.td_op{
261 | background:#C6F0F5 !important;
262 | }
263 |
264 | .list_table>tbody>tr .btn{
265 | margin:1px 2px;
266 | padding:4px 9px 3px 9px;
267 | -webkit-border-radius: 5px;
268 | -moz-border-radius: 5px;
269 | border-radius: 5px;
270 | display:inline-block;
271 | text-align:center;
272 | text-decoration: none;
273 | color:#1C84C6;
274 | }
275 | .list_table>tbody>tr .btn_gray{
276 | color:#aaa;
277 | }
278 |
279 | .list_table>tbody>tr:hover .btn{
280 | background:rgba(163,163,163, 0.6);
281 | color:#fff;
282 |
283 | }
284 | .list_table>tbody>tr:hover .btn *{
285 | color:#000;
286 | }
287 | .list_table>tbody>tr:hover .font_gray{
288 | color:#eee;
289 | }
290 |
291 |
292 | .list_table>tbody>tr:hover .btn:hover{
293 | background:#A3A3A3;
294 | color:#fff;
295 | text-decoration: none;
296 | }
297 | .list_table>tbody>tr:hover .btn:hover *{
298 | color:#fff;
299 | }
300 |
301 |
302 | .list_table>thead>tr>th {
303 | color: #555;
304 | background:#E1E1E1;
305 | border-top: 1px solid #DDDDDD;
306 | text-align:center;
307 | padding:8px 3px;
308 | }
309 | .list_table>thead>tr>th:nth-child(even){
310 | background:#E8E8E8;
311 | }
312 | .list_table>tbody>tr>td {
313 | border-top: 1px solid #DDDDDD;
314 | border-bottom: none;
315 | color:#898E94;
316 | padding:4px 3px;
317 | }
318 |
319 | .list_table>tbody>tr:last-child{
320 | border-bottom: 1px solid #DDDDDD;
321 | }
322 |
323 |
324 | .list_no_data{
325 | padding:20px;
326 | margin:0px auto;
327 | text-align:center;
328 | font-size:14px;
329 | border:1px solid #DDDDDD;
330 | border-left:0px;
331 | border-right:0px;
332 | background:#F7F7F7;
333 | }
334 | .list_button_op{
335 | padding:10px 24px;
336 | margin:0px auto;
337 | background:#EEEFF2;
338 | border-bottom:1px solid #DDDDDD;
339 |
340 | }
341 |
342 |
343 | .list_tips{
344 | padding:10px 20px;
345 | margin:0px auto;
346 | text-align:left;
347 | font-size:12px;
348 | color:#8A6D3B;
349 | border:1px solid #FAEBCC;
350 | border-left:0px;
351 | border-right:0px;
352 | background:#FCF8E3;
353 | }
354 | .pages{
355 | text-align:right;
356 | }
357 |
358 | .batch_ctl{
359 | line-height:40px;
360 | margin-bottom:-40px;
361 |
362 | }
363 |
364 | .table_sort_none a{
365 | display:inline-block;
366 | }
367 | .table_sort_desc a,.table_sort_asc a{
368 | display:inline-block;
369 | position: relative;
370 | padding-right:10px;
371 | }
372 | .table_sort_desc a::after,.table_sort_asc a::after{
373 | content:"";
374 | position:absolute;
375 | display:block;
376 | right:0;
377 | top:50%;
378 | margin-top:-2px;
379 | width:7px;
380 | height:4px;
381 | background-image:url(../table_sort.png);
382 | background-repeat:no-repeat;
383 | background-position:0 -5px;
384 | }
385 |
386 | .table_sort_asc a::after{
387 | background-position:0 0;
388 | }
389 |
390 |
391 |
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/extract_dialog.js:
--------------------------------------------------------------------------------
1 | $(function(){
2 | set_select_all('#select_all', 'item_id');
3 |
4 | $('.list_table').contextmenu(function (e) {
5 | var sel_text = window.getSelection().toString();
6 | var menu=[
7 | [
8 | '下载字幕',
9 | function (dom) {
10 | down_last_tr_zimu();
11 | }
12 | ],
13 | '|',
14 | [
15 | '下载字幕(UTF-8 繁转简)',
16 | function (dom) {
17 | down_last_tr_zimu('UTF-8');
18 | }
19 | ],
20 | [
21 | '下载字幕(GBK 繁转简)',
22 | function (dom) {
23 | down_last_tr_zimu('GBK');
24 | }
25 | ],
26 | [
27 | '下载字幕(Big5 繁转简)',
28 | function (dom) {
29 | down_last_tr_zimu('Big5');
30 | }
31 | ]
32 | ];
33 | var title;
34 | if(typeof(last_list_table_tr) != 'undefined' && last_list_table_tr.length > 0){
35 | title = last_list_table_tr.find('.title').text();
36 | if(title){
37 | title = title.trim();
38 | if(title.length > 100){
39 | title = title.substring(0,100);
40 | }
41 | menu.push('|');
42 | menu.push([
43 | '复制文字:'+title,
44 | function (dom) {
45 | app.copyClipboard(title);
46 | }
47 | ]);
48 | }
49 | }
50 | if(sel_text){
51 | sel_text = sel_text.trim();
52 | if(sel_text.length > 100){
53 | sel_text = sel_text.substring(0,100);
54 | }
55 | if(title!=sel_text){
56 | menu.push([
57 | '复制文字:'+sel_text,
58 | function (dom) {
59 | app.copyClipboard(sel_text);
60 | }
61 | ]);
62 | }
63 | }
64 | ContextMenu.render(e,menu,this); //开始渲染
65 | });
66 | $('.list_table').on('mouseenter','tr',function(){
67 | window.last_list_table_tr = $(this);
68 | });
69 | $('.list_table').on('click','.download',function(){
70 | var btn = this;
71 | btn.disabled = true;
72 | var tr = $(this).parents('tr');
73 | down_zimu(tr.find('input[name="item_id"]').val(), tr.find('select[name="item_simplified_charset"]').val());
74 | window.setTimeout(function(){
75 | btn.disabled = false;
76 | }, 300);
77 | });
78 |
79 | $('#simplified_select_all').change(function(){
80 | var checkbox = this;
81 | $('select[name="item_simplified_charset"]').each(function(){
82 | console.log(checkbox.checked)
83 | if($(this).val() == '' && checkbox.checked){
84 | $(this).val('UTF-8');
85 | $(this).trigger('nf_change');
86 | }else if(!checkbox.checked){
87 | $(this).val('');
88 | $(this).trigger('nf_change');
89 | }
90 | });
91 | });
92 |
93 | $('#btn_download').on('click', function(){
94 | var btn = this;
95 | btn.disabled = true;
96 |
97 | var items_ids = [];
98 |
99 | var item_simplified_charset = $('select[name="item_simplified_charset"]');
100 | $('input[type="checkbox"][name="item_id"]').each(function(index){
101 | var charset = item_simplified_charset.eq(index).val();
102 | var title = $('.list_table .title').eq(index).attr('val');
103 | if(this.checked){
104 | items_ids.push({
105 | id:this.value,
106 | filenameType:1,
107 | title:title,
108 | simplified:charset.length>0,
109 | charset:charset
110 | });
111 | }
112 | });
113 | if(items_ids.length == 0){
114 | btn.disabled = false;
115 | my_alert('请选择字幕');
116 | return;
117 | }
118 |
119 | var searchData = {
120 | items : items_ids
121 | };
122 | ajax_jsonp('/extract_api/down_archive_file',{
123 | data : json_encode(searchData)
124 | }, function (data){
125 | btn.disabled = false;
126 | if(data.result > 0){
127 | my_alert(data.message);
128 | return;
129 | }
130 | if(data == null){
131 | my_alert('初始化数据失败');
132 | return;
133 | }
134 | if(data.saveSelected){
135 | my_tip('下载成功');
136 | }else{
137 | my_tip('下载失败');
138 | }
139 | });
140 | });
141 |
142 | //window.serverPort = serverPort;
143 | window.serverUrl = "http://127.0.0.1:"+serverPort;
144 | laytpl_preload('#rec_list_tpl');
145 | init_data();
146 | });
147 |
148 | function init_data(){
149 | ajax_jsonp('/extract_api/get_init_data',{
150 |
151 | }, function (data){
152 | if(data.result > 0){
153 | my_alert(data.message);
154 | return;
155 | }
156 | if(data == null){
157 | my_alert('初始化数据失败');
158 | return;
159 | }
160 |
161 | $('#search_box .con').html(data.title + '('+data.archiveExt+', '+data.archiveSizeF+')');
162 |
163 | $('#status_label').html('压缩包里共有'+data.list.length+'个字幕文件');
164 | $('#rec_list').empty();
165 | laytpl_render('#rec_list_tpl', data, function(html){
166 | $('#rec_list').append(html);
167 | $('#batch_from').newforms();
168 | });
169 | });
170 | }
171 | //下载鼠标最后移动到的字幕
172 | function down_last_tr_zimu(charset){
173 | if(typeof(last_list_table_tr) == 'undefined' || last_list_table_tr.length == 0){
174 | my_alert('数据错误');
175 | return;
176 | }
177 | down_zimu(last_list_table_tr.find('input[name="item_id"]').val(), charset);
178 | }
179 | //下载指定字幕
180 | function down_zimu(id, charset){
181 |
182 | var items_ids = [];
183 | if(!charset){
184 | charset = $('select[name="item_simplified_charset"]').eq(id).val();
185 | }
186 | var title = $('.list_table .title').eq(id).attr('val');
187 | items_ids.push({
188 | id:id,
189 | filenameType:0,
190 | title:title,
191 | simplified:charset.length>0,
192 | charset:charset
193 | });
194 | if(items_ids.length == 0){
195 | my_alert('请选择字幕');
196 | return;
197 | }
198 |
199 | var searchData = {
200 | items : items_ids
201 | };
202 | ajax_jsonp('/extract_api/down_archive_file',{
203 | data : json_encode(searchData)
204 | }, function (data){
205 | if(data.result > 0){
206 | my_alert(data.message);
207 | return;
208 | }
209 | if(data == null){
210 | my_alert('初始化数据失败');
211 | return;
212 | }
213 | if(data.saveSelected){
214 | my_tip('下载成功');
215 | }else{
216 | my_tip('下载失败');
217 | }
218 | });
219 | }
220 |
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/icon-ext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/layer/theme/default/icon-ext.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/layer/theme/default/icon.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/layer.css:
--------------------------------------------------------------------------------
1 | .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/loading-0.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/layer/theme/default/loading-0.gif
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/loading-1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/layer/theme/default/loading-1.gif
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/layer/theme/default/loading-2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/layer/theme/default/loading-2.gif
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/main.js:
--------------------------------------------------------------------------------
1 | $(function(){
2 | $(window).resize(function(){
3 | $('#list_body').height($(window).height() - $('#search_box').height() - $('#list_footer').height());
4 | }).resize();
5 | if(document.search_from){
6 | $('#search_from').newforms();
7 | $('#batch_from').newforms();
8 | }
9 |
10 |
11 |
12 | });
13 | window.app = {
14 | about : function(){
15 | if(!this.inApp())return;
16 | javaApp.about();
17 | //javaApp.alert('test');
18 | },
19 | getInitData : function(){
20 | if(!this.inApp())return null;
21 | return javaApp.getInitData();
22 | },
23 | openMovFile : function(){
24 | if(!this.inApp())return false;
25 | return javaApp.openMovFile();
26 | },
27 | copyClipboard : function(str){
28 | if(!this.inApp())return false;
29 | return javaApp.copyClipboard(str);
30 | },
31 | inApp : function(){
32 | return (typeof(javaApp)=='object' && typeof(javaApp.test) == 'function')
33 | }
34 | };
35 |
36 | function json_encode(data){
37 | return JSON.stringify(data);
38 | }
39 | function json_decode(data){
40 | ////data = $.parseJSON(data);
41 | return JSON.parse(data);
42 | }
43 |
44 | function ajax_jsonp(url, data, succ_fun, fail_fun){
45 | my_loading_show();
46 | $.ajax({
47 | type : "POST",
48 | url : serverUrl+url,
49 | data : data,
50 | dataType : "jsonp",
51 | success : function(data) {
52 | my_loading_hide();
53 | succ_fun && succ_fun(data);
54 | },
55 | error : function(XMLHttpRequest, textStatus, errorThrown) {
56 | my_loading_hide();
57 | if(fail_fun){
58 | fail_fun(XMLHttpRequest, textStatus, errorThrown);
59 | }else{
60 | my_alert('网络异常');
61 | }
62 | }
63 | });
64 | }
65 |
66 | /**
67 | 设置列表批量选择框
68 | */
69 | function set_select_all(id, bat_name){
70 | $(id).change(function (){
71 | var _this = this;
72 | $('input[name="'+bat_name+'"]').each(function (){
73 | this.checked = _this.checked;
74 | if(this.checked){
75 | $(this).attr('checked', 'checked');
76 | $(this).prop("checked");
77 | }else{
78 | $(this).removeAttr('checked');
79 | $(this).removeProp("checked");
80 | }
81 |
82 | $(this).trigger('nf_change');
83 | })
84 | });
85 | $(document).on('change', 'input[name="'+bat_name+'"]', function (){
86 | var _this = this;
87 | var bat_list = $('input[name="'+bat_name+'"]');
88 | ///console.log($('.list_table').html())
89 | //console.log(bat_list.filter('[checked]').length+","+bat_list.length)
90 | if(bat_list.filter('[checked]').length == bat_list.length){
91 | $(id).get(0).checked = true;
92 | $(id).trigger('nf_change');
93 | }else{
94 | $(id).get(0).checked = false;
95 | $(id).trigger('nf_change');
96 | }
97 | });
98 | }
99 |
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/mainwin.js:
--------------------------------------------------------------------------------
1 | //alert(navigator.userAgent);
2 | $(function(){
3 | set_select_all('#select_all', 'item_id');
4 |
5 | $('.list_table').contextmenu(function (e) {
6 | var sel_text = window.getSelection().toString();
7 | var menu=[
8 | [
9 | '下载字幕',
10 | function (dom) {
11 | down_last_tr_zimu();
12 | }
13 | ],
14 | '|',
15 | [
16 | '下载字幕(UTF-8 繁转简)',
17 | function (dom) {
18 | down_last_tr_zimu('UTF-8');
19 | }
20 | ],
21 | [
22 | '下载字幕(GBK 繁转简)',
23 | function (dom) {
24 | down_last_tr_zimu('GBK');
25 | }
26 | ],
27 | [
28 | '下载字幕(Big5 繁转简)',
29 | function (dom) {
30 | down_last_tr_zimu('Big5');
31 | }
32 | ]
33 | ];
34 | if(typeof(last_list_table_tr) == 'undefined' || last_list_table_tr.find('.download[url]').length>0){
35 | menu = [];
36 | }
37 | var title;
38 | if(typeof(last_list_table_tr) != 'undefined' && last_list_table_tr.length > 0){
39 | title = last_list_table_tr.find('.title').text();
40 | if(title){
41 | title = title.trim();
42 | if(title.length > 100){
43 | title = title.substring(0,100);
44 | }
45 | if(menu.length>0)menu.push('|');
46 | menu.push([
47 | '复制文字:'+title,
48 | function (dom) {
49 | app.copyClipboard(title);
50 | }
51 | ]);
52 | }
53 | }
54 | if(sel_text){
55 | sel_text = sel_text.trim();
56 | if(sel_text.length > 100){
57 | sel_text = sel_text.substring(0,100);
58 | }
59 | if(title!=sel_text){
60 | menu.push([
61 | '复制文字:'+sel_text,
62 | function (dom) {
63 | app.copyClipboard(sel_text);
64 | }
65 | ]);
66 | }
67 | }
68 | if(menu.length==0){
69 | return;
70 | }
71 | ContextMenu.render(e,menu,this); //开始渲染
72 | });
73 | $('.list_table').on('mouseenter','tr',function(){
74 | window.last_list_table_tr = $(this);
75 | });
76 | $('.list_table').on('click','.download',function(){
77 | var tr = $(this).parents('tr');
78 |
79 | if($(this).attr('url')){
80 | ajax_jsonp('/api/open_url',{
81 | url : $(this).attr('url')
82 | }, function (data){
83 | if(data.result > 0){
84 | my_alert(data.message);
85 | return;
86 | }
87 |
88 | });
89 | return;
90 | }
91 | down_zimu(tr.find('input[name="item_id"]').val(), tr.find('select[name="item_simplified_charset"]').val());
92 | });
93 |
94 | $('#btn_about').on('click', function(){
95 | app.about();
96 | });
97 |
98 |
99 | $('#simplified_select_all').change(function(){
100 | var checkbox = this;
101 | $('select[name="item_simplified_charset"]').each(function(){
102 | console.log(checkbox.checked)
103 | if($(this).val() == '' && checkbox.checked){
104 | $(this).val('UTF-8');
105 | $(this).trigger('nf_change');
106 | }else if(!checkbox.checked){
107 | $(this).val('');
108 | $(this).trigger('nf_change');
109 | }
110 | });
111 | });
112 | $('#btn_sel_file').on('click', function(){
113 | var _this = this;
114 | this.disabled = true;
115 | if(app.openMovFile()){
116 | init_data_fileinfo();
117 | search_start_thread();
118 | }
119 | window.setTimeout(function(){
120 | _this.disabled = false;
121 | }, 300);
122 | });
123 | $('#btn_search').on('click', function(){
124 | var _this = this;
125 | this.disabled = true;
126 | search_start_thread(true);
127 | window.setTimeout(function(){
128 | _this.disabled = false;
129 | }, 300);
130 | });
131 | $('#btn_download').on('click', function(){
132 | var _this = this;
133 | this.disabled = true;
134 |
135 | var items_ids = [];
136 |
137 | var item_simplified_charset = $('select[name="item_simplified_charset"]');
138 | $('input[type="checkbox"][name="item_id"]').each(function(index){
139 | var charset = item_simplified_charset.eq(index).val();
140 | if(this.checked){
141 | items_ids.push({
142 | id:this.value,
143 | filenameType:1,
144 | simplified:charset.length>0,
145 | charset:charset
146 | });
147 | }
148 | });
149 | if(items_ids.length == 0){
150 | my_alert('请选择字幕');
151 | return;
152 | }
153 |
154 | var searchData = {
155 | items : items_ids
156 | };
157 | ajax_jsonp('/api/zimu_down',{
158 | data : json_encode(searchData)
159 | }, function (data){
160 | if(data.result > 0){
161 | my_alert(data.message);
162 | return;
163 | }
164 | my_tip('下载完成');
165 | });
166 |
167 | window.setTimeout(function(){
168 | _this.disabled = false;
169 | }, 300);
170 | });
171 |
172 | laytpl_preload('#rec_list_tpl');
173 | init_data();
174 | search_start_thread();
175 | });
176 | //下载鼠标最后移动到的字幕
177 | function down_last_tr_zimu(charset){
178 | if(typeof(last_list_table_tr) == 'undefined' || last_list_table_tr.length == 0){
179 | my_alert('数据错误');
180 | return;
181 | }
182 | down_zimu(last_list_table_tr.find('input[name="item_id"]').val(), charset);
183 | }
184 | //下载指定字幕
185 | function down_zimu(id, charset){
186 | var items_ids = [];
187 | if(!charset){
188 | charset = $('select[name="item_simplified_charset"]').eq(id).val();
189 | }
190 | items_ids.push({
191 | id:id,
192 | filenameType:0,
193 | simplified:charset.length>0,
194 | charset:charset
195 | });
196 | if(items_ids.length == 0){
197 | my_alert('请选择字幕');
198 | return;
199 | }
200 |
201 | var searchData = {
202 | items : items_ids
203 | };
204 | ajax_jsonp('/api/zimu_down',{
205 | data : json_encode(searchData)
206 | }, function (data){
207 | if(data.result > 0){
208 | my_alert(data.message);
209 | return;
210 | }
211 | my_tip('下载完成');
212 | });
213 | }
214 | //java调用
215 | function page_callback(){
216 | init_data_fileinfo();
217 | search_start_thread();
218 | return true;
219 | }
220 | function search_start_thread(is_click){
221 | window.setTimeout(function(){
222 | search_start(is_click);
223 | }, 100);
224 | }
225 | //开始搜索
226 | function search_start(is_click){
227 | if($('input[name="filename"]').val().length == 0){
228 | if(is_click){
229 | my_alert('请选择视频文件');
230 | }
231 | return;
232 | }
233 |
234 | var searchParm = {};
235 | var form_count = 0;
236 | $('input[name="froms"]').each(function(){
237 | var val = $(this).attr('value');
238 | searchParm['from_'+val] = this.checked;
239 | if(this.checked){
240 | form_count++;
241 | }
242 | });
243 | if(form_count == 0){
244 | my_loading_hide();
245 | if(is_click){
246 | my_alert('请选择至少1个字幕数据源');
247 | }
248 | return;
249 | }
250 |
251 | var items = [];
252 |
253 | var searchData = {
254 | searchParm : searchParm,
255 | items : items
256 | };
257 | var time1 = (new Date()).getTime();
258 | ajax_jsonp('/api/zimu_list',{
259 | data : json_encode(searchData)
260 | }, function (data){
261 | if(data.result > 0){
262 | my_alert(data.message);
263 | return;
264 | }
265 | var data = {
266 | list : data.list
267 | };
268 | var useTime = (((new Date()).getTime() - time1)/1000).toFixed(2);
269 | $('#status_label').html('查询到'+data.list.length+'个字幕数据,共耗时:'+(useTime)+'秒');
270 | $('#rec_list').empty();
271 | laytpl_render('#rec_list_tpl', data, function(html){
272 | $('#rec_list').append(html);
273 | $('#batch_from').newforms();
274 | });
275 | });
276 |
277 | //var dataStr = app.searchList(json_encode(searchData));
278 |
279 |
280 |
281 | }
282 | function init_data(){
283 | my_loading_show();
284 | var data = app.getInitData();
285 | if(data == null){
286 | my_alert('初始化数据失败');
287 | return;
288 | }
289 |
290 |
291 | data = json_decode(data);
292 |
293 | if(data.fileinfo && data.fileinfo.movFilename){
294 | $('input[name="filename"]').val(data.fileinfo.movFilename);
295 | }
296 | if(data.searchParm){
297 | var froms = ["sheshou", "xunlei", "zimuku", "subhd"];
298 | for(var i in froms){
299 | if(data.searchParm['from_'+froms[i]]){
300 | $('input[name="froms"][value="'+froms[i]+'"]')[0].checked = true;
301 | $('input[name="froms"][value="'+froms[i]+'"]').trigger('nf_change');
302 | }
303 | }
304 | }
305 | window.serverPort = data.serverPort;
306 | window.serverUrl = "http://127.0.0.1:"+serverPort;
307 |
308 | my_loading_hide();
309 | }
310 | function init_data_fileinfo(){
311 | my_loading_show();
312 | var data = app.getInitData();
313 | if(data == null){
314 | my_alert('初始化数据失败');
315 | return;
316 | }
317 |
318 |
319 | data = json_decode(data);
320 |
321 | if(data.fileinfo && data.fileinfo.movFilename){
322 | $('input[name="filename"]').val(data.fileinfo.movFilename);
323 | }
324 | my_loading_hide();
325 | }
326 |
327 |
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/ContextMenu/contextMenu.css:
--------------------------------------------------------------------------------
1 | .yuri2-context-menu {
2 | left: 0;
3 | top: 0;
4 | position: fixed;
5 | height: auto;
6 | background-color: rgb(61, 61, 61);
7 | display: block;
8 | /*border-radius: 5px;*/
9 | z-index: 99999999;
10 | color: white;
11 | /*overflow: hidden;*/
12 | }
13 |
14 | .yuri2-context-menu.sub {
15 | left: 98%;
16 | position: absolute;
17 | display: none;
18 | }
19 |
20 | .yuri2-context-menu.sub.left {
21 | left: auto;
22 | right: 98%;
23 | }
24 |
25 | .yuri2-context-menu ul li:hover .yuri2-context-menu.sub {
26 | display: block;
27 | }
28 |
29 | .yuri2-context-menu ul.left .yuri2-context-menu.sub {
30 | left: -100%;
31 | }
32 |
33 | .yuri2-context-menu ul {
34 | margin: 0px;
35 | padding: 0px;
36 | box-shadow: 0 0 16px rgba(0, 0, 0, 0.54);
37 | }
38 |
39 | .yuri2-context-menu ul li {
40 | cursor: default;
41 | padding: 0px 1em;
42 | list-style: none;
43 | line-height: 30px;
44 | height: 30px;
45 | font-size: 12px;
46 | /*overflow: hidden;*/
47 | position: relative;
48 | }
49 |
50 | .yuri2-context-menu ul li div.title {
51 | overflow: hidden;
52 | height: 100%;
53 | float: left;
54 | word-break: break-all;
55 | }
56 |
57 | .yuri2-context-menu ul li div.title.disable {
58 | color: darkgrey;
59 | }
60 |
61 | .yuri2-context-menu ul li.sub:after {
62 | content: ">";
63 | float: right;
64 | transform: scale3d(0.5, 1.5, 1);
65 | position: relative;
66 | }
67 |
68 | .yuri2-context-menu ul li:hover {
69 | background-color: #636363;
70 | }
71 |
72 | .yuri2-context-menu ul li a {
73 | text-decoration: none;
74 | display: block;
75 | height: 100%;
76 | color: #333;
77 | outline: none;
78 | }
79 |
80 | .yuri2-context-menu ul hr {
81 | margin: 0;
82 | height: 0;
83 | border: 0;
84 | border-bottom: rgba(132, 132, 132, 0.47) 1px solid;
85 | border-top: none
86 | }
87 |
88 | /*浅色主题*/
89 | .yuri2-context-menu.light {
90 | background-color: #e0e0e0;
91 | border-color: #535353;
92 | color: #333333;
93 | }
94 |
95 | .yuri2-context-menu.light ul li:hover {
96 | background-color: #707070;
97 | color: #ffffff;
98 | }
99 |
100 | .yuri2-context-menu.light ul hr {
101 | border-color: #535353;
102 | }
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/ContextMenu/contextMenu.js:
--------------------------------------------------------------------------------
1 | /**
2 | * contextMenu v2.2.4
3 | *
4 | * @author Yuri2(yuri2peter@qq.com)
5 | * @link https://github.com/yuri2peter/contextMenu Enjoy! (●'◡'●) 基于jq的右键菜单(动态绑定)
6 | * @author Yuri2
7 | */
8 | window.ContextMenu = {
9 | _className : 'yuri2-context-menu',
10 | _stopProp : function(e) {
11 | if (e.cancelable) {
12 | // 判断默认行为是否已经被禁用
13 | if (!e.defaultPrevented) {
14 | e.preventDefault();
15 | }
16 | }
17 | e.stopImmediatePropagation();
18 | e.stopPropagation();
19 | },
20 | _getMainContent : function(text) {
21 | return text.replace(/<\/?.+?>/g, "");
22 | },
23 | render : function(e, menu, trigger, theme) {
24 | theme || (theme = '');
25 | var x = e.clientX, y = e.clientY;
26 | this._stopProp(e);
27 | this._removeContextMenu();
28 | if (menu === true) {
29 | return;
30 | }
31 | if (typeof menu === 'object' && menu.length === 0) {
32 | menu = [ [ '...' ] ]
33 | }
34 | var dom = $("");
35 | $('body').append(dom);
36 | var ul = dom.find('ul');
37 | if (x + 150 > document.body.clientWidth) {
38 | x -= 150;
39 | ul.addClass('left')
40 | }
41 | menu.forEach(function(item) {
42 | if (item === '|') {
43 | ul.append($('
'));
44 | } else if (typeof (item) === 'string') {
45 | ul.append($('' + item + '
'));
46 | } else if (typeof (item) === 'object') {
47 | var sub = $('' + item[0] + '
');
48 | ul.append(sub);
49 | if (typeof (item[1]) === 'object') {
50 | var subMenu = $("");
51 | var subUl = $("");
52 | sub.addClass('sub');
53 | subMenu.append(subUl);
54 | if (x + 300 > document.body.clientWidth) {
55 | subMenu.addClass('left')
56 | }
57 | sub.append(subMenu);
58 | var counterForTop = -1;
59 | item[1].forEach(function(t) {
60 | if (t === '|') {
61 | subUl.append($('
'));
62 | } else if (typeof (t) === 'string') {
63 | subUl.append($('' + t + '
'));
64 | counterForTop++;
65 | } else if (typeof (t) === 'object') {
66 | var subLi = $('' + t[0]
67 | + '
');
68 | subUl.append(subLi);
69 | if (t[2] !== true) {
70 | subLi.click(trigger, t[1]);
71 | subLi.click(function() {
72 | ContextMenu._removeContextMenu();
73 | });
74 | }
75 | counterForTop++;
76 | }
77 | });
78 | if (y + dom.height() > document.body.clientHeight && document.body.clientHeight > 0) {
79 | subMenu.css('top', '-' + (counterForTop * 30) + 'px')
80 | }
81 | } else if (typeof (item[1]) === 'function' && item[2] !== true) {
82 | sub.click(trigger, item[1]);
83 | sub.click(function() {
84 | ContextMenu._removeContextMenu();
85 | });
86 | }
87 | }
88 | });
89 | // 修正坐标
90 | if (y + dom.height() > document.body.clientHeight && document.body.clientHeight > 0) {
91 | y -= dom.height()
92 | }
93 | dom.css({
94 | top : y,
95 | left : x,
96 | });
97 | },
98 | _removeContextMenu : function() {
99 | $('.' + ContextMenu._className).remove();
100 | },
101 | };
102 |
103 | $(document).click(function(e) {
104 | if ($(e.target).hasClass(ContextMenu._className) || $(e.target).parents('.' + ContextMenu._className).length > 0)
105 | return;
106 | ContextMenu._removeContextMenu();
107 | });
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/newforms/skins/default/checkbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/plugins/newforms/skins/default/checkbox.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/newforms/skins/default/date-trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/plugins/newforms/skins/default/date-trigger.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/newforms/skins/default/radio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/plugins/newforms/skins/default/radio.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/newforms/skins/default/spinner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/plugins/newforms/skins/default/spinner.png
--------------------------------------------------------------------------------
/src/main/resources/html/images/js/plugins/newforms/skins/default/trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/html/images/js/plugins/newforms/skins/default/trigger.png
--------------------------------------------------------------------------------
/src/main/resources/html/mainwin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | SubTitleSearcher
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
63 |
64 |
92 |
93 | 请选择视频文件后查询
94 |
95 |
96 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/src/main/resources/res/icon/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/res/icon/app.ico
--------------------------------------------------------------------------------
/src/main/resources/res/icon/app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/res/icon/app.png
--------------------------------------------------------------------------------
/src/main/resources/res/img/about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/res/img/about.png
--------------------------------------------------------------------------------
/src/main/resources/res/img/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Andyfoo/SubTitleSearcher/a0c1c99d5c38c6878dd2a486228bc13804a431a8/src/main/resources/res/img/loading.gif
--------------------------------------------------------------------------------