Source code: comiccollection/URLWorker.java
1 package comiccollection;
2
3 import java.util.*;
4 import java.net.*;
5 import java.io.*;
6
7 class URLWorker extends Thread{
8 ComicObject comic;
9 GregorianCalendar date;
10 ComicAccesser ca;
11 ComicReceiver cr;
12 int cs=-1;
13 Hashtable setupInfo;
14 String mainExt=null;
15 int offset;
16
17 public URLWorker(String str, ComicObject comic, GregorianCalendar date, ComicAccesser ca, ComicReceiver cr, Hashtable setupInfo, int offset){
18 super(str);
19
20 this.comic=comic;
21 this.date=date;
22 this.ca=ca;
23 this.cr=cr;
24 this.setupInfo=setupInfo;
25 this.offset=offset;
26 }
27
28 public void run(){
29 System.out.println(comic.access_string);
30 // StringTokenizer extTok=new StringTokenizer(comic.ext_list, ",");
31 BufferedInputStream istream=null;
32 boolean found=false;
33 boolean multi=false;
34
35 if((comic.order.equals("s"))||(comic.order.equals("sm"))){
36 istream=startStrip(getUrl(comic.access_string, (char)0), true);
37 if((istream==null)&&(comic.order.equals("sm"))){
38 istream=startStrip(getUrl(comic.multi_access_string, 'a'), true);
39 if(istream!=null){
40 multi=true;
41 }
42 }
43 }
44 if((comic.order.equals("m"))||(comic.order.equals("ms"))){
45 istream=startStrip(getUrl(comic.multi_access_string, 'a'), true);
46 if(istream!=null){
47 multi=true;
48 }
49 if((istream==null)&&(comic.order.equals("ms"))){
50 istream=startStrip(getUrl(comic.access_string, (char)0), true);
51 }
52 }
53 if(comic.order.equals("e")) {
54 String pageUrl=getUrl(comic.access_string, (char)0);
55 String imgUrl;
56 try{
57 imgUrl=getImgUrl(pageUrl);
58 }catch(Exception ex){
59 System.out.println(ex);
60 return;
61 }
62 if(imgUrl!=null){
63 istream=startStrip(imgUrl, false);
64 mainExt=comic.ext_list;
65 }
66 }
67
68 System.out.println(istream+":"+mainExt);
69
70 if(istream!=null){
71 found=true;
72 }
73
74 if(found){
75 ComicStrip strip=new ComicStrip();
76 strip.date=date;
77 try{
78 getImage(strip, mainExt, istream);
79 if(multi){
80 char count='a';
81 count+=Integer.parseInt(comic.inc);
82 while((istream=startStrip(getUrl(comic.multi_access_string, count), true))!=null){
83 getImage(strip, mainExt, istream);
84 count+=Integer.parseInt(comic.inc);
85 }
86 }
87 cr.comicShow(offset, true);
88 }catch(Exception ex){
89 System.out.println(ex);
90 }
91 }else{
92 cr.comicShow(offset, false);
93 }
94 }
95
96 void getImage(ComicStrip strip, String ext, BufferedInputStream istream) throws Exception{
97 byte []buffer=new byte[1024];
98 ComicImage image=new ComicImage();
99 image.type=ext.toLowerCase();
100 if(cs==-1){
101 cs=ca.createStrip(strip, comic);
102 }
103 int id=ca.createImage(image, cs);
104 ByteArrayOutputStream out=new ByteArrayOutputStream();
105 //FileOutputStream(setupInfo.get("imagePath")+"/"+id+"."+ext.toLowerCase());
106 while(true){
107 int nBytes=istream.read(buffer);
108 if(nBytes<0){ break;}
109 out.write(buffer, 0, nBytes);
110 System.out.println("Added");
111 }
112 FileOutputStream ostream=new FileOutputStream(setupInfo.get("imagePath")+"/"+id+"."+ext.toLowerCase());
113 ostream.write(out.toByteArray());
114
115 istream.close();
116 ostream.close();
117 }
118
119 BufferedInputStream startStrip(String url, boolean addExt){
120 String ext;
121 BufferedInputStream istream=null;
122 boolean found=false;
123
124 if(addExt){
125 StringTokenizer extTok=new StringTokenizer(comic.ext_list, ",");
126
127 while(extTok.hasMoreTokens()){
128 System.out.println("Stoat!");
129 ext=extTok.nextToken();
130 System.out.println(url.toString()+"."+ext);
131
132 try{
133 URL image=new URL(url.toString()+"."+ext);
134 URLConnection urlc=image.openConnection();
135 urlc.setRequestProperty("Referer", url.toString()+"."+ext);
136 urlc.setRequestProperty("User-Agent", "Comic Collection 1 (http://comiccollection.sourceforge.net)");
137
138 istream=new BufferedInputStream(urlc.getInputStream());
139 // istream=new BufferedInputStream(image.openStream());
140 found=true;
141 }catch(FileNotFoundException ex){
142 found=false;
143 }catch(Exception ex){
144 System.out.println(ex);
145 }
146 System.out.println("File found: "+String.valueOf(found));
147 if(found){
148 mainExt=ext;
149 break;
150 }
151 }
152 }else{
153 try{
154 URL image=new URL(url.toString());
155 System.out.println("Using url: "+url);
156 istream=new BufferedInputStream(image.openStream());
157 found=true;
158 }catch(FileNotFoundException ex){
159 found=false;
160 }catch(Exception ex){
161 System.out.println(ex);
162 }
163 System.out.println("File found: "+String.valueOf(found));
164 }
165 if(found){
166 return istream;
167 }else{
168 return null;
169 }
170 }
171
172 StringBuffer doReplace(StringBuffer input, String needle, String subst){
173 StringBuffer working=input;
174 int pos=0;
175
176 while(true){
177 pos=working.toString().indexOf(needle, pos);
178
179 if(pos==-1){
180 break;
181 }
182
183 working.replace(pos, pos+needle.length(), subst);
184 }
185
186 return working;
187 }
188
189
190 //BufferedInputStream
191
192 String getUrl(String urlIn, char frame){
193 int posY=0, posM=0, posD=0, posF=0;
194 StringBuffer url;
195 String dayStr, monthStr, yearStr, shortYearStr, ext="";
196
197 url=new StringBuffer(urlIn);
198 System.out.println("Url: "+url);
199
200 yearStr=String.valueOf(date.get(Calendar.YEAR));
201 monthStr=String.valueOf(date.get(Calendar.MONTH)+1);
202 dayStr=String.valueOf(date.get(Calendar.DAY_OF_MONTH));
203 shortYearStr=String.valueOf(date.get(Calendar.YEAR)%100);
204
205
206 if((date.get(Calendar.YEAR)%100)<10){
207 shortYearStr="0"+shortYearStr;
208 }
209 if((date.get(Calendar.MONTH)+1)<10){
210 monthStr="0"+monthStr;
211 }
212 if(date.get(Calendar.DAY_OF_MONTH)<10){
213 dayStr="0"+dayStr;
214 }
215
216 url=doReplace(url, "YYYY", yearStr);
217 url=doReplace(url, "MM", monthStr);
218 url=doReplace(url, "DD", dayStr);
219 url=doReplace(url, "AA", new Character(frame).toString());
220 url=doReplace(url, "yy", shortYearStr);
221
222 /*while(true){
223 posY=urlIn.indexOf("YYYY", posY);
224 posM=urlIn.indexOf("MM", posM);
225 posD=urlIn.indexOf("DD", posD);
226
227 if((posY==-1)||(posM==-1)||(posD==-1)){
228 break;
229 }
230
231
232 url.replace(posY, posY+4, yearStr);
233 url.replace(posM, posM+2, monthStr);
234 url.replace(posD, posD+2, dayStr);
235 posY=posY+4;
236 posM=posM+2;
237 posD=posD+2;
238
239 if(frame!=0){
240 posF=urlIn.indexOf("AA", posF);
241 url.replace(posF, posF+2, new Character(frame).toString());
242 }
243
244 System.out.println("URL: "+url);
245 }*/
246
247 System.out.println("Url: "+url.toString());
248
249 return url.toString();
250 }
251
252 String getImgUrl(String pageUrl) throws Exception{
253 String url=null;
254 char[] buffer=new char[1024];
255 StringBuffer pageCont=new StringBuffer();
256 Reader istream;
257
258 URL page=new URL(pageUrl.toString());
259 try{
260 istream=new InputStreamReader(page.openStream());
261 while(true){
262 int nBytes=istream.read(buffer, 0, 1024);
263 if(nBytes<0){
264 break;
265 }
266 pageCont.append(buffer);
267 }
268 istream.close();
269 }catch(FileNotFoundException ex){
270 System.out.println(ex);
271 return null;
272 }
273
274 StringTokenizer ruleTok=new StringTokenizer(comic.extract_rules, "|");
275 ArrayList rules=new ArrayList();
276 while(ruleTok.hasMoreTokens()){
277 rules.add(ruleTok.nextToken());
278 }
279
280 StringTokenizer pageTok=new StringTokenizer(pageCont.toString(), "\"");
281 boolean inQuotes=false;
282 while(pageTok.hasMoreElements()){
283 if(inQuotes){
284 String str=pageTok.nextToken();
285 if(matchExtraction(str, rules)){
286 System.out.println("Str:"+str);
287 url=str;
288 break;
289 }
290 inQuotes=false;
291 }else{
292 String str=pageTok.nextToken();
293 if(matchExtraction(str, rules)){
294 System.out.println("Str:"+str);
295 url=str;
296 break;
297 }
298 inQuotes=true;
299 }
300 }
301 //United Media, at least, uses relative image names
302 if((url!=null)&&(url.indexOf("http:")==-1)){
303 //Assume relative to host
304 url=page.getProtocol()+"://"+page.getHost()+url;
305 System.out.println("Corrected URL: "+url);
306 }
307 //System.out.println(pageCont.toString());
308 return url;
309 }
310
311 boolean matchExtraction(String str, ArrayList rules){
312 boolean matches=true;
313 for(int i=0; i<rules.size(); i++){
314 if(str.indexOf((String)rules.get(i))==-1){
315 matches=false;
316 }
317 }
318 if(matches){
319 System.out.println("Len: "+str.length()+" extPos: "+str.indexOf(comic.ext_list)+" dif: "+String.valueOf(str.length()-str.indexOf(comic.ext_list)));
320 if((str.length()-str.indexOf(comic.ext_list))!=comic.ext_list.length()){
321 matches=false;
322 }
323 }
324 return matches;
325 }
326 }