• R/O
  • SSH
  • HTTPS

pxv: Commit


Commit MetaInfo

Revision7 (tree)
Time2010-09-12 07:18:57
Authorjkawamoto

Log Message

Add the tag 0.1.20100912

Change Summary

Incremental Difference

--- tags/0.1.20100912/src/overview.html (revision 0)
+++ tags/0.1.20100912/src/overview.html (revision 7)
@@ -0,0 +1,62 @@
1+<?xml version="1.0" encoding="utf-8" ?>
2+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3+<html xmlns="http://www.w3.org/1999/xhtml">
4+ <head>
5+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6+ <title>pxv: A pixiv API wrapper for Java</title>
7+ </head>
8+ <body>
9+ <p>
10+ <a href="http://sourceforge.jp/projects/pxv/simple/">pxv</a> は,
11+ イラストコミュニケーションサービス <a href="http://www.pixiv.net/">pixiv</a> の API を Java から利用するためのライブラリです.
12+ </p>
13+ <h2>必須環境</h2>
14+ <ul>
15+ <li>Java SE 6 以降</li>
16+ </ul>
17+ <h2>サンプルコード</h2>
18+ <blockquote><pre>
19+final PixivAPI api = new PixivAPI();
20+
21+// システムの稼働状態を調べる.
22+System.out.println("Status: " + api.status());
23+
24+// 最新投稿イラスト(1 ページ目)を列挙する.
25+for(final Image i : api.getNewImages(0)){
26+
27+ // イラストのタイトル,作者,URL を表示.
28+ System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
29+
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+
43+}
44+
45+// タグを検索(トップ 10 件).
46+for(final Image i : api.findImagesByTag("tag keyword", 10)){
47+
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+
55+ System.out.println("Profile: " + api.profile());
56+ System.out.println("My pixiv new images: " + api.getMyPixivNewImageSize());
57+
58+}
59+ </pre></blockquote>
60+
61+ </body>
62+</html>
\ No newline at end of file
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/src/pxv/Image.java (revision 0)
+++ tags/0.1.20100912/src/pxv/Image.java (revision 7)
@@ -0,0 +1,314 @@
1+/*
2+ * Copyright (C) 2010 Junpei Kawamoto
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ */
18+package pxv;
19+
20+import java.io.IOException;
21+import java.net.URL;
22+
23+/**
24+ * Pixiv における画像データをラップするクラス.
25+ * <p>
26+ * このオブジェクトが画像そのものを表すわけではありません.
27+ * 実際の画像 URL は,getImageURL から取得できます.
28+ * </p>
29+ *
30+ * @since 0.1
31+ */
32+public class Image {
33+
34+ /** 親オブジェクト */
35+ private final PixivAPI api;
36+
37+ /** イラストID */
38+ private final int id;
39+ /** ユーザーID */
40+ private final int authorId;
41+ /** 拡張子 */
42+ private final String ext;
43+ /** タイトル */
44+ private final String title;
45+ /** 画像サーバ */
46+ private final String server;
47+ /** 作者 */
48+ private final String authorName;
49+ /** サムネイル URL */
50+ private final URL thumbURL;
51+ /** モバイル画像 URL */
52+ private final URL mobileURL;
53+ /** 日付 */
54+ private final String date;
55+ /** タグ */
56+ private final String tags;
57+ /** 制作ツール */
58+ private final String tool;
59+ /** 評価点 */
60+ private final int feedback;
61+ /** 総合点 */
62+ private final int point;
63+ /** 閲覧数 */
64+ private final int views;
65+ /** 作者コメント */
66+ private final String comment;
67+ /** 画像ページの URL */
68+ private final URL url;
69+ /** 画像の URL */
70+ private final URL imageURL;
71+
72+ Image(final PixivAPI api, final String[] data) throws IOException{
73+ assert data.length > 17;
74+
75+ this.api = api;
76+ this.id = Integer.parseInt(data[0]);
77+ this.authorId = Integer.parseInt(data[1]);
78+ this.ext = data[2];
79+ this.title = data[3];
80+ this.server = data[4];
81+ this.authorName = data[5];
82+ this.thumbURL = new URL(data[6]);
83+ this.mobileURL = new URL(data[9]);
84+ this.date = data[12];
85+ this.tags = data[13];
86+ this.tool = data[14];
87+ this.feedback = Integer.parseInt(data[15]);
88+ this.point = Integer.parseInt(data[16]);
89+ this.views = Integer.parseInt(data[17]);
90+ this.comment = data[18];
91+
92+ this.url = new URL(String.format("http://www.pixiv.net/member_illust.php?mode=medium&illust_id=%s", this.id));
93+
94+ final String rawMobileURL = this.mobileURL.toString();
95+ this.imageURL = new URL(rawMobileURL.substring(0, rawMobileURL.lastIndexOf("/mobile/") + 1) + this.id + "." + this.ext);
96+
97+ }
98+
99+ /**
100+ * イラスト ID を取得する.
101+ *
102+ * @return イラスト ID
103+ */
104+ public int getId(){
105+ return this.id;
106+ }
107+
108+ /**
109+ * 作者の ID を取得する.
110+ *
111+ * @return このイラストの作者 ID
112+ */
113+ public int getAuthorId() {
114+ return authorId;
115+ }
116+
117+ /**
118+ * イラストの拡張子を取得する.
119+ *
120+ * @return このイラストの拡張子
121+ */
122+ public String getExt() {
123+ return ext;
124+ }
125+
126+ /**
127+ * タイトルを取得する.
128+ *
129+ * @return このイラストのタイトル
130+ */
131+ public String getTitle() {
132+ return title;
133+ }
134+
135+ /**
136+ * サーバ名を取得する.
137+ *
138+ * @return このイラストが保管されているサーバ名
139+ */
140+ public String getServer() {
141+ return server;
142+ }
143+
144+ /**
145+ * 作者名を取得する.
146+ *
147+ * @return このイラストの作者
148+ */
149+ public String getAuthorName() {
150+ return authorName;
151+ }
152+
153+ /**
154+ * サムネイル画像の URL を取得する.
155+ *
156+ * @return サムネイル画像の URL
157+ */
158+ public URL getThumbURL() {
159+ return thumbURL;
160+ }
161+
162+ /**
163+ * モバイル用画像の URL を取得する.
164+ *
165+ * @return モバイル用画像の URL
166+ */
167+ public URL getMobileURL() {
168+ return mobileURL;
169+ }
170+
171+ /**
172+ * 投稿日を取得する.
173+ *
174+ * @return このイラストの投稿日
175+ */
176+ public String getDate() {
177+ return date;
178+ }
179+
180+ /**
181+ * このイラストに付加されたタグを取得する.
182+ *
183+ * @return このイラストに付けられたタグ
184+ */
185+ public String getTags() {
186+ return tags;
187+ }
188+
189+ /**
190+ * 制作ツール名を取得する.
191+ *
192+ * @return 制作ツール名
193+ */
194+ public String getTool() {
195+ return tool;
196+ }
197+
198+ /**
199+ * 評価点を取得する.
200+ *
201+ * @return 評価点
202+ */
203+ public int getFeedback() {
204+ return feedback;
205+ }
206+
207+ /**
208+ * 総合点を取得する
209+ *
210+ * @return 総合点
211+ */
212+ public int getPoint() {
213+ return point;
214+ }
215+
216+ /**
217+ * 閲覧数を取得する.
218+ *
219+ * @return 閲覧数
220+ */
221+ public int getViews() {
222+ return views;
223+ }
224+
225+ /**
226+ * 作者コメントを取得する.
227+ *
228+ * @return 作者コメント
229+ */
230+ public String getComment() {
231+ return comment;
232+ }
233+
234+ /**
235+ * 画像ページの URL を取得する.
236+ *
237+ * @return 画像ページの URL
238+ */
239+ public URL getUrl() {
240+ return url;
241+ }
242+
243+ /**
244+ * 画像の URL を取得する.
245+ *
246+ * @return 画像の URL
247+ */
248+ public URL getImageURL() {
249+ return imageURL;
250+ }
251+
252+ //----------------------------------------------------------------------------
253+
254+ /**
255+ * このイラストの作者を取得する.
256+ *
257+ * @return このイラストの作者を表す User オブジェクト
258+ */
259+ public User getAuthor(){
260+ return this.api.findUser(this.getAuthorId(), this.getAuthorName());
261+ }
262+
263+ //----------------------------------------------------------------------------
264+
265+ /* (非 Javadoc)
266+ * @see java.lang.Object#toString()
267+ */
268+ @Override
269+ public String toString(){
270+
271+ final StringBuilder ret = new StringBuilder();
272+ ret.append(this.getClass().getName());
273+ ret.append("[id: ");
274+ ret.append(this.getId());
275+ ret.append(", title: ");
276+ ret.append(this.getTitle());
277+ ret.append(", author name: ");
278+ ret.append(this.getAuthorName());
279+ ret.append(", data: ");
280+ ret.append(this.getDate());
281+ ret.append("]");
282+
283+ return ret.toString();
284+
285+ }
286+
287+ /* (非 Javadoc)
288+ * @see java.lang.Object#hashCode()
289+ */
290+ @Override
291+ public int hashCode() {
292+
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+
314+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/src/pxv/package-info.java (revision 0)
+++ tags/0.1.20100912/src/pxv/package-info.java (revision 7)
@@ -0,0 +1,24 @@
1+/*
2+ * Copyright (C) 2010 Junpei Kawamoto
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ */
18+
19+/**
20+ * Pixiv API 及び,API が利用するデータ構造をラップしたクラスを提供します.
21+ *
22+ * @since 0.1
23+ */
24+package pxv;
\ No newline at end of file
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/src/pxv/CSVParser.java (revision 0)
+++ tags/0.1.20100912/src/pxv/CSVParser.java (revision 7)
@@ -0,0 +1,142 @@
1+/*
2+ * Copyright (C) 2010 Junpei Kawamoto
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ */
18+package pxv;
19+
20+import java.io.BufferedReader;
21+import java.io.IOException;
22+import java.io.PushbackReader;
23+import java.io.Reader;
24+import java.util.ArrayList;
25+import java.util.List;
26+
27+class CSVParser {
28+
29+ private enum State{
30+
31+ Default, Quoted, Escaped, CR, LF
32+
33+ };
34+
35+ private static final char Quote = '\"';
36+ private static final char Comma = ',';
37+ private static final char Escape = '\\';
38+ private static final char CR = '\r';
39+ private static final char LF = '\n';
40+ private static final int EOF = -1;
41+
42+ public static void parse(final Reader in, final Handler callback) throws IOException{
43+
44+ final PushbackReader cin = new PushbackReader(new BufferedReader(in));
45+ final List<String> holder = new ArrayList<String>();
46+
47+ StringBuffer buffer = new StringBuffer();
48+
49+ State stat = State.Default;
50+ for(int c = 0; (c = cin.read()) != EOF;){
51+
52+ switch(stat){
53+ case Default:
54+
55+ switch(c){
56+
57+ case Quote:
58+
59+ stat = State.Quoted;
60+ break;
61+
62+ case Comma:
63+
64+ holder.add(buffer.toString());
65+ buffer = new StringBuffer();
66+ break;
67+
68+ case CR:
69+
70+ stat = State.CR;
71+ break;
72+
73+ case LF:
74+
75+ callback.update(holder.toArray(new String[0]));
76+ stat = State.Default;
77+ holder.clear();
78+ break;
79+
80+ default:
81+
82+ buffer.append((char)c);
83+
84+ }
85+
86+ break;
87+
88+ case Quoted:
89+
90+ if(c == Quote){
91+
92+ stat = State.Default;
93+
94+ }else if(c == Escape){
95+
96+ stat = State.Escaped;
97+
98+ }else{
99+
100+ buffer.append((char)c);
101+
102+ }
103+
104+ break;
105+
106+ case Escaped:
107+
108+ buffer.append(Escape);
109+ buffer.append((char)c);
110+
111+ stat = State.Quoted;
112+
113+ break;
114+
115+ case CR:
116+
117+ if(c == LF){
118+
119+ stat = State.LF;
120+
121+ }else{
122+
123+ stat = State.Default;
124+ callback.update(holder.toArray(new String[0]));
125+ cin.unread(c);
126+
127+ }
128+ break;
129+
130+ }
131+
132+ }
133+
134+ }
135+
136+ public interface Handler{
137+
138+ public void update(final String[] data);
139+
140+ }
141+
142+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/src/pxv/PixivAPI.java (revision 0)
+++ tags/0.1.20100912/src/pxv/PixivAPI.java (revision 7)
@@ -0,0 +1,790 @@
1+/*
2+ * Copyright (C) 2010 Junpei Kawamoto
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ */
18+package pxv;
19+
20+import java.io.BufferedReader;
21+import java.io.IOException;
22+import java.io.InputStreamReader;
23+import java.io.Reader;
24+import java.net.HttpURLConnection;
25+import java.net.URL;
26+import java.net.URLEncoder;
27+import java.util.ArrayList;
28+import java.util.HashMap;
29+import java.util.List;
30+import java.util.Map;
31+import java.util.regex.Matcher;
32+import java.util.regex.Pattern;
33+
34+import pxv.CSVParser.Handler;
35+
36+/**
37+ * Pixiv API.
38+ *
39+ * @since 0.1
40+ */
41+public class PixivAPI {
42+
43+ private final URL base;
44+
45+ private String session = Zero;
46+
47+ //============================================================================
48+ // Constants
49+ //============================================================================
50+ private static final String BaseURL = "http://iphone.pxv.jp/iphone/";
51+ private static final String SessionID = "PHPSESSID";
52+
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+ }
56+
57+ private static final String DummyParameter = "dummy=0";
58+ private static final String Daily = "mode=day";
59+ private static final String Weekly = "mode=week";
60+ private static final String Monthly = "mode=month";
61+
62+ private static final String IDParamTemplate = "id=%d";
63+
64+ private static final String UTF8 = "UTF-8";
65+ private static final String Zero = "0";
66+
67+ //============================================================================
68+ // Constructors
69+ //============================================================================
70+ /**
71+ * PixivAPI インスタンスを作成する.
72+ *
73+ * @throws IOException I/O エラーが発生した場合.
74+ */
75+ public PixivAPI() throws IOException{
76+
77+ this.base = new URL(BaseURL);
78+
79+ }
80+
81+ //============================================================================
82+ // Public methods
83+ //============================================================================
84+ //----------------------------------------------------------------------------
85+ // APIs for user's account
86+ //----------------------------------------------------------------------------
87+ /**
88+ * ログインする.
89+ *
90+ * @param id ユーザ ID
91+ * @param password パスワード
92+ * @return ログインに成功した場合 true
93+ */
94+ public boolean login(final String id, final String password){
95+
96+ try {
97+
98+ final URL url = new URL(base, String.format("login.php?mode=login&pixiv_id=%s&pass=%s&skip=0", id, password));
99+ final HttpURLConnection con = (HttpURLConnection)url.openConnection();
100+ con.setRequestMethod("GET");
101+ con.connect();
102+
103+ if(con.getResponseCode() == 200){
104+
105+ final URL res = con.getURL();
106+ this.session = this.parseParameters(res.getQuery()).get(SessionID);
107+
108+ }
109+
110+ } catch (final IOException e) {
111+
112+ // TODO 自動生成された catch ブロック
113+ e.printStackTrace();
114+
115+ }
116+
117+ return this.logined();
118+
119+ }
120+
121+ /**
122+ * ログインしているか調べる.
123+ *
124+ * @return ログインしている場合 true
125+ */
126+ public boolean logined(){
127+
128+ return this.session != Zero;
129+
130+ }
131+
132+ /**
133+ * システムの稼働状態を調べる.
134+ *
135+ * @return システムが稼働している場合 true
136+ */
137+ public boolean status(){
138+
139+ try {
140+
141+ final URL url = new URL(this.base, "maintenance.php?software-version=1.0");
142+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
143+ con.connect();
144+
145+ return con.getResponseCode() == 200;
146+
147+ } catch (final IOException e) {
148+
149+ e.printStackTrace();
150+
151+ }
152+
153+ return false;
154+
155+ }
156+
157+ /**
158+ * ログインユーザのプロフィールを取得する.
159+ *
160+ * @return プロフィール
161+ */
162+ public String profile(){
163+
164+ final StringBuffer ret = new StringBuffer();
165+ try {
166+
167+ final URL url = new URL(this.base, String.format("profile.php?dummy=0&%s=%s", SessionID, this.session));
168+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
169+ con.connect();
170+
171+ if(con.getResponseCode() == 200){
172+
173+ final BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
174+ for(String buf; (buf = in.readLine()) != null;){
175+
176+ ret.append(buf);
177+ ret.append("\n");
178+
179+ }
180+ in.close();
181+
182+ }
183+
184+ } catch (final IOException e) {
185+
186+ e.printStackTrace();
187+
188+ }
189+
190+ return ret.toString();
191+
192+ }
193+
194+ //----------------------------------------------------------------------------
195+ // APIs for new images
196+ //----------------------------------------------------------------------------
197+ /**
198+ * 新着イラスト数を取得する.
199+ *
200+ * @return 新着イラスト数
201+ */
202+ public int getNewImageSize(){
203+ return this.getSize(Type.new_illust, DummyParameter);
204+ }
205+
206+ /**
207+ * 新着イラストを取得する.
208+ *
209+ * @param page 取得するページ番号
210+ * @return 取得したイラストのリスト
211+ */
212+ public List<Image> getNewImages(final int page){
213+ return this.getImages(Type.new_illust, DummyParameter, page);
214+ }
215+
216+ /**
217+ * 新着 MyPixiv イラストの数を取得する.
218+ *
219+ * @return 新着 MyPixiv イラスト数
220+ */
221+ public int getMyPixivNewImageSize(){
222+ return this.getSize(Type.mypixiv_new_illust, DummyParameter);
223+ }
224+
225+ /**
226+ * 新着 MyPixiv イラストを取得する.
227+ *
228+ * @param page 取得するページ番号
229+ * @return 取得したイラストのリスト
230+ */
231+ public List<Image> getMyPixivNewImages(final int page){
232+ return this.getImages(Type.mypixiv_new_illust, DummyParameter, page);
233+ }
234+
235+ /**
236+ * お気に入りユーザの新着イラスト数を取得する.
237+ *
238+ * @return お気に入りユーザの新着イラスト数
239+ */
240+ public int getBookmarkedUserNewImageSize(){
241+ return this.getSize(Type.bookmark_user_new_illust, DummyParameter);
242+ }
243+
244+ /**
245+ * お気に入りユーザの新着イラストを取得する.
246+ *
247+ * @param page 取得するページ番号
248+ * @return 取得したイラストのリスト
249+ */
250+ public List<Image> getBookmarkedUserNewImages(final int page){
251+ return this.getImages(Type.bookmark_user_new_illust, DummyParameter, page);
252+ }
253+
254+ //----------------------------------------------------------------------------
255+
256+ /**
257+ * デイリーランキングのイラスト数を取得する.
258+ *
259+ * @return デイリーランキングのイラスト数
260+ */
261+ public int getDailyRankingImageSize(){
262+ return this.getSize(Type.ranking, Daily);
263+ }
264+
265+ /**
266+ * デイリーランキングのイラストを取得する.
267+ *
268+ * @param page 取得するページ番号
269+ * @return 取得したイラストのリスト
270+ */
271+ public List<Image> getDailyRankingImages(final int page){
272+ return this.getImages(Type.ranking, Daily, page);
273+ }
274+
275+ /**
276+ * ウィークリーランキングのイラスト数を取得する.
277+ *
278+ * @return ウィークリーランキングのイラスト数
279+ */
280+ public int getWeeklyRankingImageSize(){
281+ return this.getSize(Type.ranking, Weekly);
282+ }
283+
284+ /**
285+ * ウィークリーランキングのイラストを取得する.
286+ *
287+ * @param page 取得するページ番号
288+ * @return 取得したイラストのリスト
289+ */
290+ public List<Image> getWeeklyRankingImages(final int page){
291+ return this.getImages(Type.ranking, Weekly, page);
292+ }
293+
294+ /**
295+ * マンスリーランキングのイラスト数を取得する.
296+ *
297+ * @return マンスリーランキングのイラスト数
298+ */
299+ public int getMonthlyRankingImageSize(){
300+ return this.getSize(Type.ranking, Monthly);
301+ }
302+
303+ /**
304+ * マンスリーランキングのイラストを取得する.
305+ *
306+ * @param page 取得するページ番号
307+ * @return 取得したイラストのリスト
308+ */
309+ public List<Image> getMonthlyRankingImages(final int page){
310+ return this.getImages(Type.ranking, Monthly, page);
311+ }
312+
313+
314+ //----------------------------------------------------------------------------
315+ // APIs for search
316+ //----------------------------------------------------------------------------
317+ /**
318+ * 与えられたキーワードに関連するタグを付加されたイラストを取得する.
319+ *
320+ * @param keyword 問い合わせるキーワード
321+ * @param size 取得するイラスト数
322+ * @return 取得したイラストのリスト
323+ * @throws IOException IOエラーが発生した場合
324+ */
325+ public List<Image> findImagesByTag(final String keyword, final int size) throws IOException{
326+
327+ final String param = String.format("s_mode=s_tag&word=%s", URLEncoder.encode(keyword , UTF8));
328+ return this.findImages(param, size);
329+ }
330+
331+ /**
332+ * 与えられたキーワードに関連するタイトルを持つイラストを取得する.
333+ *
334+ * @param keyword 問い合わせるキーワード
335+ * @param size 取得するイラスト数
336+ * @return 取得したイラストのリスト
337+ * @throws IOException IOエラーが発生した場合
338+ */
339+ public List<Image> findImagesByTitle(final String keyword, final int size) throws IOException{
340+
341+ final String param = String.format("s_mode=s_tc&word=%s", URLEncoder.encode(keyword , UTF8));
342+ return this.findImages(param, size);
343+
344+ }
345+
346+ /**
347+ * 与えられた名前のユーザを取得する.
348+ *
349+ * @param name 問い合わせるユーザの名前
350+ * @param size 取得するユーザ数
351+ * @return 取得したユーザのリスト
352+ * @throws IOException IOエラーが発生した場合
353+ */
354+ public List<User> findUsers(final String name, final int size) throws IOException{
355+
356+ final List<User> ret = new ArrayList<User>();
357+ final String param = String.format("nick=%s", URLEncoder.encode(name , UTF8));
358+ for(int i = 0; true; ++i){
359+
360+ final List<User> sub = this.getUsers(Type.search, param, i);
361+ if(sub.size() == 0){
362+
363+ break;
364+
365+ }
366+
367+ ret.addAll(sub);
368+
369+ }
370+
371+ return ret;
372+
373+ }
374+
375+ /**
376+ * ID と名前を指定してユーザを取得する.
377+ *
378+ * @param id 取得するユーザの ID
379+ * @param name 取得するユーザの名前
380+ * @return 取得したユーザの User オブジェクト,ユーザが見つからなかった場合は null
381+ */
382+ public User findUser(final int id, final String name){
383+
384+ final List<User> ret = new ArrayList<User>();
385+ try{
386+
387+ for(int i = 0; ret.size() == 0 && i < 100; ++i){
388+
389+ 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));
390+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
391+ con.connect();
392+
393+ if(con.getResponseCode() == 200){
394+
395+ final Reader in = new InputStreamReader(con.getInputStream());
396+ CSVParser.parse(in, new Handler(){
397+
398+ @Override
399+ public void update(final String[] data) {
400+
401+ try {
402+
403+ final User u = new User(PixivAPI.this, data);
404+ if(u.getId() == id){
405+
406+ ret.add(u);
407+
408+ }
409+
410+ } catch (IOException e) {
411+
412+ // TODO 自動生成された catch ブロック
413+ e.printStackTrace();
414+
415+ }
416+
417+ }
418+
419+ });
420+ in.close();
421+
422+ }else{
423+
424+ break;
425+
426+ }
427+
428+ }
429+
430+ }catch(final IOException e){
431+
432+ // TODO 自動生成された catch ブロック
433+ e.printStackTrace();
434+
435+ }
436+
437+ if(ret.size() != 0){
438+
439+ return ret.get(0);
440+
441+ }else{
442+
443+ return null;
444+
445+ }
446+
447+ }
448+
449+ //----------------------------------------------------------------------------
450+ // APIs for user
451+ //----------------------------------------------------------------------------
452+ /**
453+ * 指定したユーザの投稿イラスト数を取得する.
454+ *
455+ * @param userId ユーザ ID
456+ * @return 指定したユーザ ID を持つユーザの投稿イラスト数
457+ */
458+ public int getImageSize(final int userId){
459+ return this.getSizeById(Type.member_illust, userId);
460+ }
461+
462+ /**
463+ * 指定したユーザの投稿イラストを取得する.
464+ *
465+ * @param userId ユーザ ID
466+ * @param page ページ数
467+ * @return 指定したユーザ ID を持つユーザの投稿イラスト
468+ */
469+ public List<Image> getImages(final int userId, final int page){
470+ return this.getImagesByUserId(Type.member_illust, userId, page);
471+ }
472+
473+ /**
474+ * 指定したユーザの MyPixiv ユーザ数を取得する.
475+ *
476+ * @param userId ユーザ ID
477+ * @return 指定したユーザ ID を持つユーザの MyPixiv ユーザ数
478+ */
479+ public int getMyPixivSize(final int usrId){
480+ return this.getSizeById(Type.mypixiv_all, usrId);
481+ }
482+
483+ /**
484+ * 指定したユーザの MyPixiv ユーザを取得する.
485+ *
486+ * @param userId ユーザ ID
487+ * @param page ページ数
488+ * @return 指定したユーザ ID を持つユーザの MyPixiv ユーザ
489+ */
490+ public List<User> getMyPixivUsers(final int usrId, final int page){
491+ return this.getUsersById(Type.mypixiv_all, usrId, page);
492+ }
493+
494+ /**
495+ * 指定したユーザのお気に入りユーザ数を取得する.
496+ *
497+ * @param userId ユーザ ID
498+ * @return 指定したユーザ ID を持つユーザのお気に入りユーザ数
499+ */
500+ public int getBookmarkedUserSize(final int id){
501+ return this.getSizeById(Type.bookmark_user_all, id);
502+ }
503+
504+ /**
505+ * 指定したユーザのお気に入りユーザを取得する.
506+ *
507+ * @param userId ユーザ ID
508+ * @param page ページ数
509+ * @return 指定したユーザ ID を持つユーザのお気に入りユーザ
510+ */
511+ public List<User> getBookmarkedUsers(final int id, final int page){
512+ return this.getUsersById(Type.bookmark_user_all, id, page);
513+ }
514+
515+ /**
516+ * 指定したユーザのブックマーク数を取得する.
517+ *
518+ * @param userId ユーザ ID
519+ * @return 指定したユーザ ID を持つユーザのブックマーク数
520+ */
521+ public int getBookmarkSize(final int id){
522+ return this.getSizeById(Type.bookmark, id);
523+ }
524+
525+ /**
526+ * 指定したユーザのブックマークを取得する.
527+ *
528+ * @param userId ユーザ ID
529+ * @param page ページ数
530+ * @return 指定したユーザ ID を持つユーザのブックマーク
531+ */
532+ public List<Image> getBookmarks(final int id, final int page){
533+ return this.getImagesByUserId(Type.bookmark, id, page);
534+ }
535+
536+ //============================================================================
537+ // Private methods
538+ //============================================================================
539+ private Map<String, String> parseParameters(final String params){
540+
541+ final Map<String, String> ret = new HashMap<String, String>();
542+
543+ final Pattern param = Pattern.compile("(\\w+)=(\\w+)");
544+ final Matcher m = param.matcher(params);
545+ while(m.find()){
546+
547+ final String key = m.group(1);
548+ final String value = m.group(2);
549+
550+ ret.put(key, value);
551+
552+ }
553+
554+ return ret;
555+
556+ }
557+
558+ /**
559+ * ユーザまたは画像の総数を取得する.
560+ *
561+ * @param type 取得する総数の種類
562+ * @param param 問合せ用パラメータ
563+ * @return 取得したユーザまたは画像の総数
564+ */
565+ private int getSize(final Type type, final String param){
566+
567+ int ret = -1;
568+ try{
569+
570+ final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&c_mode=count", type, param, SessionID, this.session));
571+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
572+ con.connect();
573+
574+ if(con.getResponseCode() == 200){
575+
576+ final BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
577+ final String buf = in.readLine();
578+ if(buf != null){
579+
580+ ret = Integer.parseInt(buf);
581+
582+ }
583+
584+ in.close();
585+
586+ }
587+
588+ }catch(final IOException e){
589+
590+ e.printStackTrace();
591+
592+ }
593+
594+ return ret;
595+
596+ }
597+
598+ /**
599+ * ID を指定してユーザまたは画像の総数を取得する.
600+ *
601+ * @param type 取得する総数の種類
602+ * @param id 問合せに使用する ID
603+ * @return 取得したユーザまたは画像の総数
604+ */
605+ private int getSizeById(final Type type, final int id){
606+ return this.getSize(type, String.format(IDParamTemplate, id));
607+ }
608+
609+ /**
610+ * 画像に関する情報を取得する.
611+ *
612+ * @param type 取得する画像の種類
613+ * @param param 問合せ用パラメータ
614+ * @param page 取得するページ
615+ * @return 取得した画像のリスト
616+ */
617+ private List<Image> getImages(final Type type, final String param, final int page){
618+
619+ final List<Image> ret = new ArrayList<Image>();
620+ try{
621+
622+ final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, page));
623+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
624+ con.connect();
625+
626+ if(con.getResponseCode() == 200){
627+
628+ final Reader in = new InputStreamReader(con.getInputStream());
629+ CSVParser.parse(in, new Handler(){
630+
631+ @Override
632+ public void update(final String[] data) {
633+
634+ try {
635+
636+ final Image image = new Image(PixivAPI.this, data);
637+ if(!ret.contains(image)){
638+
639+ ret.add(image);
640+
641+ }
642+
643+ } catch (IOException e) {
644+
645+ e.printStackTrace();
646+
647+ }
648+
649+ }
650+
651+ });
652+ in.close();
653+
654+ }
655+
656+ }catch(final IOException e){
657+
658+ e.printStackTrace();
659+
660+ }
661+
662+ return ret;
663+
664+ }
665+
666+ private List<Image> getImagesByUserId(final Type type, final int id, final int page){
667+ return this.getImages(type, String.format(IDParamTemplate, id), page);
668+ }
669+
670+ private List<Image> findImages(final String param, final int size) throws IOException{
671+
672+ final List<Image> ret = new ArrayList<Image>();
673+ for(int i = 0; ret.size() < size; ++i){
674+
675+ final List<Image> sub = this.getImages(Type.search, param, i);
676+ if(sub.size() == 0){
677+
678+ break;
679+
680+ }
681+
682+ ret.addAll(sub);
683+
684+ }
685+
686+
687+ return ret;
688+
689+ }
690+
691+ private List<User> getUsers(final Type type, final String param, final int page){
692+
693+ final List<User> ret = new ArrayList<User>();
694+ try{
695+
696+ final URL url = new URL(this.base, String.format("%s.php?%s&%s=%s&p=%d", type, param, SessionID, this.session, page));
697+ final HttpURLConnection con = (HttpURLConnection) url.openConnection();
698+ con.connect();
699+
700+ if(con.getResponseCode() == 200){
701+
702+ final Reader in = new InputStreamReader(con.getInputStream());
703+ CSVParser.parse(in, new Handler(){
704+
705+ @Override
706+ public void update(final String[] data) {
707+
708+ try {
709+
710+ ret.add(new User(PixivAPI.this, data));
711+
712+ } catch (IOException e) {
713+
714+ // TODO 自動生成された catch ブロック
715+ e.printStackTrace();
716+
717+ }
718+
719+ }
720+
721+ });
722+ in.close();
723+
724+ }
725+
726+
727+ }catch(final IOException e){
728+
729+ e.printStackTrace();
730+
731+ }
732+
733+ return ret;
734+
735+ }
736+
737+ private List<User> getUsersById(final Type type, final int id, final int page){
738+ return this.getUsers(type, String.format(IDParamTemplate, id), page);
739+ }
740+
741+ //============================================================================
742+ // Public static methods
743+ //============================================================================
744+ /**
745+ * サンプルプログラム.
746+ *
747+ * @param args ユーザ名,パスワード,タグ検索用キーワード
748+ * @throws IOException IOエラーが発生した場合.
749+ */
750+ public static void main(final String[] args) throws IOException{
751+
752+ final PixivAPI api = new PixivAPI();
753+ System.out.println("Status: " + api.status());
754+
755+ System.out.println("= new images on the 1st page");
756+ for(final Image i : api.getNewImages(0)){
757+
758+ System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
759+
760+ final User author = i.getAuthor();
761+ if(author != null){
762+
763+ for(final User user : author.getBookmarkedUsers(0)){
764+
765+ System.out.println(">> " + user);
766+
767+ }
768+
769+ }
770+
771+ }
772+
773+ System.out.println("= find images by tag");
774+ for(final Image i : api.findImagesByTag(args[2], 10)){
775+
776+ System.out.println(String.format("%s by %s (%s)", i.getTitle(), i.getAuthorName(), i.getImageURL()));
777+
778+ }
779+
780+ // Login
781+ if(api.login(args[0], args[1])){
782+
783+ System.out.println("Profile: " + api.profile());
784+ System.out.println("My pixiv new images: " + api.getMyPixivNewImageSize());
785+
786+ }
787+
788+ }
789+
790+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/src/pxv/User.java (revision 0)
+++ tags/0.1.20100912/src/pxv/User.java (revision 7)
@@ -0,0 +1,225 @@
1+/*
2+ * Copyright (C) 2010 Junpei Kawamoto
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ */
18+package pxv;
19+
20+import java.io.IOException;
21+import java.net.URL;
22+import java.util.List;
23+
24+/**
25+ * Pixiv におけるユーザデータをラップするクラス.
26+ *
27+ * @since 0.1
28+ */
29+public class User {
30+
31+ /** 親オブジェクト */
32+ private final PixivAPI api;
33+
34+ /** ユーザ ID */
35+ private final int id;
36+ /** ユーザ名 */
37+ private final String name;
38+ /** モバイル画像のURL */
39+ private final URL mobileURL;
40+ /** アルファベットユーザ名 */
41+ private final String ename;
42+
43+ //============================================================================
44+ // Constructor
45+ //============================================================================
46+ User(final PixivAPI api, final String[] data) throws IOException{
47+ assert data.length >= 25;
48+
49+ this.api = api;
50+ this.id = Integer.parseInt(data[1]);
51+ this.name = data[5];
52+ this.mobileURL = new URL(data[6]);
53+ this.ename = data[24];
54+
55+ }
56+
57+ //============================================================================
58+ // Public methods
59+ //============================================================================
60+ //----------------------------------------------------------------------------
61+ // For getting this user's information
62+ //----------------------------------------------------------------------------
63+ /**
64+ * ユーザ ID を取得する.
65+ *
66+ * @return このユーザの ID
67+ */
68+ public int getId() {
69+ return id;
70+ }
71+
72+ /**
73+ * ユーザ名を取得する.
74+ *
75+ * @return このユーザの名前
76+ */
77+ public String getName() {
78+ return name;
79+ }
80+
81+ /**
82+ * モバイルプロフィール画像の URL を取得する.
83+ *
84+ * @return モバイルプロフィール画像の URL
85+ */
86+ public URL getMobileURL() {
87+ return mobileURL;
88+ }
89+
90+ /**
91+ * アルファベット表記のユーザ名を取得する.
92+ *
93+ * @return このユーザのアルファベット表記名
94+ */
95+ public String getEname() {
96+ return ename;
97+ }
98+
99+ //----------------------------------------------------------------------------
100+
101+ /**
102+ * このユーザの投稿画像数を取得する.
103+ *
104+ * @return 投稿画像総数
105+ */
106+ public int getImageSize(){
107+ return this.api.getImageSize(this.getId());
108+ }
109+
110+ /**
111+ * このユーザの投稿画像を取得する.
112+ *
113+ * @param page 取得する画像のページ
114+ * @return 取得した画像のリスト
115+ */
116+ public List<Image> getImages(final int page){
117+ return this.api.getImages(this.getId(), page);
118+ }
119+
120+ /**
121+ * MyPixiv に登録しているユーザ数を取得する.
122+ *
123+ * @return
124+ */
125+ public int getMyPixivSize(){
126+ return this.api.getMyPixivSize(this.getId());
127+ }
128+
129+ /**
130+ * MyPixiv ユーザを取得する.
131+ *
132+ * @param page 取得するページ
133+ * @return 取得したユーザのリスト
134+ */
135+ public List<User> getMyPixivUsers(final int page){
136+ return this.api.getMyPixivUsers(this.getId(), page);
137+ }
138+
139+ /**
140+ * お気に入りユーザ数を取得する.
141+ *
142+ * @return このユーザのお気に入りユーザ数
143+ */
144+ public int getBookmarkedUserSize(){
145+ return this.api.getBookmarkedUserSize(this.getId());
146+ }
147+
148+ /**
149+ * お気に入りユーザを取得する.
150+ *
151+ * @param page 取得するページ
152+ * @return 取得したユーザのリスト
153+ */
154+ public List<User> getBookmarkedUsers(final int page){
155+ return this.api.getBookmarkedUsers(this.getId(), page);
156+ }
157+
158+ /**
159+ * ブックマークイラストの数を取得する.
160+ *
161+ * @return ブックマークしたイラストの数
162+ */
163+ public int getBookmarkSize(){
164+ return this.api.getBookmarkSize(this.getId());
165+ }
166+
167+ /**
168+ * ブックマークイラストを取得する.
169+ *
170+ * @param page 取得するページ数
171+ * @return 取得したイラストのリスト
172+ */
173+ public List<Image> getBookmarks(final int page){
174+ return this.api.getBookmarks(this.getId(), page);
175+ }
176+
177+ //----------------------------------------------------------------------------
178+
179+ /* (非 Javadoc)
180+ * @see java.lang.Object#toString()
181+ */
182+ @Override
183+ public String toString(){
184+
185+ final StringBuilder ret = new StringBuilder();
186+ ret.append(this.getClass().getName());
187+ ret.append("[id: ");
188+ ret.append(this.getId());
189+ ret.append(", name: ");
190+ ret.append(this.getName());
191+ ret.append(", mobile url: ");
192+ ret.append(this.getMobileURL());
193+ ret.append(", ename: ");
194+ ret.append(this.getEname());
195+ ret.append("]");
196+
197+ return ret.toString();
198+
199+ }
200+
201+ /* (非 Javadoc)
202+ * @see java.lang.Object#hashCode()
203+ */
204+ @Override
205+ public int hashCode() {
206+ return Integer.valueOf(this.getId()).hashCode();
207+ }
208+
209+ /* (非 Javadoc)
210+ * @see java.lang.Object#equals(java.lang.Object)
211+ */
212+ @Override
213+ public boolean equals(final Object obj) {
214+
215+ if(obj instanceof User){
216+
217+ final User that = (User)obj;
218+ return this.getId() == that.getId();
219+
220+ }
221+
222+ return super.equals(obj);
223+ }
224+
225+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- tags/0.1.20100912/COPYING (revision 0)
+++ tags/0.1.20100912/COPYING (revision 7)
@@ -0,0 +1,674 @@
1+ GNU GENERAL PUBLIC LICENSE
2+ Version 3, 29 June 2007
3+
4+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5+ Everyone is permitted to copy and distribute verbatim copies
6+ of this license document, but changing it is not allowed.
7+
8+ Preamble
9+
10+ The GNU General Public License is a free, copyleft license for
11+software and other kinds of works.
12+
13+ The licenses for most software and other practical works are designed
14+to take away your freedom to share and change the works. By contrast,
15+the GNU General Public License is intended to guarantee your freedom to
16+share and change all versions of a program--to make sure it remains free
17+software for all its users. We, the Free Software Foundation, use the
18+GNU General Public License for most of our software; it applies also to
19+any other work released this way by its authors. You can apply it to
20+your programs, too.
21+
22+ When we speak of free software, we are referring to freedom, not
23+price. Our General Public Licenses are designed to make sure that you
24+have the freedom to distribute copies of free software (and charge for
25+them if you wish), that you receive source code or can get it if you
26+want it, that you can change the software or use pieces of it in new
27+free programs, and that you know you can do these things.
28+
29+ To protect your rights, we need to prevent others from denying you
30+these rights or asking you to surrender the rights. Therefore, you have
31+certain responsibilities if you distribute copies of the software, or if
32+you modify it: responsibilities to respect the freedom of others.
33+
34+ For example, if you distribute copies of such a program, whether
35+gratis or for a fee, you must pass on to the recipients the same
36+freedoms that you received. You must make sure that they, too, receive
37+or can get the source code. And you must show them these terms so they
38+know their rights.
39+
40+ Developers that use the GNU GPL protect your rights with two steps:
41+(1) assert copyright on the software, and (2) offer you this License
42+giving you legal permission to copy, distribute and/or modify it.
43+
44+ For the developers' and authors' protection, the GPL clearly explains
45+that there is no warranty for this free software. For both users' and
46+authors' sake, the GPL requires that modified versions be marked as
47+changed, so that their problems will not be attributed erroneously to
48+authors of previous versions.
49+
50+ Some devices are designed to deny users access to install or run
51+modified versions of the software inside them, although the manufacturer
52+can do so. This is fundamentally incompatible with the aim of
53+protecting users' freedom to change the software. The systematic
54+pattern of such abuse occurs in the area of products for individuals to
55+use, which is precisely where it is most unacceptable. Therefore, we
56+have designed this version of the GPL to prohibit the practice for those
57+products. If such problems arise substantially in other domains, we
58+stand ready to extend this provision to those domains in future versions
59+of the GPL, as needed to protect the freedom of users.
60+
61+ Finally, every program is threatened constantly by software patents.
62+States should not allow patents to restrict development and use of
63+software on general-purpose computers, but in those that do, we wish to
64+avoid the special danger that patents applied to a free program could
65+make it effectively proprietary. To prevent this, the GPL assures that
66+patents cannot be used to render the program non-free.
67+
68+ The precise terms and conditions for copying, distribution and
69+modification follow.
70+
71+ TERMS AND CONDITIONS
72+
73+ 0. Definitions.
74+
75+ "This License" refers to version 3 of the GNU General Public License.
76+
77+ "Copyright" also means copyright-like laws that apply to other kinds of
78+works, such as semiconductor masks.
79+
80+ "The Program" refers to any copyrightable work licensed under this
81+License. Each licensee is addressed as "you". "Licensees" and
82+"recipients" may be individuals or organizations.
83+
84+ To "modify" a work means to copy from or adapt all or part of the work
85+in a fashion requiring copyright permission, other than the making of an
86+exact copy. The resulting work is called a "modified version" of the
87+earlier work or a work "based on" the earlier work.
88+
89+ A "covered work" means either the unmodified Program or a work based
90+on the Program.
91+
92+ To "propagate" a work means to do anything with it that, without
93+permission, would make you directly or secondarily liable for
94+infringement under applicable copyright law, except executing it on a
95+computer or modifying a private copy. Propagation includes copying,
96+distribution (with or without modification), making available to the
97+public, and in some countries other activities as well.
98+
99+ To "convey" a work means any kind of propagation that enables other
100+parties to make or receive copies. Mere interaction with a user through
101+a computer network, with no transfer of a copy, is not conveying.
102+
103+ An interactive user interface displays "Appropriate Legal Notices"
104+to the extent that it includes a convenient and prominently visible
105+feature that (1) displays an appropriate copyright notice, and (2)
106+tells the user that there is no warranty for the work (except to the
107+extent that warranties are provided), that licensees may convey the
108+work under this License, and how to view a copy of this License. If
109+the interface presents a list of user commands or options, such as a
110+menu, a prominent item in the list meets this criterion.
111+
112+ 1. Source Code.
113+
114+ The "source code" for a work means the preferred form of the work
115+for making modifications to it. "Object code" means any non-source
116+form of a work.
117+
118+ A "Standard Interface" means an interface that either is an official
119+standard defined by a recognized standards body, or, in the case of
120+interfaces specified for a particular programming language, one that
121+is widely used among developers working in that language.
122+
123+ The "System Libraries" of an executable work include anything, other
124+than the work as a whole, that (a) is included in the normal form of
125+packaging a Major Component, but which is not part of that Major
126+Component, and (b) serves only to enable use of the work with that
127+Major Component, or to implement a Standard Interface for which an
128+implementation is available to the public in source code form. A
129+"Major Component", in this context, means a major essential component
130+(kernel, window system, and so on) of the specific operating system
131+(if any) on which the executable work runs, or a compiler used to
132+produce the work, or an object code interpreter used to run it.
133+
134+ The "Corresponding Source" for a work in object code form means all
135+the source code needed to generate, install, and (for an executable
136+work) run the object code and to modify the work, including scripts to
137+control those activities. However, it does not include the work's
138+System Libraries, or general-purpose tools or generally available free
139+programs which are used unmodified in performing those activities but
140+which are not part of the work. For example, Corresponding Source
141+includes interface definition files associated with source files for
142+the work, and the source code for shared libraries and dynamically
143+linked subprograms that the work is specifically designed to require,
144+such as by intimate data communication or control flow between those
145+subprograms and other parts of the work.
146+
147+ The Corresponding Source need not include anything that users
148+can regenerate automatically from other parts of the Corresponding
149+Source.
150+
151+ The Corresponding Source for a work in source code form is that
152+same work.
153+
154+ 2. Basic Permissions.
155+
156+ All rights granted under this License are granted for the term of
157+copyright on the Program, and are irrevocable provided the stated
158+conditions are met. This License explicitly affirms your unlimited
159+permission to run the unmodified Program. The output from running a
160+covered work is covered by this License only if the output, given its
161+content, constitutes a covered work. This License acknowledges your
162+rights of fair use or other equivalent, as provided by copyright law.
163+
164+ You may make, run and propagate covered works that you do not
165+convey, without conditions so long as your license otherwise remains
166+in force. You may convey covered works to others for the sole purpose
167+of having them make modifications exclusively for you, or provide you
168+with facilities for running those works, provided that you comply with
169+the terms of this License in conveying all material for which you do
170+not control copyright. Those thus making or running the covered works
171+for you must do so exclusively on your behalf, under your direction
172+and control, on terms that prohibit them from making any copies of
173+your copyrighted material outside their relationship with you.
174+
175+ Conveying under any other circumstances is permitted solely under
176+the conditions stated below. Sublicensing is not allowed; section 10
177+makes it unnecessary.
178+
179+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180+
181+ No covered work shall be deemed part of an effective technological
182+measure under any applicable law fulfilling obligations under article
183+11 of the WIPO copyright treaty adopted on 20 December 1996, or
184+similar laws prohibiting or restricting circumvention of such
185+measures.
186+
187+ When you convey a covered work, you waive any legal power to forbid
188+circumvention of technological measures to the extent such circumvention
189+is effected by exercising rights under this License with respect to
190+the covered work, and you disclaim any intention to limit operation or
191+modification of the work as a means of enforcing, against the work's
192+users, your or third parties' legal rights to forbid circumvention of
193+technological measures.
194+
195+ 4. Conveying Verbatim Copies.
196+
197+ You may convey verbatim copies of the Program's source code as you
198+receive it, in any medium, provided that you conspicuously and
199+appropriately publish on each copy an appropriate copyright notice;
200+keep intact all notices stating that this License and any
201+non-permissive terms added in accord with section 7 apply to the code;
202+keep intact all notices of the absence of any warranty; and give all
203+recipients a copy of this License along with the Program.
204+
205+ You may charge any price or no price for each copy that you convey,
206+and you may offer support or warranty protection for a fee.
207+
208+ 5. Conveying Modified Source Versions.
209+
210+ You may convey a work based on the Program, or the modifications to
211+produce it from the Program, in the form of source code under the
212+terms of section 4, provided that you also meet all of these conditions:
213+
214+ a) The work must carry prominent notices stating that you modified
215+ it, and giving a relevant date.
216+
217+ b) The work must carry prominent notices stating that it is
218+ released under this License and any conditions added under section
219+ 7. This requirement modifies the requirement in section 4 to
220+ "keep intact all notices".
221+
222+ c) You must license the entire work, as a whole, under this
223+ License to anyone who comes into possession of a copy. This
224+ License will therefore apply, along with any applicable section 7
225+ additional terms, to the whole of the work, and all its parts,
226+ regardless of how they are packaged. This License gives no
227+ permission to license the work in any other way, but it does not
228+ invalidate such permission if you have separately received it.
229+
230+ d) If the work has interactive user interfaces, each must display
231+ Appropriate Legal Notices; however, if the Program has interactive
232+ interfaces that do not display Appropriate Legal Notices, your
233+ work need not make them do so.
234+
235+ A compilation of a covered work with other separate and independent
236+works, which are not by their nature extensions of the covered work,
237+and which are not combined with it such as to form a larger program,
238+in or on a volume of a storage or distribution medium, is called an
239+"aggregate" if the compilation and its resulting copyright are not
240+used to limit the access or legal rights of the compilation's users
241+beyond what the individual works permit. Inclusion of a covered work
242+in an aggregate does not cause this License to apply to the other
243+parts of the aggregate.
244+
245+ 6. Conveying Non-Source Forms.
246+
247+ You may convey a covered work in object code form under the terms
248+of sections 4 and 5, provided that you also convey the
249+machine-readable Corresponding Source under the terms of this License,
250+in one of these ways:
251+
252+ a) Convey the object code in, or embodied in, a physical product
253+ (including a physical distribution medium), accompanied by the
254+ Corresponding Source fixed on a durable physical medium
255+ customarily used for software interchange.
256+
257+ b) Convey the object code in, or embodied in, a physical product
258+ (including a physical distribution medium), accompanied by a
259+ written offer, valid for at least three years and valid for as
260+ long as you offer spare parts or customer support for that product
261+ model, to give anyone who possesses the object code either (1) a
262+ copy of the Corresponding Source for all the software in the
263+ product that is covered by this License, on a durable physical
264+ medium customarily used for software interchange, for a price no
265+ more than your reasonable cost of physically performing this
266+ conveying of source, or (2) access to copy the
267+ Corresponding Source from a network server at no charge.
268+
269+ c) Convey individual copies of the object code with a copy of the
270+ written offer to provide the Corresponding Source. This
271+ alternative is allowed only occasionally and noncommercially, and
272+ only if you received the object code with such an offer, in accord
273+ with subsection 6b.
274+
275+ d) Convey the object code by offering access from a designated
276+ place (gratis or for a charge), and offer equivalent access to the
277+ Corresponding Source in the same way through the same place at no
278+ further charge. You need not require recipients to copy the
279+ Corresponding Source along with the object code. If the place to
280+ copy the object code is a network server, the Corresponding Source
281+ may be on a different server (operated by you or a third party)
282+ that supports equivalent copying facilities, provided you maintain
283+ clear directions next to the object code saying where to find the
284+ Corresponding Source. Regardless of what server hosts the
285+ Corresponding Source, you remain obligated to ensure that it is
286+ available for as long as needed to satisfy these requirements.
287+
288+ e) Convey the object code using peer-to-peer transmission, provided
289+ you inform other peers where the object code and Corresponding
290+ Source of the work are being offered to the general public at no
291+ charge under subsection 6d.
292+
293+ A separable portion of the object code, whose source code is excluded
294+from the Corresponding Source as a System Library, need not be
295+included in conveying the object code work.
296+
297+ A "User Product" is either (1) a "consumer product", which means any
298+tangible personal property which is normally used for personal, family,
299+or household purposes, or (2) anything designed or sold for incorporation
300+into a dwelling. In determining whether a product is a consumer product,
301+doubtful cases shall be resolved in favor of coverage. For a particular
302+product received by a particular user, "normally used" refers to a
303+typical or common use of that class of product, regardless of the status
304+of the particular user or of the way in which the particular user
305+actually uses, or expects or is expected to use, the product. A product
306+is a consumer product regardless of whether the product has substantial
307+commercial, industrial or non-consumer uses, unless such uses represent
308+the only significant mode of use of the product.
309+
310+ "Installation Information" for a User Product means any methods,
311+procedures, authorization keys, or other information required to install
312+and execute modified versions of a covered work in that User Product from
313+a modified version of its Corresponding Source. The information must
314+suffice to ensure that the continued functioning of the modified object
315+code is in no case prevented or interfered with solely because
316+modification has been made.
317+
318+ If you convey an object code work under this section in, or with, or
319+specifically for use in, a User Product, and the conveying occurs as
320+part of a transaction in which the right of possession and use of the
321+User Product is transferred to the recipient in perpetuity or for a
322+fixed term (regardless of how the transaction is characterized), the
323+Corresponding Source conveyed under this section must be accompanied
324+by the Installation Information. But this requirement does not apply
325+if neither you nor any third party retains the ability to install
326+modified object code on the User Product (for example, the work has
327+been installed in ROM).
328+
329+ The requirement to provide Installation Information does not include a
330+requirement to continue to provide support service, warranty, or updates
331+for a work that has been modified or installed by the recipient, or for
332+the User Product in which it has been modified or installed. Access to a
333+network may be denied when the modification itself materially and
334+adversely affects the operation of the network or violates the rules and
335+protocols for communication across the network.
336+
337+ Corresponding Source conveyed, and Installation Information provided,
338+in accord with this section must be in a format that is publicly
339+documented (and with an implementation available to the public in
340+source code form), and must require no special password or key for
341+unpacking, reading or copying.
342+
343+ 7. Additional Terms.
344+
345+ "Additional permissions" are terms that supplement the terms of this
346+License by making exceptions from one or more of its conditions.
347+Additional permissions that are applicable to the entire Program shall
348+be treated as though they were included in this License, to the extent
349+that they are valid under applicable law. If additional permissions
350+apply only to part of the Program, that part may be used separately
351+under those permissions, but the entire Program remains governed by
352+this License without regard to the additional permissions.
353+
354+ When you convey a copy of a covered work, you may at your option
355+remove any additional permissions from that copy, or from any part of
356+it. (Additional permissions may be written to require their own
357+removal in certain cases when you modify the work.) You may place
358+additional permissions on material, added by you to a covered work,
359+for which you have or can give appropriate copyright permission.
360+
361+ Notwithstanding any other provision of this License, for material you
362+add to a covered work, you may (if authorized by the copyright holders of
363+that material) supplement the terms of this License with terms:
364+
365+ a) Disclaiming warranty or limiting liability differently from the
366+ terms of sections 15 and 16 of this License; or
367+
368+ b) Requiring preservation of specified reasonable legal notices or
369+ author attributions in that material or in the Appropriate Legal
370+ Notices displayed by works containing it; or
371+
372+ c) Prohibiting misrepresentation of the origin of that material, or
373+ requiring that modified versions of such material be marked in
374+ reasonable ways as different from the original version; or
375+
376+ d) Limiting the use for publicity purposes of names of licensors or
377+ authors of the material; or
378+
379+ e) Declining to grant rights under trademark law for use of some
380+ trade names, trademarks, or service marks; or
381+
382+ f) Requiring indemnification of licensors and authors of that
383+ material by anyone who conveys the material (or modified versions of
384+ it) with contractual assumptions of liability to the recipient, for
385+ any liability that these contractual assumptions directly impose on
386+ those licensors and authors.
387+
388+ All other non-permissive additional terms are considered "further
389+restrictions" within the meaning of section 10. If the Program as you
390+received it, or any part of it, contains a notice stating that it is
391+governed by this License along with a term that is a further
392+restriction, you may remove that term. If a license document contains
393+a further restriction but permits relicensing or conveying under this
394+License, you may add to a covered work material governed by the terms
395+of that license document, provided that the further restriction does
396+not survive such relicensing or conveying.
397+
398+ If you add terms to a covered work in accord with this section, you
399+must place, in the relevant source files, a statement of the
400+additional terms that apply to those files, or a notice indicating
401+where to find the applicable terms.
402+
403+ Additional terms, permissive or non-permissive, may be stated in the
404+form of a separately written license, or stated as exceptions;
405+the above requirements apply either way.
406+
407+ 8. Termination.
408+
409+ You may not propagate or modify a covered work except as expressly
410+provided under this License. Any attempt otherwise to propagate or
411+modify it is void, and will automatically terminate your rights under
412+this License (including any patent licenses granted under the third
413+paragraph of section 11).
414+
415+ However, if you cease all violation of this License, then your
416+license from a particular copyright holder is reinstated (a)
417+provisionally, unless and until the copyright holder explicitly and
418+finally terminates your license, and (b) permanently, if the copyright
419+holder fails to notify you of the violation by some reasonable means
420+prior to 60 days after the cessation.
421+
422+ Moreover, your license from a particular copyright holder is
423+reinstated permanently if the copyright holder notifies you of the
424+violation by some reasonable means, this is the first time you have
425+received notice of violation of this License (for any work) from that
426+copyright holder, and you cure the violation prior to 30 days after
427+your receipt of the notice.
428+
429+ Termination of your rights under this section does not terminate the
430+licenses of parties who have received copies or rights from you under
431+this License. If your rights have been terminated and not permanently
432+reinstated, you do not qualify to receive new licenses for the same
433+material under section 10.
434+
435+ 9. Acceptance Not Required for Having Copies.
436+
437+ You are not required to accept this License in order to receive or
438+run a copy of the Program. Ancillary propagation of a covered work
439+occurring solely as a consequence of using peer-to-peer transmission
440+to receive a copy likewise does not require acceptance. However,
441+nothing other than this License grants you permission to propagate or
442+modify any covered work. These actions infringe copyright if you do
443+not accept this License. Therefore, by modifying or propagating a
444+covered work, you indicate your acceptance of this License to do so.
445+
446+ 10. Automatic Licensing of Downstream Recipients.
447+
448+ Each time you convey a covered work, the recipient automatically
449+receives a license from the original licensors, to run, modify and
450+propagate that work, subject to this License. You are not responsible
451+for enforcing compliance by third parties with this License.
452+
453+ An "entity transaction" is a transaction transferring control of an
454+organization, or substantially all assets of one, or subdividing an
455+organization, or merging organizations. If propagation of a covered
456+work results from an entity transaction, each party to that
457+transaction who receives a copy of the work also receives whatever
458+licenses to the work the party's predecessor in interest had or could
459+give under the previous paragraph, plus a right to possession of the
460+Corresponding Source of the work from the predecessor in interest, if
461+the predecessor has it or can get it with reasonable efforts.
462+
463+ You may not impose any further restrictions on the exercise of the
464+rights granted or affirmed under this License. For example, you may
465+not impose a license fee, royalty, or other charge for exercise of
466+rights granted under this License, and you may not initiate litigation
467+(including a cross-claim or counterclaim in a lawsuit) alleging that
468+any patent claim is infringed by making, using, selling, offering for
469+sale, or importing the Program or any portion of it.
470+
471+ 11. Patents.
472+
473+ A "contributor" is a copyright holder who authorizes use under this
474+License of the Program or a work on which the Program is based. The
475+work thus licensed is called the contributor's "contributor version".
476+
477+ A contributor's "essential patent claims" are all patent claims
478+owned or controlled by the contributor, whether already acquired or
479+hereafter acquired, that would be infringed by some manner, permitted
480+by this License, of making, using, or selling its contributor version,
481+but do not include claims that would be infringed only as a
482+consequence of further modification of the contributor version. For
483+purposes of this definition, "control" includes the right to grant
484+patent sublicenses in a manner consistent with the requirements of
485+this License.
486+
487+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488+patent license under the contributor's essential patent claims, to
489+make, use, sell, offer for sale, import and otherwise run, modify and
490+propagate the contents of its contributor version.
491+
492+ In the following three paragraphs, a "patent license" is any express
493+agreement or commitment, however denominated, not to enforce a patent
494+(such as an express permission to practice a patent or covenant not to
495+sue for patent infringement). To "grant" such a patent license to a
496+party means to make such an agreement or commitment not to enforce a
497+patent against the party.
498+
499+ If you convey a covered work, knowingly relying on a patent license,
500+and the Corresponding Source of the work is not available for anyone
501+to copy, free of charge and under the terms of this License, through a
502+publicly available network server or other readily accessible means,
503+then you must either (1) cause the Corresponding Source to be so
504+available, or (2) arrange to deprive yourself of the benefit of the
505+patent license for this particular work, or (3) arrange, in a manner
506+consistent with the requirements of this License, to extend the patent
507+license to downstream recipients. "Knowingly relying" means you have
508+actual knowledge that, but for the patent license, your conveying the
509+covered work in a country, or your recipient's use of the covered work
510+in a country, would infringe one or more identifiable patents in that
511+country that you have reason to believe are valid.
512+
513+ If, pursuant to or in connection with a single transaction or
514+arrangement, you convey, or propagate by procuring conveyance of, a
515+covered work, and grant a patent license to some of the parties
516+receiving the covered work authorizing them to use, propagate, modify
517+or convey a specific copy of the covered work, then the patent license
518+you grant is automatically extended to all recipients of the covered
519+work and works based on it.
520+
521+ A patent license is "discriminatory" if it does not include within
522+the scope of its coverage, prohibits the exercise of, or is
523+conditioned on the non-exercise of one or more of the rights that are
524+specifically granted under this License. You may not convey a covered
525+work if you are a party to an arrangement with a third party that is
526+in the business of distributing software, under which you make payment
527+to the third party based on the extent of your activity of conveying
528+the work, and under which the third party grants, to any of the
529+parties who would receive the covered work from you, a discriminatory
530+patent license (a) in connection with copies of the covered work
531+conveyed by you (or copies made from those copies), or (b) primarily
532+for and in connection with specific products or compilations that
533+contain the covered work, unless you entered into that arrangement,
534+or that patent license was granted, prior to 28 March 2007.
535+
536+ Nothing in this License shall be construed as excluding or limiting
537+any implied license or other defenses to infringement that may
538+otherwise be available to you under applicable patent law.
539+
540+ 12. No Surrender of Others' Freedom.
541+
542+ If conditions are imposed on you (whether by court order, agreement or
543+otherwise) that contradict the conditions of this License, they do not
544+excuse you from the conditions of this License. If you cannot convey a
545+covered work so as to satisfy simultaneously your obligations under this
546+License and any other pertinent obligations, then as a consequence you may
547+not convey it at all. For example, if you agree to terms that obligate you
548+to collect a royalty for further conveying from those to whom you convey
549+the Program, the only way you could satisfy both those terms and this
550+License would be to refrain entirely from conveying the Program.
551+
552+ 13. Use with the GNU Affero General Public License.
553+
554+ Notwithstanding any other provision of this License, you have
555+permission to link or combine any covered work with a work licensed
556+under version 3 of the GNU Affero General Public License into a single
557+combined work, and to convey the resulting work. The terms of this
558+License will continue to apply to the part which is the covered work,
559+but the special requirements of the GNU Affero General Public License,
560+section 13, concerning interaction through a network will apply to the
561+combination as such.
562+
563+ 14. Revised Versions of this License.
564+
565+ The Free Software Foundation may publish revised and/or new versions of
566+the GNU General Public License from time to time. Such new versions will
567+be similar in spirit to the present version, but may differ in detail to
568+address new problems or concerns.
569+
570+ Each version is given a distinguishing version number. If the
571+Program specifies that a certain numbered version of the GNU General
572+Public License "or any later version" applies to it, you have the
573+option of following the terms and conditions either of that numbered
574+version or of any later version published by the Free Software
575+Foundation. If the Program does not specify a version number of the
576+GNU General Public License, you may choose any version ever published
577+by the Free Software Foundation.
578+
579+ If the Program specifies that a proxy can decide which future
580+versions of the GNU General Public License can be used, that proxy's
581+public statement of acceptance of a version permanently authorizes you
582+to choose that version for the Program.
583+
584+ Later license versions may give you additional or different
585+permissions. However, no additional obligations are imposed on any
586+author or copyright holder as a result of your choosing to follow a
587+later version.
588+
589+ 15. Disclaimer of Warranty.
590+
591+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599+
600+ 16. Limitation of Liability.
601+
602+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610+SUCH DAMAGES.
611+
612+ 17. Interpretation of Sections 15 and 16.
613+
614+ If the disclaimer of warranty and limitation of liability provided
615+above cannot be given local legal effect according to their terms,
616+reviewing courts shall apply local law that most closely approximates
617+an absolute waiver of all civil liability in connection with the
618+Program, unless a warranty or assumption of liability accompanies a
619+copy of the Program in return for a fee.
620+
621+ END OF TERMS AND CONDITIONS
622+
623+ How to Apply These Terms to Your New Programs
624+
625+ If you develop a new program, and you want it to be of the greatest
626+possible use to the public, the best way to achieve this is to make it
627+free software which everyone can redistribute and change under these terms.
628+
629+ To do so, attach the following notices to the program. It is safest
630+to attach them to the start of each source file to most effectively
631+state the exclusion of warranty; and each file should have at least
632+the "copyright" line and a pointer to where the full notice is found.
633+
634+ <one line to give the program's name and a brief idea of what it does.>
635+ Copyright (C) <year> <name of author>
636+
637+ This program is free software: you can redistribute it and/or modify
638+ it under the terms of the GNU General Public License as published by
639+ the Free Software Foundation, either version 3 of the License, or
640+ (at your option) any later version.
641+
642+ This program is distributed in the hope that it will be useful,
643+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645+ GNU General Public License for more details.
646+
647+ You should have received a copy of the GNU General Public License
648+ along with this program. If not, see <http://www.gnu.org/licenses/>.
649+
650+Also add information on how to contact you by electronic and paper mail.
651+
652+ If the program does terminal interaction, make it output a short
653+notice like this when it starts in an interactive mode:
654+
655+ <program> Copyright (C) <year> <name of author>
656+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657+ This is free software, and you are welcome to redistribute it
658+ under certain conditions; type `show c' for details.
659+
660+The hypothetical commands `show w' and `show c' should show the appropriate
661+parts of the General Public License. Of course, your program's commands
662+might be different; for a GUI interface, you would use an "about box".
663+
664+ You should also get your employer (if you work as a programmer) or school,
665+if any, to sign a "copyright disclaimer" for the program, if necessary.
666+For more information on this, and how to apply and follow the GNU GPL, see
667+<http://www.gnu.org/licenses/>.
668+
669+ The GNU General Public License does not permit incorporating your program
670+into proprietary programs. If your program is a subroutine library, you
671+may consider it more useful to permit linking proprietary applications with
672+the library. If this is what you want to do, use the GNU Lesser General
673+Public License instead of this License. But first, please read
674+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
--- tags/0.1.20100912/readme.txt (revision 0)
+++ tags/0.1.20100912/readme.txt (revision 7)
@@ -0,0 +1,21 @@
1+pxv: A pixiv API wrapper for Java (version 0.1)
2+=================================
3+
4+概要
5+---------------------------------
6+イラストコミュニケーションサービス pixiv の API を Java から利用するためのライブラリです.
7+リファレンスは添付の Javadoc をご覧下さい.
8+またリファレンスのオンライン版は http://pxv.sourceforge.jp/javadoc/ から閲覧することができます.
9+
10+
11+ライセンス
12+---------------------------------------
13+本ソフトウェアは、GNU Lesser General Public License (GNU LGPL) バージョン 3 のもとで配布されています.
14+
15+このプログラムはフリーソフトウェアです.
16+あなたはこれを,フリーソフトウェア財団によって発行された GNU Lesser General Public License
17+(バージョン3か、それ以降のバージョンのうちどれか) が定める条件の下で再頒布または改変することができます.
18+
19+このプログラムは有用であることを願って頒布されますが,全くの無保証です.
20+商業可能性の保証や特定目的への適合性は,言外に示されたものも含め,全く存在しません.
21+詳しくは GNU Lesser General Public License をご覧ください.
\ No newline at end of file
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Show on old repository browser