• R/O
  • SSH
  • HTTPS

pxv: Commit


Commit MetaInfo

Revision4 (tree)
Time2010-08-31 03:01:21
Authorjkawamoto

Log Message

(empty log message)

Change Summary

Incremental Difference

--- trunk/src/overview.html (revision 3)
+++ trunk/src/overview.html (revision 4)
@@ -18,20 +18,40 @@
1818 <blockquote><pre>
1919 final PixivAPI api = new PixivAPI();
2020
21-// システムの稼働状態を調べます.
21+// システムの稼働状態を調べる.
2222 System.out.println("Status: " + api.status());
2323
24-// 最新 10件を取得しタイトル,作者,画像 URL を表示します.
25-System.out.println("= 10 new images =");
26-for(final Image i : api.getNewImages(10)){
24+// 最新投稿イラスト(1 ページ目)を列挙する.
25+for(final Image i : api.getNewImages(0)){
2726
27+ // イラストのタイトル,作者,URL を表示.
2828 System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
2929
30+ // イラストの作者を取得.
31+ final User author = i.getAuthor();
32+ if(author != null){
33+
34+ // ユーザのお気に入りユーザ(1 ページ目) を列挙.
35+ for(final User u : author.getBookmarkedUsers(0)){
36+
37+ System.out.println(">> " + u);
38+
39+ }
40+
41+ }
42+
3043 }
3144
32-// ログインしユーザ別の情報を取得します.
33-if(api.login("user_id", "password")){
45+// タグを検索(トップ 10 件).
46+for(final Image i : api.findImagesByTag("tag keyword", 10)){
3447
48+ System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
49+
50+}
51+
52+// ログインしユーザ別の情報を取得.
53+if(api.login(args[0], args[1])){
54+
3555 System.out.println("Profile: " + api.profile());
3656 System.out.println("My pixiv new images: " + api.getMyPixivNewImageSize());
3757
--- trunk/src/pxv/User.java (revision 3)
+++ trunk/src/pxv/User.java (revision 4)
@@ -21,6 +21,11 @@
2121 import java.net.URL;
2222 import java.util.List;
2323
24+/**
25+ * Pixiv におけるユーザデータをラップするクラス.
26+ *
27+ * @since 0.1
28+ */
2429 public class User {
2530
2631 /** 親オブジェクト */
@@ -104,13 +109,13 @@
104109 }
105110
106111 /**
107- * このユーザの投稿画像を指定した数だけ取得する.
112+ * このユーザの投稿画像を取得する.
108113 *
109- * @param size 取得する画像数
114+ * @param page 取得する画像のページ
110115 * @return 取得した画像のリスト
111116 */
112- public List<Image> getImages(final int size){
113- return this.api.getImages(this, size);
117+ public List<Image> getImages(final int page){
118+ return this.api.getImages(this, page);
114119 }
115120
116121 /**
@@ -122,24 +127,52 @@
122127 return this.api.getMyPixivSize(this);
123128 }
124129
125- public List<User> getMyPixivUsers(final int size){
126- return this.api.getMyPixivUsers(this, size);
130+ /**
131+ * MyPixiv ユーザを取得する.
132+ *
133+ * @param page 取得するページ
134+ * @return 取得したユーザのリスト
135+ */
136+ public List<User> getMyPixivUsers(final int page){
137+ return this.api.getMyPixivUsers(this, page);
127138 }
128139
140+ /**
141+ * お気に入りユーザ数を取得する.
142+ *
143+ * @return このユーザのお気に入りユーザ数
144+ */
129145 public int getBookmarkedUserSize(){
130146 return this.api.getBookmarkedUserSize(this);
131147 }
132148
133- public List<User> getBookmarkedUsers(final int size){
134- return this.api.getBookmarkedUsers(this, size);
149+ /**
150+ * お気に入りユーザを取得する.
151+ *
152+ * @param page 取得するページ
153+ * @return 取得したユーザのリスト
154+ */
155+ public List<User> getBookmarkedUsers(final int page){
156+ return this.api.getBookmarkedUsers(this, page);
135157 }
136158
159+ /**
160+ * ブックマークイラストの数を取得する.
161+ *
162+ * @return ブックマークしたイラストの数
163+ */
137164 public int getBookmarkSize(){
138165 return this.api.getBookmarkSize(this);
139166 }
140167
141- public List<Image> getBookmarks(final int size){
142- return this.api.getBookmarks(this, size);
168+ /**
169+ * ブックマークイラストを取得する.
170+ *
171+ * @param page 取得するページ数
172+ * @return 取得したイラストのリスト
173+ */
174+ public List<Image> getBookmarks(final int page){
175+ return this.api.getBookmarks(this, page);
143176 }
144177
145178 //----------------------------------------------------------------------------
@@ -166,4 +199,28 @@
166199
167200 }
168201
202+ /* (非 Javadoc)
203+ * @see java.lang.Object#hashCode()
204+ */
205+ @Override
206+ public int hashCode() {
207+ return Integer.valueOf(this.getId()).hashCode();
208+ }
209+
210+ /* (非 Javadoc)
211+ * @see java.lang.Object#equals(java.lang.Object)
212+ */
213+ @Override
214+ public boolean equals(final Object obj) {
215+
216+ if(obj instanceof User){
217+
218+ final User that = (User)obj;
219+ return this.getId() == that.getId();
220+
221+ }
222+
223+ return super.equals(obj);
224+ }
225+
169226 }
--- trunk/src/pxv/Image.java (revision 3)
+++ trunk/src/pxv/Image.java (revision 4)
@@ -20,6 +20,15 @@
2020 import java.io.IOException;
2121 import java.net.URL;
2222
23+/**
24+ * Pixiv における画像データをラップするクラス.
25+ * <p>
26+ * このオブジェクトが画像そのものを表すわけではありません.
27+ * 実際の画像 URL は,getImageURL から取得できます.
28+ * </p>
29+ *
30+ * @since 0.1
31+ */
2332 public class Image {
2433
2534 /** 親オブジェクト */
@@ -87,80 +96,175 @@
8796
8897 }
8998
99+ /**
100+ * イラスト ID を取得する.
101+ *
102+ * @return イラスト ID
103+ */
90104 public int getId(){
91105 return this.id;
92106 }
93107
108+ /**
109+ * 作者の ID を取得する.
110+ *
111+ * @return このイラストの作者 ID
112+ */
94113 public int getAuthorId() {
95114 return authorId;
96115 }
97116
117+ /**
118+ * イラストの拡張子を取得する.
119+ *
120+ * @return このイラストの拡張子
121+ */
98122 public String getExt() {
99123 return ext;
100124 }
101125
126+ /**
127+ * タイトルを取得する.
128+ *
129+ * @return このイラストのタイトル
130+ */
102131 public String getTitle() {
103132 return title;
104133 }
105134
135+ /**
136+ * サーバ名を取得する.
137+ *
138+ * @return このイラストが保管されているサーバ名
139+ */
106140 public String getServer() {
107141 return server;
108142 }
109143
144+ /**
145+ * 作者名を取得する.
146+ *
147+ * @return このイラストの作者
148+ */
110149 public String getAuthorName() {
111150 return authorName;
112151 }
113152
153+ /**
154+ * サムネイル画像の URL を取得する.
155+ *
156+ * @return サムネイル画像の URL
157+ */
114158 public URL getThumbURL() {
115159 return thumbURL;
116160 }
117161
162+ /**
163+ * モバイル用画像の URL を取得する.
164+ *
165+ * @return モバイル用画像の URL
166+ */
118167 public URL getMobileURL() {
119168 return mobileURL;
120169 }
121170
171+ /**
172+ * 投稿日を取得する.
173+ *
174+ * @return このイラストの投稿日
175+ */
122176 public String getDate() {
123177 return date;
124178 }
125179
180+ /**
181+ * このイラストに付加されたタグを取得する.
182+ *
183+ * @return このイラストに付けられたタグ
184+ */
126185 public String getTags() {
127186 return tags;
128187 }
129188
189+ /**
190+ * 制作ツール名を取得する.
191+ *
192+ * @return 制作ツール名
193+ */
130194 public String getTool() {
131195 return tool;
132196 }
133197
198+ /**
199+ * 評価点を取得する.
200+ *
201+ * @return 評価点
202+ */
134203 public int getFeedback() {
135204 return feedback;
136205 }
137206
207+ /**
208+ * 総合点を取得する
209+ *
210+ * @return 総合点
211+ */
138212 public int getPoint() {
139213 return point;
140214 }
141215
216+ /**
217+ * 閲覧数を取得する.
218+ *
219+ * @return 閲覧数
220+ */
142221 public int getViews() {
143222 return views;
144223 }
145224
225+ /**
226+ * 作者コメントを取得する.
227+ *
228+ * @return 作者コメント
229+ */
146230 public String getComment() {
147231 return comment;
148232 }
149233
234+ /**
235+ * 画像ページの URL を取得する.
236+ *
237+ * @return 画像ページの URL
238+ */
150239 public URL getUrl() {
151240 return url;
152241 }
153242
243+ /**
244+ * 画像の URL を取得する.
245+ *
246+ * @return 画像の URL
247+ */
154248 public URL getImageURL() {
155249 return imageURL;
156250 }
157251
158252 //----------------------------------------------------------------------------
253+
254+ /**
255+ * このイラストの作者を取得する.
256+ *
257+ * @return このイラストの作者を表す User オブジェクト
258+ */
159259 public User getAuthor(){
160260 return this.api.findUser(this.getAuthorId(), this.getAuthorName());
161261 }
162262
163263 //----------------------------------------------------------------------------
264+
265+ /* (非 Javadoc)
266+ * @see java.lang.Object#toString()
267+ */
164268 @Override
165269 public String toString(){
166270
@@ -180,5 +284,31 @@
180284
181285 }
182286
287+ /* (非 Javadoc)
288+ * @see java.lang.Object#hashCode()
289+ */
290+ @Override
291+ public int hashCode() {
183292
293+ return Integer.valueOf(this.id).hashCode();
294+
295+ }
296+
297+ /* (非 Javadoc)
298+ * @see java.lang.Object#equals(java.lang.Object)
299+ */
300+ @Override
301+ public boolean equals(final Object obj) {
302+
303+ if(obj instanceof Image){
304+
305+ final Image that = (Image)obj;
306+ return this.getId() == that.getId();
307+
308+ }
309+
310+ return super.equals(obj);
311+ }
312+
313+
184314 }
--- trunk/src/pxv/PixivAPI.java (revision 3)
+++ trunk/src/pxv/PixivAPI.java (revision 4)
@@ -33,11 +33,16 @@
3333
3434 import pxv.CSVParser.Handler;
3535
36+/**
37+ * Pixiv API.
38+ *
39+ * @since 0.1
40+ */
3641 public class PixivAPI {
3742
3843 private final URL base;
3944
40- private String session = null;
45+ private String session = Zero;
4146
4247 //============================================================================
4348 // Constants
@@ -45,12 +50,9 @@
4550 private static final String BaseURL = "http://iphone.pxv.jp/iphone/";
4651 private static final String SessionID = "PHPSESSID";
4752
48- private static final String NewImages = "new_illust";
49- private static final String MyPixivNewImages = "mypixiv_new_illust";
50- private static final String BookmarkedUserNewImages = "bookmark_user_new_illust";
51- private static final String Ranking = "ranking";
52- private static final String Search = "search";
53- private static final String SearchUser = "search_user";
53+ private enum Type{
54+ new_illust, mypixiv_new_illust, bookmark_user_new_illust, ranking, search, search_user, bookmark, bookmark_user_all, mypixiv_all, member_illust
55+ }
5456
5557 private static final String DummyParameter = "dummy=0";
5658 private static final String Daily = "mode=day";
@@ -60,6 +62,7 @@
6062 private static final String IDParamTemplate = "id=%d";
6163
6264 private static final String UTF8 = "UTF-8";
65+ private static final String Zero = "0";
6366
6467 //============================================================================
6568 // Constructors
@@ -122,10 +125,15 @@
122125 */
123126 public boolean logined(){
124127
125- return this.session != null;
128+ return this.session != Zero;
126129
127130 }
128131
132+ /**
133+ * システムの稼働状態を調べる.
134+ *
135+ * @return システムが稼働している場合 true
136+ */
129137 public boolean status(){
130138
131139 try {
@@ -146,6 +154,11 @@
146154
147155 }
148156
157+ /**
158+ * ログインユーザのプロフィールを取得する.
159+ *
160+ * @return プロフィール
161+ */
149162 public String profile(){
150163
151164 final StringBuffer ret = new StringBuffer();
@@ -182,51 +195,51 @@
182195 // APIs for new images
183196 //----------------------------------------------------------------------------
184197 public int getNewImageSize(){
185- return this.getSize(NewImages, DummyParameter);
198+ return this.getSize(Type.new_illust, DummyParameter);
186199 }
187200
188- public List<Image> getNewImages(final int size){
189- return this.getImages(NewImages, DummyParameter, size);
201+ public List<Image> getNewImages(final int page){
202+ return this.getImages(Type.new_illust, DummyParameter, page);
190203 }
191204
192205 public int getMyPixivNewImageSize(){
193- return this.getSize(MyPixivNewImages, DummyParameter);
206+ return this.getSize(Type.mypixiv_new_illust, DummyParameter);
194207 }
195208
196- public List<Image> getMyPixivNewImages(final int size){
197- return this.getImages(MyPixivNewImages, DummyParameter, size);
209+ public List<Image> getMyPixivNewImages(final int page){
210+ return this.getImages(Type.mypixiv_new_illust, DummyParameter, page);
198211 }
199212
200213 public int getBookmarkedUserNewImageSize(){
201- return this.getSize(BookmarkedUserNewImages, DummyParameter);
214+ return this.getSize(Type.bookmark_user_new_illust, DummyParameter);
202215 }
203216
204- public List<Image> getBookmarkedUserNewImages(final int size){
205- return this.getImages(BookmarkedUserNewImages, DummyParameter, size);
217+ public List<Image> getBookmarkedUserNewImages(final int page){
218+ return this.getImages(Type.bookmark_user_new_illust, DummyParameter, page);
206219 }
207220
208221 public int getDailyRankingImageSize(){
209- return this.getSize(Ranking, Daily);
222+ return this.getSize(Type.ranking, Daily);
210223 }
211224
212- public List<Image> getDailyRankingImages(final int size){
213- return this.getImages(Ranking, Daily, size);
225+ public List<Image> getDailyRankingImages(final int page){
226+ return this.getImages(Type.ranking, Daily, page);
214227 }
215228
216229 public int getWeeklyRankingImageSize(){
217- return this.getSize(Ranking, Weekly);
230+ return this.getSize(Type.ranking, Weekly);
218231 }
219232
220- public List<Image> getWeeklyRankingImages(final int size){
221- return this.getImages(Ranking, Weekly, size);
233+ public List<Image> getWeeklyRankingImages(final int page){
234+ return this.getImages(Type.ranking, Weekly, page);
222235 }
223236
224237 public int getMonthlyRankingImageSize(){
225- return this.getSize(Ranking, Monthly);
238+ return this.getSize(Type.ranking, Monthly);
226239 }
227240
228- public List<Image> getMonthlyRankingImages(final int size){
229- return this.getImages(Ranking, Monthly, size);
241+ public List<Image> getMonthlyRankingImages(final int page){
242+ return this.getImages(Type.ranking, Monthly, page);
230243 }
231244
232245
@@ -234,15 +247,37 @@
234247 // APIs for search
235248 //----------------------------------------------------------------------------
236249 public List<Image> findImagesByTag(final String keyword, final int size) throws IOException{
237- return this.getImages(Search, String.format("s_mode=s_tag&word=%s", URLEncoder.encode(keyword , UTF8)), size);
250+
251+ final String param = String.format("s_mode=s_tag&word=%s", URLEncoder.encode(keyword , UTF8));
252+ return this.findImages(param, size);
238253 }
239254
240255 public List<Image> findImagesByTitle(final String keyword, final int size) throws IOException{
241- return this.getImages(Search, String.format("s_mode=s_tc&word=%s", URLEncoder.encode(keyword , UTF8)), size);
256+
257+ final String param = String.format("s_mode=s_tc&word=%s", URLEncoder.encode(keyword , UTF8));
258+ return this.findImages(param, size);
259+
242260 }
243261
244262 public List<User> findUsers(final String name, final int size) throws IOException{
245- return this.getUsers(SearchUser, String.format("nick=%s", URLEncoder.encode(name , UTF8)), size);
263+
264+ final List<User> ret = new ArrayList<User>();
265+ final String param = String.format("nick=%s", URLEncoder.encode(name , UTF8));
266+ for(int i = 0; true; ++i){
267+
268+ final List<User> sub = this.getUsers(Type.search, param, i);
269+ if(sub.size() == 0){
270+
271+ break;
272+
273+ }
274+
275+ ret.addAll(sub);
276+
277+ }
278+
279+ return ret;
280+
246281 }
247282
248283 public User findUser(final int id, final String name){
@@ -252,7 +287,7 @@
252287
253288 for(int i = 0; ret.size() == 0 && i < 100; ++i){
254289
255- final URL url = new URL(this.base, String.format("%s.php?nick=%s&%s=%s&p=%d", SearchUser, URLEncoder.encode(name, UTF8), SessionID, this.session, i));
290+ final URL url = new URL(this.base, String.format("%s.php?nick=%s&%s=%s&p=%d", Type.search_user, URLEncoder.encode(name, UTF8), SessionID, this.session, i));
256291 final HttpURLConnection con = (HttpURLConnection) url.openConnection();
257292 con.connect();
258293
@@ -316,7 +351,7 @@
316351 // APIs for user
317352 //----------------------------------------------------------------------------
318353 public int getImageSize(final int userId){
319- return this.getSizeById("member_illust", userId);
354+ return this.getSizeById(Type.member_illust, userId);
320355 }
321356
322357 public int getImageSize(final User user){
@@ -323,16 +358,16 @@
323358 return this.getImageSize(user.getId());
324359 }
325360
326- public List<Image> getImages(final int userId, final int size){
327- return this.getImagesById("member_illust", userId, size);
361+ public List<Image> getImages(final int userId, final int page){
362+ return this.getImagesByUserId(Type.member_illust, userId, page);
328363 }
329364
330- public List<Image> getImages(final User user, final int size){
331- return this.getImages(user.getId(), size);
365+ public List<Image> getImages(final User user, final int page){
366+ return this.getImages(user.getId(), page);
332367 }
333368
334369 public int getMyPixivSize(final int usrId){
335- return this.getSizeById("mypixiv_all", usrId);
370+ return this.getSizeById(Type.mypixiv_all, usrId);
336371 }
337372
338373 public int getMyPixivSize(final User user){
@@ -339,16 +374,16 @@
339374 return this.getMyPixivSize(user.getId());
340375 }
341376
342- public List<User> getMyPixivUsers(final int usrId, final int size){
343- return this.getUsersById("mypixiv_all", usrId, size);
377+ public List<User> getMyPixivUsers(final int usrId, final int page){
378+ return this.getUsersById(Type.mypixiv_all, usrId, page);
344379 }
345380
346- public List<User> getMyPixivUsers(final User user, final int size){
347- return this.getMyPixivUsers(user.getId(), size);
381+ public List<User> getMyPixivUsers(final User user, final int page){
382+ return this.getMyPixivUsers(user.getId(), page);
348383 }
349384
350385 public int getBookmarkedUserSize(final int id){
351- return this.getSizeById("bookmark_user_all", id);
386+ return this.getSizeById(Type.bookmark_user_all, id);
352387 }
353388
354389 public int getBookmarkedUserSize(final User user){
@@ -355,16 +390,16 @@
355390 return this.getBookmarkedUserSize(user.getId());
356391 }
357392
358- public List<User> getBookmarkedUsers(final int id, final int size){
359- return this.getUsersById("bookmark_user_all", id, size);
393+ public List<User> getBookmarkedUsers(final int id, final int page){
394+ return this.getUsersById(Type.bookmark_user_all, id, page);
360395 }
361396
362- public List<User> getBookmarkedUsers(final User user, final int size){
363- return this.getBookmarkedUsers(user.getId(), size);
397+ public List<User> getBookmarkedUsers(final User user, final int page){
398+ return this.getBookmarkedUsers(user.getId(), page);
364399 }
365400
366401 public int getBookmarkSize(final int id){
367- return this.getSizeById("bookmark", id);
402+ return this.getSizeById(Type.bookmark, id);
368403 }
369404
370405 public int getBookmarkSize(final User user){
@@ -371,12 +406,12 @@
371406 return this.getBookmarkSize(user.getId());
372407 }
373408
374- public List<Image> getBookmarks(final int id, final int size){
375- return this.getImagesById("bookmark", id, size);
409+ public List<Image> getBookmarks(final int id, final int page){
410+ return this.getImagesByUserId(Type.bookmark, id, page);
376411 }
377412
378- public List<Image> getBookmarks(final User user, final int size){
379- return this.getBookmarks(user.getId(), size);
413+ public List<Image> getBookmarks(final User user, final int page){
414+ return this.getBookmarks(user.getId(), page);
380415 }
381416
382417
@@ -402,7 +437,14 @@
402437
403438 }
404439
405- private int getSize(final String type, final String param){
440+ /**
441+ * ユーザまたは画像の総数を取得する.
442+ *
443+ * @param type 取得する総数の種類
444+ * @param param 問合せ用パラメータ
445+ * @return 取得したユーザまたは画像の総数
446+ */
447+ private int getSize(final Type type, final String param){
406448
407449 int ret = -1;
408450 try{
@@ -435,57 +477,62 @@
435477
436478 }
437479
438- private int getSizeById(final String type, final int id){
480+ /**
481+ * ID を指定してユーザまたは画像の総数を取得する.
482+ *
483+ * @param type 取得する総数の種類
484+ * @param id 問合せに使用する ID
485+ * @return 取得したユーザまたは画像の総数
486+ */
487+ private int getSizeById(final Type type, final int id){
439488 return this.getSize(type, String.format(IDParamTemplate, id));
440489 }
441490
442- private List<Image> getImages(final String type, final String param, final int size){
491+ /**
492+ * 画像に関する情報を取得する.
493+ *
494+ * @param type 取得する画像の種類
495+ * @param param 問合せ用パラメータ
496+ * @param page 取得するページ
497+ * @return 取得した画像のリスト
498+ */
499+ private List<Image> getImages(final Type type, final String param, final int page){
443500
444501 final List<Image> ret = new ArrayList<Image>();
445502 try{
446503
447- for(int i = 0; ret.size() < size; ++i){
504+ final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, page));
505+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
506+ con.connect();
448507
449- final int current = ret.size();
450- final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, i));
451- final HttpURLConnection con = (HttpURLConnection) url.openConnection();
452- con.connect();
508+ if(con.getResponseCode() == 200){
453509
454- if(con.getResponseCode() == 200){
510+ final Reader in = new InputStreamReader(con.getInputStream());
511+ CSVParser.parse(in, new Handler(){
455512
456- final Reader in = new InputStreamReader(con.getInputStream());
457- CSVParser.parse(in, new Handler(){
513+ @Override
514+ public void update(final String[] data) {
458515
459- @Override
460- public void update(final String[] data) {
516+ try {
461517
462- if(ret.size() < size){
518+ final Image image = new Image(PixivAPI.this, data);
519+ if(!ret.contains(image)){
463520
464- try {
521+ ret.add(image);
465522
466- ret.add(new Image(PixivAPI.this, data));
523+ }
467524
468- } catch (IOException e) {
469- // TODO 自動生成された catch ブロック
470- e.printStackTrace();
525+ } catch (IOException e) {
471526
472- }
527+ e.printStackTrace();
473528
474- }
475-
476529 }
477530
478- });
479- in.close();
531+ }
480532
481- }
533+ });
534+ in.close();
482535
483- if(current == ret.size()){
484-
485- break;
486-
487- }
488-
489536 }
490537
491538 }catch(final IOException e){
@@ -498,61 +545,67 @@
498545
499546 }
500547
501- private List<Image> getImagesById(final String type, final int id, final int size){
502- return this.getImages(type, String.format(IDParamTemplate, id), size);
548+ private List<Image> getImagesByUserId(final Type type, final int id, final int page){
549+ return this.getImages(type, String.format(IDParamTemplate, id), page);
503550 }
504551
505- private List<User> getUsers(final String type, final String param, final int size){
552+ private List<Image> findImages(final String param, final int size) throws IOException{
506553
507- final List<User> ret = new ArrayList<User>();
508- try{
554+ final List<Image> ret = new ArrayList<Image>();
555+ for(int i = 0; ret.size() < size; ++i){
509556
510- for(int i = 0; ret.size() < size; ++i){
557+ final List<Image> sub = this.getImages(Type.search, param, i);
558+ if(sub.size() == 0){
511559
512- final int current = ret.size();
560+ break;
513561
514- final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, i));
515- final HttpURLConnection con = (HttpURLConnection) url.openConnection();
516- con.connect();
562+ }
517563
518- if(con.getResponseCode() == 200){
564+ ret.addAll(sub);
519565
520- final Reader in = new InputStreamReader(con.getInputStream());
521- CSVParser.parse(in, new Handler(){
566+ }
522567
523- @Override
524- public void update(final String[] data) {
525568
526- if(ret.size() < size){
569+ return ret;
527570
528- try {
571+ }
529572
530- ret.add(new User(PixivAPI.this, data));
573+ private List<User> getUsers(final Type type, final String param, final int page){
531574
532- } catch (IOException e) {
575+ final List<User> ret = new ArrayList<User>();
576+ try{
533577
534- // TODO 自動生成された catch ブロック
535- e.printStackTrace();
578+ final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, page));
579+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
580+ con.connect();
536581
537- }
582+ if(con.getResponseCode() == 200){
538583
539- }
584+ final Reader in = new InputStreamReader(con.getInputStream());
585+ CSVParser.parse(in, new Handler(){
540586
541- }
587+ @Override
588+ public void update(final String[] data) {
542589
543- });
544- in.close();
590+ try {
545591
546- }
592+ ret.add(new User(PixivAPI.this, data));
547593
548- if(current == ret.size()){
594+ } catch (IOException e) {
549595
550- break;
596+ // TODO 自動生成された catch ブロック
597+ e.printStackTrace();
551598
552- }
599+ }
553600
601+ }
602+
603+ });
604+ in.close();
605+
554606 }
555607
608+
556609 }catch(final IOException e){
557610
558611 e.printStackTrace();
@@ -563,25 +616,49 @@
563616
564617 }
565618
566- private List<User> getUsersById(final String type, final int id, final int size){
567- return this.getUsers(type, String.format(IDParamTemplate, id), size);
619+ private List<User> getUsersById(final Type type, final int id, final int page){
620+ return this.getUsers(type, String.format(IDParamTemplate, id), page);
568621 }
569622
570623 //============================================================================
571624 // Public static methods
572625 //============================================================================
626+ /**
627+ * サンプルプログラム.
628+ *
629+ * @param args ユーザ名,パスワード,タグ検索用キーワード
630+ * @throws IOException IOエラーが発生した場合.
631+ */
573632 public static void main(final String[] args) throws IOException{
574633
575634 final PixivAPI api = new PixivAPI();
576635 System.out.println("Status: " + api.status());
577636
578- System.out.println("= 10 new images");
579- for(final Image i : api.getNewImages(10)){
637+ System.out.println("= new images on the 1st page");
638+ for(final Image i : api.getNewImages(0)){
580639
581640 System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
582641
642+ final User author = i.getAuthor();
643+ if(author != null){
644+
645+ for(final User user : author.getBookmarkedUsers(0)){
646+
647+ System.out.println(">> " + user);
648+
649+ }
650+
651+ }
652+
583653 }
584654
655+ System.out.println("= find images by tag");
656+ for(final Image i : api.findImagesByTag(args[2], 10)){
657+
658+ System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
659+
660+ }
661+
585662 // Login
586663 if(api.login(args[0], args[1])){
587664
Show on old repository browser