nicoscraper 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+