nicoscraper 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift File.dirname(__FILE__)
3
+
4
+ require 'rubygems'
5
+ require 'xml'
6
+ require 'time'
7
+
8
+ module Nicos
9
+ module Converter
10
+ def iso8601ToUnix(str)
11
+ Time.strptime(str, "%Y-%m-%dT%H:%M:%S").to_i
12
+ end
13
+ module_function :iso8601ToUnix
14
+
15
+ def japToUnix(str)
16
+ str.gsub!(/年|月/, '-')
17
+ .gsub!(/日/, 'T')
18
+ .gsub!(/:/, ':')
19
+ .gsub!(/\s/, '')
20
+ iso8601ToUnix(str)
21
+ end
22
+ module_function :japToUnix
23
+
24
+ def toSeconds(lengthStr)
25
+ # lengthStr = "mm:ss"
26
+ lengthStr = lengthStr.split(/\:/)
27
+ lengthStr[0].to_i * 60 + lengthStr[1].to_i
28
+ end
29
+ module_function :toSeconds
30
+
31
+ def commaRemover(str)
32
+ str.gsub(/\,/, '').to_i
33
+ end
34
+ module_function :commaRemover
35
+ end
36
+
37
+ module Extractor
38
+ def mylistId(str)
39
+ /(mylist\/)([0-9]{1,})/ =~ str
40
+ $2.to_i
41
+ end
42
+ module_function :mylistId
43
+
44
+ def itemId(str)
45
+ /(watch\/)([0-9]{1,})/ =~ str
46
+ $2.to_i
47
+ end
48
+ module_function :itemId
49
+
50
+ def videoId(str)
51
+ /(http:\/\/www.nicovideo.jp\/watch\/)((sm|nm)[0-9]{1,})/ =~ str
52
+ $2
53
+ end
54
+ module_function :videoId
55
+ end
56
+
57
+ module Nicos::Unicode
58
+ def escape(str)
59
+ ary = str.unpack("U*").map!{|i| "\\u#{i.to_s(16)}"}
60
+ ary.join
61
+ end
62
+
63
+ UNESCAPE_WORKER_ARRAY = []
64
+ def unescape(str)
65
+ str.gsub(/\\u([0-9a-f]{4})/) {
66
+ UNESCAPE_WORKER_ARRAY[0] = $1.hex
67
+ UNESCAPE_WORKER_ARRAY.pack("U")
68
+ }
69
+ end
70
+
71
+ module_function :escape, :unescape
72
+ end
73
+ end
@@ -0,0 +1,9 @@
1
+ module Nicos
2
+ module Connector
3
+ HEADER = {
4
+ "user-agent" => "NicoScraper v " +
5
+ VERSION +
6
+ REPOSITORY
7
+ }
8
+ end
9
+ end
@@ -0,0 +1,521 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.unshift File.dirname(__FILE__)
3
+
4
+ require 'rubygems'
5
+ require 'ruby-debug'
6
+ require 'damerau-levenshtein'
7
+ require 'kconv'
8
+
9
+ require 'parser.rb'
10
+ require 'mylist.rb'
11
+ require 'connector.rb'
12
+
13
+
14
+ module Nicos
15
+ class Movie
16
+ # @param [video_id] video_id 動画ID
17
+ # インスタンス作成直後は、情報を取得しメソッドを実行する準備が整ったことを示す
18
+ # @availableがfalseである。getInfo等で情報を取得するか、あるいはsetメソッドで
19
+ # availableにtrueを代入する必要がある。
20
+ def initialize(video_id)
21
+ @video_id = video_id
22
+ @available = false
23
+ end
24
+
25
+ public
26
+
27
+ # 指定されたマイリストに自分が入っていれば、真を返す。
28
+ #
29
+ # 内部的にMylist::getInfoを利用しているため、もし指定したマイリストの他の情報を使いたければ、
30
+ # ブロック中に処理を記述することで、getInfoの取得結果を共用することができる。
31
+ # @param [Fixnum] mylistId マイリストID
32
+ # @return [Boolean]
33
+ def isBelongsTo (mylistId, &block)
34
+ isBelongs = false
35
+ thisMl = Nicos::Mylist.new(mylistId)
36
+ thisMl.getInfo
37
+
38
+ thisMl.movies.each { |movie|
39
+ isBelongs = true if movie.video_id == @video_id
40
+ }
41
+
42
+ if isBelongs
43
+ puts "\sThis movie is found in mylist/" +
44
+ mylistId.to_s
45
+ else
46
+ puts "\sThis movie is not found in mylist/" +
47
+ mylistId.to_s
48
+ end
49
+
50
+ block.call(thisMl) if block != nil
51
+ isBelongs
52
+ end
53
+
54
+ # 自分が含まれる、投稿者の作ったシリーズとしてまとめているマイリストのIDを返す。
55
+ #
56
+ # isBelongsは指定されたマイリストとの関係を調べるが、isSeriesOfは動画説明文中のマイリストIDのみを用いる。
57
+ # @return [Fixnum] マイリストID
58
+ def isSeriesOf
59
+ if !@available then
60
+ puts "This movie object is not available."
61
+ return "failed"
62
+ end
63
+
64
+ puts
65
+ puts "Start to discern the seriality of..."
66
+ puts "\svideo_id:\s\s" + @video_id
67
+ puts "\stitle:\s\s\s\s\s" + @title
68
+ # extrMylist呼び出し
69
+ mylistIdAry = extrMylist
70
+ sMylistIdAry = []
71
+ mlObjAry = []
72
+ mylistId = nil
73
+ mylist = nil
74
+ similarity = 0.0
75
+
76
+ mylistIdAry.each { |_mylistId|
77
+ belongsTo = isBelongsTo(_mylistId) { |mylistObj|
78
+ similarity = mylistObj.getSimilarity
79
+ puts "\sSimilarity:\t" + similarity.to_s
80
+ }
81
+ puts belongsTo
82
+ if belongsTo && similarity > 0.7
83
+ puts "\s" + _mylistId.to_s + "\tis perecieved as series mylist."
84
+ sMylistIdAry.push(_mylistId)
85
+ end
86
+ }
87
+
88
+ sMylistIdAry.each { |mylistId|
89
+ mlObjAry.push( Nicos::Mylist.new(mylistId) )
90
+ }
91
+
92
+ puts "\sDiscern logic terminated."
93
+ mlObjAry
94
+ end
95
+
96
+ # 動画説明文中からマイリストIDを示す文字列を抽出し、配列として返す。
97
+ #
98
+ # @return [Array] マイリストIDを含む配列
99
+ def extrMylist
100
+ return if !@available
101
+ puts "Extracting mylistId from the description..."
102
+
103
+ mylistIdAry = []
104
+ extracted = @description.scan(/mylist\/[0-9]{1,8}/)
105
+ if extracted[0] != nil
106
+ extracted.each { |e|
107
+ id = e.scan(/[0-9]{1,8}/)[0]
108
+ mylistIdAry.push(id)
109
+ puts "\sID:\t" + id + " is extracted."
110
+ }
111
+ else
112
+ puts "\sMylistId is not found."
113
+ end
114
+
115
+ mylistIdAry
116
+ end
117
+
118
+ # 動画の詳細な情報を取得し、インスタンス変数に納める。
119
+ #
120
+ # 内部的にgetThumbInfo APIを利用。
121
+ # @return [Boolean] 成功すればtrueを返す。
122
+ def getInfo
123
+ con = Nicos::Connector::GetThumbInfo.new()
124
+ host = 'ext.nicovideo.jp'
125
+ entity = '/api/getthumbinfo/' + @video_id
126
+ result = con.get(host, entity)
127
+
128
+ if
129
+ result["order"] == "success"
130
+ then
131
+ parsed = Nicos::Parser::getThumbInfo(result["body"])
132
+ set(parsed)
133
+ @available = true
134
+ else
135
+ @available = false
136
+ end
137
+ end
138
+
139
+ # インスタンスに対し、任意の情報を入れる。
140
+ #
141
+ # @param [HashObj] paramObj getThumbInfo等から手に入れたハッシュ
142
+ # getInfo等を利用せずインスタンス変数に直接情報を入れる場合、もしgetThumbInfoやMylist APIからXMLやJSONで取得し、
143
+ # 特にキー名を変更していないハッシュオブジェクトがあるのであれば、setメソッドで一括代入することができる。
144
+ #
145
+ # なお、getThumbInfoや、マイリストAtomフィードなどの情報は、取得元になるXML等のタグ名が少しずつ異なるため、
146
+ # setメソッドに渡すべきハッシュオブジェクトのキー名は、必ずしもインスタンス変数の名前とは一致しない。
147
+ # 例えば、getThumbInfoは現在のコメント数をcomment_numというタグで示すが、
148
+ # マイリストのAtomフィードはnico-numbers-resというクラス名のタグで囲んでいる。
149
+ def set(paramObj)
150
+ paramObj.each_key { |key|
151
+ param = paramObj[key]
152
+ case key
153
+ when "available"
154
+ @available = param
155
+
156
+ # common
157
+ when "video_id"
158
+ @video_id = param.to_s
159
+ when "item_id"
160
+ @item_id = param.to_i
161
+ when "title"
162
+ @title = param.to_s
163
+ when "mylist_id"
164
+ @mylist_id = param.to_i
165
+ when "description"
166
+ @description = param.to_s
167
+ when "length"
168
+ @length = param.to_i
169
+ when "first_retrieve"
170
+ @first_retrieve = param
171
+
172
+ # MylistAPI 現在未実装
173
+ when "item_data"
174
+ paramObj['item_data'].each_key { |key|
175
+ param = paramObj['item_data'][key]
176
+ case key
177
+ when "video_id"
178
+ @video_id = param.to_s
179
+ when "title"
180
+ @title = param.to_s
181
+ when "thumbnail_url"
182
+ @thumbnail_url = param.to_s
183
+ when "first_retrieve"
184
+ @first_retrieve = param.to_i
185
+ when "update_time"
186
+ @update_time = param.to_i
187
+ when "view_counter"
188
+ @view_counter = param.to_i
189
+ when "mylist_counter"
190
+ @mylist_counter = param.to_i
191
+ when "num_res"
192
+ @comment_num = param.to_i
193
+ when "length_seconds"
194
+ @length = param.to_i
195
+ when "deleted"
196
+ @deleted = param.to_i
197
+ when "last_res_body"
198
+ @last_res_body = param.to_s
199
+ end
200
+ }
201
+ when "watch"
202
+ @watch = param.to_i
203
+ when "create_time"
204
+ @create_time = param.to_i
205
+ when "update_time"
206
+ @update_time = param.to_i
207
+
208
+ # Mylist-Atom
209
+ when "memo"
210
+ @memo = param.to_s
211
+ when "published"
212
+ @create_time = param.to_i
213
+ when "updated"
214
+ @update_time = param.to_i
215
+ when "view"
216
+ @view_counter = param.to_i
217
+ when "mylist"
218
+ @mylist_counter = param.to_i
219
+ when "res"
220
+ @comment_num = param.to_i
221
+
222
+ # getThumbInfo
223
+ when "thumbnail_url"
224
+ @thumbnail_url = param.to_s
225
+ when "movie_type"
226
+ @movie_type = param.to_s
227
+ when "size_high"
228
+ @size_high = param.to_i
229
+ when "size_low"
230
+ @size_low = param.to_i
231
+ when "view_counter"
232
+ @view_counter = param.to_i
233
+ when "mylist_counter"
234
+ @mylist_counter = param.to_i
235
+ when "comment_num"
236
+ @comment_num = param.to_i
237
+ when "last_res_body"
238
+ @last_res_body = param.to_s
239
+ when "watch_url"
240
+ @watch_url = param.to_s
241
+ when "thumb_type"
242
+ @thumb_type = param.to_s
243
+ when "embeddable"
244
+ @embeddable = param.to_i
245
+ when "no_live_play"
246
+ @no_live_play = param.to_i
247
+ when "tags_jp"
248
+ @tags_jp = param
249
+ when "tags_tw"
250
+ @tags_tw = param
251
+ when "tags_de"
252
+ @tags_de = param
253
+ when "tags_es"
254
+ @tags_sp = param
255
+ when "user_id"
256
+ @user_id = param.to_i
257
+ end
258
+ }
259
+ end
260
+
261
+ include Nicos::Connector::SetWait
262
+
263
+ # このインスタンスがgetInfo等によって正常に情報を取得できている場合、trueとなる。
264
+ # 各種メソッドの実行には、これがtrueであることが要求される。
265
+ #
266
+ # @return [Boolean]
267
+ attr_accessor :available
268
+
269
+ # MylistAPI
270
+
271
+ # 動画に付与される、sm|nmで始まる一意のID
272
+ #
273
+ # @return [String]
274
+ # <b>取得可能なメソッド</b>
275
+ # {Nicos::Movie#getInfo Movie::getInfo}
276
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
277
+ # {Nicos::Movie#getInfo Mylist::getInfo}
278
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
279
+ attr_accessor :video_id
280
+
281
+ # この動画が属するマイリストのID
282
+ #
283
+ # @return [Fixnum]
284
+ # <b>取得可能なメソッド</b>
285
+ # {Nicos::Movie#getInfo Movie::getInfo}
286
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
287
+ # {Nicos::Movie#getInfo Mylist::getInfo}
288
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
289
+ attr_accessor :mylist_id
290
+
291
+ # 動画に与えられるもう一つの一意なIDであり、投稿日時と同じか非常に近いUNIX時間になっている。
292
+ #
293
+ # 例えば、"【初音ミク】みくみくにしてあげる♪【してやんよ】"の動画IDはsm1097445であり、アイテムIDは1190218917である。このアイテムIDを日時に直すと、日本時間における2007年9月20日 1:21:57となるが、動画に投稿日時として表示されるのは、2007年9月20日 1:22:02である。
294
+ #
295
+ # @return [Fixnum]
296
+ # <b>取得可能なメソッド</b>
297
+ # {Nicos::Movie#getInfo Movie::getInfo}
298
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
299
+ # {Nicos::Movie#getInfo Mylist::getInfo}
300
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
301
+ attr_accessor :item_id
302
+
303
+ # 投稿者が記述した動画の説明文
304
+ #
305
+ # @return [String]
306
+ # <b>取得可能なメソッド</b>
307
+ # {Nicos::Movie#getInfo Movie::getInfo}
308
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
309
+ # {Nicos::Movie#getInfo Mylist::getInfo}
310
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
311
+ attr_accessor :description
312
+
313
+ # 動画のタイトル
314
+ #
315
+ # @return [String]
316
+ # <b>取得可能なメソッド</b>
317
+ # {Nicos::Movie#getInfo Movie::getInfo}
318
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
319
+ # {Nicos::Movie#getInfo Mylist::getInfo}
320
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
321
+ attr_accessor :title
322
+
323
+ # サムネイルのURL
324
+ #
325
+ # @return [String]
326
+ # <b>取得可能なメソッド</b>
327
+ # {Nicos::Movie#getInfo Movie::getInfo}
328
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
329
+ # {Nicos::Movie#getInfo Mylist::getInfo}
330
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
331
+ attr_accessor :thumbnail_url
332
+
333
+ # 動画の投稿日
334
+ #
335
+ # @return [Fixnum]
336
+ # <b>取得可能なメソッド</b>
337
+ # {Nicos::Movie#getInfo Movie::getInfo}
338
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
339
+ # {Nicos::Movie#getInfo Mylist::getInfo}
340
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
341
+ attr_accessor :first_retrieve
342
+
343
+ # 取得時の再生数
344
+ #
345
+ # @return [Fixnum]
346
+ # <b>取得可能なメソッド</b>
347
+ # {Nicos::Movie#getInfo Movie::getInfo}
348
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
349
+ # {Nicos::Movie#getInfo Mylist::getInfo}
350
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
351
+ attr_accessor :view_counter
352
+
353
+ # 取得時のマイリスト数
354
+ #
355
+ # @return [Fixnum]
356
+ # <b>取得可能なメソッド</b>
357
+ # {Nicos::Movie#getInfo Movie::getInfo}
358
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
359
+ # {Nicos::Movie#getInfo Mylist::getInfo}
360
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
361
+ attr_accessor :mylist_counter
362
+
363
+ # 取得時のコメント数
364
+ #
365
+ # @return [Fixnum]
366
+ # <b>取得可能なメソッド</b>
367
+ # {Nicos::Movie#getInfo Movie::getInfo}
368
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
369
+ # {Nicos::Movie#getInfo Mylist::getInfo}
370
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
371
+ attr_accessor :comment_num
372
+
373
+ # 動画の長さ(秒)
374
+ #
375
+ # @return [Fixnum]
376
+ # <b>取得可能なメソッド</b>
377
+ # {Nicos::Movie#getInfo Movie::getInfo}
378
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
379
+ # {Nicos::Movie#getInfo Mylist::getInfo}
380
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
381
+ attr_accessor :length
382
+
383
+ # 削除されたかどうか。削除済みの場合は1、そうでなければ0。
384
+ #
385
+ # @return [Fixnum]
386
+ # <b>取得可能なメソッド</b>
387
+ # {Nicos::Movie#getInfo Movie::getInfo}
388
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
389
+ # {Nicos::Movie#getInfo Mylist::getInfo}
390
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
391
+ attr_accessor :deleted
392
+
393
+ # 最新のコメント
394
+ #
395
+ # @return [String]
396
+ # <b>取得可能なメソッド</b>
397
+ # {Nicos::Movie#getInfo Movie::getInfo}
398
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
399
+ # {Nicos::Movie#getInfo Mylist::getInfo}
400
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
401
+ attr_accessor :last_res_body
402
+
403
+ # ?
404
+ #
405
+ # @return [String]
406
+ # <b>取得可能なメソッド</b>
407
+ # {Nicos::Movie#getInfo Movie::getInfo}
408
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
409
+ # {Nicos::Movie#getInfo Mylist::getInfo}
410
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
411
+ attr_accessor :watch
412
+
413
+ # 動画の投稿日に近いが、若干こちらの方が遅い。詳細不明。
414
+ #
415
+ # マイリストHTML中JSオブジェクトの"create_time"、マイリストAtomフィードにおける<published>に対応。
416
+ #
417
+ # @return [Fixnum]
418
+ # <b>取得可能なメソッド</b>
419
+ # {Nicos::Movie#getInfo Mylist::getInfo}
420
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
421
+ attr_accessor :create_time
422
+
423
+ # 動画の更新日?
424
+ #
425
+ # マイリストHTML中JSオブジェクトの"update_time"、マイリストAtomフィードにおける<updated>に対応。
426
+ #
427
+ # @return [Fixnum]
428
+ # <b>取得可能なメソッド</b>
429
+ # {Nicos::Movie#getInfo Mylist::getInfo}
430
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
431
+ attr_accessor :update_time
432
+ # MylistAPI-Atom
433
+
434
+ # マイリストの動画紹介欄に記載される説明文
435
+ #
436
+ # @return [String]
437
+ # <b>取得可能なメソッド</b>
438
+ # {Nicos::Movie#getInfo Movie::getInfo}
439
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
440
+ # {Nicos::Movie#getInfo Mylist::getInfo}
441
+ # {Nicos::Movie#getInfo Mylist::getHtmlInfo}
442
+ attr_accessor :memo
443
+
444
+
445
+ # getThumbInfo
446
+
447
+ # 動画ファイルの種類。
448
+ #
449
+ # @return [String]
450
+ # <b>取得可能なメソッド</b>
451
+ # {Nicos::Movie#getInfo Movie::getInfo}
452
+ attr_accessor :movie_type
453
+
454
+ # 高画質時の動画サイズ?
455
+ #
456
+ # @return [Fixnum]
457
+ # <b>取得可能なメソッド</b>
458
+ # {Nicos::Movie#getInfo Movie::getInfo}
459
+ attr_accessor :size_high
460
+
461
+ # 低画質時の動画サイズ?
462
+ #
463
+ # @return [Fixnum]
464
+ # <b>取得可能なメソッド</b>
465
+ # {Nicos::Movie#getInfo Movie::getInfo}
466
+ attr_accessor :size_low
467
+
468
+ # 動画の閲覧URL
469
+ #
470
+ # @return [String]
471
+ # <b>取得可能なメソッド</b>
472
+ # {Nicos::Movie#getInfo Movie::getInfo}
473
+ attr_accessor :watch_url
474
+
475
+ # ?
476
+ #
477
+ # @return [String]
478
+ # <b>取得可能なメソッド</b>
479
+ # {Nicos::Movie#getInfo Movie::getInfo}
480
+ attr_accessor :thumb_type
481
+
482
+ # ブログ等に埋め込み、ログインなしでも閲覧できるかどうか。可能なら1。
483
+ #
484
+ # @return [Fixnum]
485
+ # <b>取得可能なメソッド</b>
486
+ # {Nicos::Movie#getInfo Movie::getInfo}
487
+ attr_accessor :embeddable
488
+
489
+ # ニコニコ生放送の拒否?
490
+ #
491
+ # @return [Fixnum]
492
+ # <b>取得可能なメソッド</b>
493
+ # {Nicos::Movie#getInfo Movie::getInfo}
494
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
495
+ attr_accessor :no_live_play
496
+
497
+ # 日本語タグ
498
+ #
499
+ # @return [Array<String>]
500
+ # <b>取得可能なメソッド</b>
501
+ # {Nicos::Movie#getInfo Movie::getInfo}
502
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
503
+ attr_accessor :tags_jp
504
+
505
+ # 台湾タグ
506
+ #
507
+ # @return [Array<String>]
508
+ # <b>取得可能なメソッド</b>
509
+ # {Nicos::Movie#getInfo Movie::getInfo}
510
+ attr_accessor :tags_tw
511
+
512
+ # ユーザID
513
+ #
514
+ # @return [Fixnum]
515
+ # <b>取得可能なメソッド</b>
516
+ # {Nicos::Movie#getInfo Movie::getInfo}
517
+ # {Nicos::Movie#getInfo Movie::getHtmlInfo}
518
+ attr_accessor :user_id
519
+ end
520
+ end
521
+