niconico 1.0.0

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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "mechanize"
4
+
5
+ # Specify your gem's dependencies in niconico.gemspec
6
+ gemspec
data/README.mkd ADDED
@@ -0,0 +1,23 @@
1
+ # Niconico - yet another nicovideo.gem
2
+
3
+ ## Description
4
+
5
+ Wrapper of `Mechanize`, optimized for <http://www.nicovideo.jp/>.
6
+
7
+ ## Feature
8
+
9
+ * Login to nicovideo
10
+ * Retrive a ranking page
11
+ * Download a video
12
+
13
+ ## Requirements
14
+
15
+ * Ruby 1.9+ (1.9.2+ is supported)
16
+
17
+ ## Install
18
+
19
+ $ gem install niconico
20
+
21
+ ## Author
22
+
23
+ * Shota Fukumori (sora\_h)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/lib/niconico.rb ADDED
@@ -0,0 +1,43 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'mechanize'
5
+ require 'cgi'
6
+
7
+ class Niconico
8
+ URL = {
9
+ login: 'https://secure.nicovideo.jp/secure/login?site=niconico',
10
+ watch: 'http://www.nicovideo.jp/watch/',
11
+ getflv: 'http://www.nicovideo.jp/api/getflv'
12
+ }
13
+
14
+ TEST_VIDEO_ID = "sm9"
15
+
16
+ attr_reader :agent, :logined
17
+
18
+ def initialize(mail, pass)
19
+ @mail = mail
20
+ @pass = pass
21
+
22
+ @logined = false
23
+
24
+ @agent = Mechanize.new
25
+ end
26
+
27
+ def login(force=false)
28
+ return false if !force && @logined
29
+
30
+ page = @agent.post(URL[:login], 'mail' => @mail, 'password' => @pass)
31
+
32
+ raise LoginError, "Failed to login (x-niconico-authflag is 0)" if page.header["x-niconico-authflag"] == '0'
33
+ @logined = true
34
+ end
35
+
36
+ def inspect
37
+ "#<Niconico: #{@mail} (#{@logined ? "" : "not "}logined)>"
38
+ end
39
+ class LoginError < StandardError; end
40
+ end
41
+
42
+ require_relative './niconico/video'
43
+ require_relative './niconico/ranking'
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Niconico
4
+ # options[:span] -> :hourly, :daily, :weekly, :monthly, :total
5
+ # or -> :hour, :day, :week, :month, :all
6
+ # default: daily
7
+ #
8
+ # options[:method] -> :fav, :view, :comment, :mylist
9
+ # (or :all) (or :res)
10
+ def ranking(category, options={})
11
+ login unless @logined
12
+
13
+ span = options[:span] || :daily
14
+ span = :hourly if span == :hour
15
+ span = :daily if span == :day
16
+ span = :weekly if span == :week
17
+ span = :monthly if span == :month
18
+ span = :total if span == :all
19
+
20
+ method = options[:method] || :fav
21
+ method = :res if method == :comment
22
+ method = :fav if method == :all
23
+
24
+ page = @agent.get(url = "http://www.nicovideo.jp/ranking/#{method}/#{span}/#{category}")
25
+ page.search("a.watch").map do |link|
26
+ Video.new(self, link['href'].sub(/^.*?watch\//,""), title: link.inner_text)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ class Niconico
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,74 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Niconico
4
+ def video(video_id)
5
+ login unless @logined
6
+ Video.new(self, video_id)
7
+ end
8
+
9
+ class Video
10
+ DEFFERABLES = [:id, :title, :url, :video_url, :type]
11
+ DEFFERABLES_VAR = DEFFERABLES.map{|k| :"@#{k}" }
12
+
13
+ DEFFERABLES.zip(DEFFERABLES_VAR).each do |(k,i)|
14
+ define_method(k) do
15
+ instance_variable_get(i) || (get && instance_variable_get(i))
16
+ end
17
+ end
18
+
19
+ def initialize(parent, video_id, defer=nil)
20
+ @parent = parent
21
+ @agent = parent.agent
22
+ @id = video_id
23
+ @url = "#{Niconico::URL[:watch]}#{@id}"
24
+
25
+ if defer
26
+ defer.each do |k,v|
27
+ next unless DEFFERABLES.include?(k)
28
+ instance_variable_set :"@#{k}", v
29
+ end
30
+ @page = nil
31
+ else
32
+ @page = get()
33
+ end
34
+ end
35
+
36
+ def economy?; @eco; end
37
+
38
+ def get
39
+ begin
40
+ @page = @agent.get(@url)
41
+ rescue Mechanize::ResponseCodeError => e
42
+ raise NotFound, "#{@id} not found" if e.message == "404 => Net::HTTPNotFound"
43
+ raise e
44
+ end
45
+ getflv = Hash[@agent.get_file("#{Niconico::URL[:getflv]}?v=#{@id}").scan(/([^&]+)=([^&]+)/).map{|(k,v)| [k.to_sym,CGI.unescape(v)] }]
46
+
47
+ @title = @page.at("#video_title").inner_text
48
+ @video_url = getflv[:url]
49
+ @eco = !(/low$/ =~ @video_url).nil?
50
+ @type = case @video_url.match(/^http:\/\/(.+\.)?nicovideo\.jp\/smile\?(.+?)=.*$/).to_a[2]
51
+ when 'm'; :mp4
52
+ when 's'; :swf
53
+ else; :flv
54
+ end
55
+
56
+ @page
57
+ end
58
+
59
+ def get_video
60
+ @agent.get_file(@video_url)
61
+ end
62
+
63
+ def get_video_by_other
64
+ {cookie: @agent.cookie_jar.cookies(URI.parse(@video_url)).join(";"),
65
+ url: @video_url}
66
+ end
67
+
68
+ def inspect
69
+ "#<Niconico::Video: #{@id}.#{@type} \"#{@title}\"#{@eco ? " low":""}>"
70
+ end
71
+
72
+ class NotFound < StandardError; end
73
+ end
74
+ end
data/niconico.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "niconico/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "niconico"
7
+ s.version = Niconico::VERSION
8
+ s.authors = ["Shota Fukumori (sora_h)"]
9
+ s.email = ["sorah@tubusu.net"]
10
+ s.homepage = ""
11
+ s.summary = "wrapper of Mechanize, optimized for nicovideo."
12
+ s.description = "wrapper of Mechanize, optimized for nicovideo. :)"
13
+
14
+ s.rubyforge_project = "niconico"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: niconico
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Shota Fukumori (sora_h)
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-12 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: wrapper of Mechanize, optimized for nicovideo. :)
15
+ email:
16
+ - sorah@tubusu.net
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - README.mkd
24
+ - Rakefile
25
+ - lib/niconico.rb
26
+ - lib/niconico/ranking.rb
27
+ - lib/niconico/version.rb
28
+ - lib/niconico/video.rb
29
+ - niconico.gemspec
30
+ homepage: ''
31
+ licenses: []
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirements: []
49
+ rubyforge_project: niconico
50
+ rubygems_version: 1.8.11
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: wrapper of Mechanize, optimized for nicovideo.
54
+ test_files: []