my-lib 0.0.1.4 → 0.0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1.4
1
+ 0.0.1.5
data/lib/lib/job.rb CHANGED
@@ -29,6 +29,10 @@ class MyJobAnisoku
29
29
  @a[:url] = URI.parse @a[:url] unless @a[:url].class == URI::HTTP
30
30
  @agent = Mechanize.new
31
31
  @a[:status] ||= :new
32
+ @a[:recent] ||= 7
33
+ @a[:limit] ||= 3
34
+ # make md5 with magicword '_gGddgPfeaf_gzyr'
35
+ @FC2magick = @a[:fc2magick] ||='_gGddgPfeaf_gzyr' #updated FC2 2011.7
32
36
  raise "job have no machine error" unless @a[:machine]
33
37
  end
34
38
 
@@ -36,18 +40,18 @@ class MyJobAnisoku
36
40
  def tokkakari
37
41
  print "Tokkakari".yellow
38
42
  @agent.get @a[:url]
39
- links_kousins = @agent.page.links_with(:text => /#{"更新状況".toutf8}/)
43
+ links_kousins = @agent.page.links_with(:text => /#{"更新状況"}/)
40
44
  targs = []
41
45
  links_kousins.each do |link|
42
46
  targs << link.uri
43
47
  end
44
48
  targs.each_with_index do |link,i|
45
- break if i > 6
49
+ break if i >= @a[:recent]
46
50
  job = MyJobAnisoku.new(
47
- :url => link,
48
- :status => :second,
49
- :machine => @a[:machine]
50
- )
51
+ @a.merge({
52
+ :url => link,
53
+ :status => :second
54
+ }) )
51
55
  @a[:machine].retry job
52
56
  end
53
57
 
@@ -67,10 +71,10 @@ class MyJobAnisoku
67
71
  # make job for each links_kobetu
68
72
  links_kobetu.each do |link|
69
73
  job = MyJobAnisoku.new(
70
- :url => link,
71
- :status => :kobetu,
72
- :machine => @a[:machine]
73
- )
74
+ @a.merge({
75
+ :url => link,
76
+ :status => :kobetu
77
+ } ))
74
78
  @a[:machine].retry job
75
79
  end
76
80
  end
@@ -79,32 +83,33 @@ class MyJobAnisoku
79
83
  def kobetu
80
84
  print "Kobetu".yellow
81
85
  @agent.get @a[:url]
82
- _tt = @agent.page.title.gsub(' ★ You Tube アニ速 ★','')
83
- limit = 5
84
- urls = []
86
+ title = @agent.page.title.gsub(' ★ You Tube アニ速 ★','')
85
87
  # acume url
86
- nodeset_vs = @agent.page/"/html/body/table/tr[2]/td/table/tr/td[2]/div[4]/div[2]/a/@href"
87
- _dd = []
88
-
89
- nodeset_vs.each do |va|
90
- _dd << $1 if va.value =~ /(http:\/\/say-move\.org\/comeplay\.php.*)/
91
- end
92
- _dd.reverse!
93
-
94
- #hard coding for adjust fetch limit
95
- _dd.each_with_index do |url,i|
96
- break if i > limit
97
- urls << url
98
- end
99
-
100
- urls.each_with_index do |url,i|
101
- job = MyJobAnisoku.new(
102
- :url => url,
103
- :title => _tt,
104
- :status => :third,
105
- :machine => @a[:machine]
106
- )
107
- @a[:machine].retry job
88
+ htmlA = @agent.page/"/html/body/table/tr[2]/td/table/tr/td[2]/div[4]/div[@class='kijisub']"
89
+ require 'pp'
90
+ targsHTMLs = htmlA.inner_html.toutf8.split(/ランキング/)[0].split(/\n第/).reverse!
91
+ #http://posterous.com/getfile/files.posterous.com/temp-2011-08-21/eolunzlwwwFopCnhszaBwJlFEJEnHcloqkoyaFuhdezmdgipcyyiyzdpqcpG/cro08nyoutube.doc
92
+ require 'digest'
93
+ targsHTMLs.each_with_index do |html,i|
94
+ break if i >= @a[:limit]
95
+ key = title + html.to_s
96
+ unless @a[:machine].episode_exists?( Digest::MD5.hexdigest(key) )
97
+ puts "NOW 2 PROCEED FETCH".green.bold + html[0..20].yellow.bold
98
+ indi = Nokogiri::HTML.fragment(html).css("a")
99
+ indi.each do |va|
100
+ if va[:href] =~ /(http:\/\/say-move\.org\/comeplay\.php.*)/
101
+ job = MyJobAnisoku.new(
102
+ @a.merge({
103
+ :url => $1,
104
+ :title => title + '第' + html.split('<').first.gsub(' ','').gsub(' ',''),
105
+ :status => :third}))
106
+ @a[:machine].retry job
107
+ end
108
+ end
109
+ else
110
+ puts "CANCELL FETCH".cyan.bold + html[0..20].yellow.bold
111
+ end
112
+ key = nil
108
113
  end
109
114
  end
110
115
 
@@ -125,12 +130,12 @@ class MyJobAnisoku
125
130
  fc2 = set[0].value.split('&')[1].split('=')[1]
126
131
  unless fc2.nil?
127
132
  job = MyJobAnisoku.new(
133
+ @a.merge({
128
134
  :url => sm[:url],
129
135
  :fc2 => fc2,
130
136
  :title => sm[:title],
131
- :status => :fc2,
132
- :machine => @a[:machine]
133
- )
137
+ :status => :fc2
138
+ }))
134
139
  @a[:machine].retry job
135
140
  return
136
141
  else
@@ -138,28 +143,26 @@ class MyJobAnisoku
138
143
  end
139
144
 
140
145
  job = MyJobAnisoku.new(
146
+ @a.merge({
141
147
  :url => sm[:videourl],
142
148
  :title => sm[:title],
143
- :status => :video,
144
- :machine => @a[:machine]
145
- )
149
+ :status => :video
150
+ }))
146
151
  @a[:machine].retry job
147
152
  end
148
153
 
149
154
  def fc2
150
155
  print "fc2".yellow
151
156
  require 'digest'
152
- # make md5 with magicword '_gGddgPfeaf_gzyr'
153
- url = "http://video.fc2.com/ginfo.php?mimi=#{Digest::MD5.hexdigest(@a[:fc2] + '_gGddgPfeaf_gzyr')}&v=#{@a[:fc2]}&upid=#{@a[:fc2]}&otag=1"
157
+ url = "http://video.fc2.com/ginfo.php?mimi=#{Digest::MD5.hexdigest(@a[:fc2] + @FC2magick)}&v=#{@a[:fc2]}&upid=#{@a[:fc2]}&otag=1"
154
158
  url = `curl -# -L -R "#{url}"`
155
159
  url = url.split('&')[0].split('=')[1] + '?' + url.split('&')[1]
156
160
  puts url.red.bold
157
161
  job = MyJobAnisoku.new(
158
- :url => url,
159
- :title => @a[:title],
160
- :status => :video,
161
- :machine => @a[:machine]
162
- )
162
+ @a.merge({
163
+ :url => url,
164
+ :status => :video
165
+ }))
163
166
  @a[:machine].retry job
164
167
  end
165
168
 
@@ -169,7 +172,7 @@ class MyJobAnisoku
169
172
  # save video directory is supplied by machine.
170
173
  savedir = @a[:machine].savedir
171
174
  Dir.chdir savedir
172
- filename = "#{@a[:title]}.mp4"
175
+ filename = "#{@a[:title].gsub(' ','').gsub(' ','')}.mp4"
173
176
  savepath = "#{savedir}/#{filename}"
174
177
  # check fetch candidate had been already saved?
175
178
  if File.exist?(savepath) && File.size(savepath) > 1024 * 1024 * 3
@@ -179,13 +182,15 @@ class MyJobAnisoku
179
182
  puts "Fetching ".green.bold + savepath
180
183
  MyLogger.ln "Fetch Attempt Start ".green.bold + savepath
181
184
  end
182
-
185
+
183
186
  # use curl command
184
187
  # no need UA...
185
- # command = "curl -# -L -R -o '#{filename}' 'http://#{@a[:url].host}#{@a[:url].path}?#{@a[:url].query}' --user-agent 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0a1) Gecko/20110901 Firefox/9.0a1'"
186
- command = "curl -# -L -R -o '#{filename}' 'http://#{@a[:url].host}#{@a[:url].path}?#{@a[:url].query}' "
188
+ uri = "http://#{@a[:url].host}#{@a[:url].path}"
189
+ uri += "?#{@a[:url].query}" if @a[:url].query
190
+ command = "curl -# -L -R -o '#{filename}' '#{uri}' "
191
+ command += "&& growlnotify -t '#{filename}' -m '#{uri}' "
187
192
 
188
- p command
193
+ puts command
189
194
  system command
190
195
  end
191
196
 
data/lib/lib/machine.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding:utf-8 -*-
1
2
 
2
3
  #
3
4
  # Module of Machine
@@ -156,3 +157,137 @@ class MyEventMachineDojin
156
157
 
157
158
  end
158
159
 
160
+ #
161
+ # Class of Machine by EventMachine.
162
+ # this class controll jobs for Anisoku
163
+ # @example
164
+ # machine = MyMachineAnisoku.new("YourVideoSaveDir")
165
+ # machine.setup
166
+ # machine.go
167
+ #
168
+ class MyMachineAnisoku
169
+ include MyMachine
170
+
171
+ Version = "0.0.1"
172
+
173
+ # directory of save video files default "#{ENV['HOME']}/Desktop/video"
174
+ attr_accessor :savedir
175
+
176
+ # set video save dir
177
+ # @param [Hash] args
178
+ # @option args [String] :savedir save dir
179
+ # default "#{ENV['HOME']}/Desktop/video"
180
+ def initialize(args={ })
181
+ super()
182
+ args[:savedir] ||= "#{ENV['HOME']}/Desktop/video"
183
+ @savedir = args[:savedir]
184
+ begin
185
+ Dir::mkdir(@savedir, 0777)
186
+ rescue => ex
187
+ warn ex
188
+ end
189
+ require 'rubygems'
190
+ require 'eventmachine'
191
+ # @gaman controll eventmachine end
192
+ @gaman = 0
193
+ @checklist = {}
194
+ @filelist = {}
195
+ @dellist = []
196
+ require 'pp'
197
+ make_filelist
198
+ make_dellist
199
+ end
200
+
201
+ def make_filelist
202
+ Dir.new(@savedir).each do |entry|
203
+ if File.file?("#{@savedir}/#{entry}")
204
+ header = make_header(entry)
205
+ filesize = File.size("#{@savedir}/#{entry}")
206
+ @filelist[header] = [] unless chk_header(header)
207
+ @filelist[header] << {:size => filesize,:name => "#{@savedir}/#{entry}" }
208
+ end
209
+ end
210
+ pp @filelist
211
+ end
212
+
213
+ def chk_header(string)
214
+ @filelist[string]
215
+ end
216
+
217
+ def make_header(string)
218
+ header = string.scan(/^.*?\d{1,3}話/).first.gsub(' ','').gsub(' ','')
219
+ p header
220
+ return header
221
+ end
222
+
223
+ def make_dellist
224
+ @filelist.each do |k,v|
225
+ p k
226
+ max_size = v.map { |e| e[:size] }.max
227
+ p max_size
228
+ v.each do |vv|
229
+ if vv[:size] < max_size || vv[:size] < 1024 * 1024 * 2
230
+ @dellist << vv[:name]
231
+ end
232
+ end
233
+ end
234
+ pp @dellist
235
+ end
236
+
237
+ def del_small_files
238
+ @dellist.each do |e|
239
+ p e
240
+ File.delete("#{e}")
241
+ end
242
+ end
243
+
244
+ def episode_exists?(key)
245
+ if @checklist[key].nil?
246
+ # puts "MACHINE NOE FIRST CHECK THIS EPISODE!!".red.bold
247
+ @checklist[key] = "checked"
248
+ return false
249
+ else
250
+ return true
251
+ end
252
+ end
253
+
254
+ # machine go to run eventmachine
255
+ def go
256
+ EM.run do
257
+ EM.add_periodic_timer(0.00001) do
258
+ # print "loop".green
259
+ if should_stop_machine?
260
+ finalize_files
261
+ EM.stop
262
+ end
263
+ @queue.pop.run unless @queue.empty?
264
+ end
265
+ end
266
+ puts "End of fetch".green.bold
267
+ end
268
+
269
+
270
+ # delete tiny fail files
271
+ def finalize_files
272
+ del_small_files
273
+ command = "find #{@savedir} -size -1000k -type f -print0| xargs -0 rm -v "
274
+ exec(command)
275
+ end
276
+
277
+ private
278
+
279
+ # setup jobs
280
+ def setupjobs
281
+ ajob = MyJobAnisoku.new(
282
+ :machine => self
283
+ )
284
+ @queue.push ajob
285
+ end
286
+
287
+ # should stop machine or not
288
+ def should_stop_machine?
289
+ @gaman += 1 if @queue.empty?
290
+ print @gaman
291
+ return @queue.empty? && @gaman > 1500
292
+ end
293
+ end
data/lib/my-lib.rb CHANGED
@@ -33,7 +33,7 @@ require 'lib/job'
33
33
  # MyMachine
34
34
  require 'lib/machine.rb'
35
35
  # MyJobAnisoku
36
- require 'lib/anisoku.rb'
36
+ #require 'lib/anisoku.rb'
37
37
  # RunPerSecModule
38
38
  require 'lib/runpersec.rb'
39
39
  # MyDBModule
data/my-lib.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{my-lib}
8
- s.version = "0.0.1.4"
8
+ s.version = "0.0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{modeverv}]
12
- s.date = %q{2011-09-02}
12
+ s.date = %q{2011-09-05}
13
13
  s.description = %q{longer description of your gem}
14
14
  s.email = %q{modeverv@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -27,7 +27,6 @@ Gem::Specification.new do |s|
27
27
  "TAGS",
28
28
  "VERSION",
29
29
  "lib/1.rb",
30
- "lib/lib/anisoku.rb",
31
30
  "lib/lib/job.rb",
32
31
  "lib/lib/machine.rb",
33
32
  "lib/lib/myat.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: my-lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.4
4
+ version: 0.0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-02 00:00:00.000000000Z
12
+ date: 2011-09-05 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: term-ansicolor
16
- requirement: &2156214500 !ruby/object:Gem::Requirement
16
+ requirement: &2161208760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156214500
24
+ version_requirements: *2161208760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2156187340 !ruby/object:Gem::Requirement
27
+ requirement: &2161207180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2156187340
35
+ version_requirements: *2161207180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mechanize
38
- requirement: &2156184080 !ruby/object:Gem::Requirement
38
+ requirement: &2161205420 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2156184080
46
+ version_requirements: *2161205420
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2156175340 !ruby/object:Gem::Requirement
49
+ requirement: &2161202020 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>'
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.3.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2156175340
57
+ version_requirements: *2161202020
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: yard
60
- requirement: &2156172320 !ruby/object:Gem::Requirement
60
+ requirement: &2161199560 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>'
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.6.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2156172320
68
+ version_requirements: *2161199560
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &2156161360 !ruby/object:Gem::Requirement
71
+ requirement: &2161197180 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>'
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.0.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2156161360
79
+ version_requirements: *2161197180
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &2156158860 !ruby/object:Gem::Requirement
82
+ requirement: &2161196360 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2156158860
90
+ version_requirements: *2161196360
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rcov
93
- requirement: &2156155600 !ruby/object:Gem::Requirement
93
+ requirement: &2161195600 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2156155600
101
+ version_requirements: *2161195600
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: guard
104
- requirement: &2156145720 !ruby/object:Gem::Requirement
104
+ requirement: &2161194860 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2156145720
112
+ version_requirements: *2161194860
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: guard-spork
115
- requirement: &2156143900 !ruby/object:Gem::Requirement
115
+ requirement: &2161194120 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *2156143900
123
+ version_requirements: *2161194120
124
124
  description: longer description of your gem
125
125
  email: modeverv@gmail.com
126
126
  executables: []
@@ -139,7 +139,6 @@ files:
139
139
  - TAGS
140
140
  - VERSION
141
141
  - lib/1.rb
142
- - lib/lib/anisoku.rb
143
142
  - lib/lib/job.rb
144
143
  - lib/lib/machine.rb
145
144
  - lib/lib/myat.rb
@@ -169,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
169
168
  version: '0'
170
169
  segments:
171
170
  - 0
172
- hash: 4340705816426141079
171
+ hash: 1152943948087336518
173
172
  required_rubygems_version: !ruby/object:Gem::Requirement
174
173
  none: false
175
174
  requirements:
data/lib/lib/anisoku.rb DELETED
@@ -1,290 +0,0 @@
1
- #-*- coding:utf-8 -*-
2
-
3
- #
4
- # Job Class for Fetch Anisoku
5
- # Function:
6
- # access "youtubeanisoku1.blog106.fc2.com" and crawl web site.
7
- # find a link to "say-move.org" and access "say-move.org".
8
- # finary find video link of Animetion,then fetch video file to your local.
9
- # save video directory is supplied by machine.
10
- # Notice:
11
- # job is automatically generated on after another.
12
- # This Class Needs to be handle by Machine Class
13
- # @example
14
- # # inside machine class
15
- # job = MyJobAnisoku.new(
16
- # :machine => self
17
- # )
18
- # job.run
19
- #
20
-
21
- class MyJobAnisoku
22
-
23
- def initialize(args = { })
24
- require 'rubygems'
25
- require 'kconv'
26
- require 'mechanize'
27
- require 'net/http'
28
- @a = args
29
- @a[:url] ||= 'http://youtubeanisoku1.blog106.fc2.com/'
30
- @a[:url] = URI.parse @a[:url] unless @a[:url].class == URI::HTTP
31
- @agent = Mechanize.new
32
- @a[:status] ||= :new
33
- raise "job have no machine error" unless @a[:machine]
34
- end
35
-
36
- # check kousin page
37
- def tokkakari
38
- print "Tokkakari".yellow
39
- @agent.get @a[:url]
40
- links_kousins = @agent.page.links_with(:text => /#{"更新状況".toutf8}/)
41
- targs = []
42
- links_kousins.each do |link|
43
- targs << link.uri
44
- end
45
- targs.each_with_index do |link,i|
46
- break if i > 6
47
- job = MyJobAnisoku.new(
48
- :url => link,
49
- :status => :second,
50
- :machine => @a[:machine]
51
- )
52
- @a[:machine].retry job
53
- end
54
-
55
- end
56
-
57
- # check shoukai page
58
- def second
59
- print "Second".yellow
60
- @agent.get @a[:url]
61
- links_kousin = @agent.page/"/html/body/table/tr[2]/td/table/tr/td[2]/div[4]/ul/li/a/@href"
62
- # links_kobetu
63
- links_kobetu = []
64
- links_kousin.each do |link|
65
- links_kobetu << $1 if link.value =~ /(http:\/\/youtubeanisoku.*)/
66
- end
67
-
68
- # make job for each links_kobetu
69
- links_kobetu.each do |link|
70
- job = MyJobAnisoku.new(
71
- :url => link,
72
- :status => :kobetu,
73
- :machine => @a[:machine]
74
- )
75
- @a[:machine].retry job
76
- end
77
- end
78
-
79
- #access say-move and make video job
80
- def kobetu
81
- print "Kobetu".yellow
82
- @agent.get @a[:url]
83
- _tt = @agent.page.title.gsub(' ★ You Tube アニ速 ★','')
84
- limit = 5
85
- urls = []
86
- # acume url
87
- nodeset_vs = @agent.page/"/html/body/table/tr[2]/td/table/tr/td[2]/div[4]/div[2]/a/@href"
88
- _dd = []
89
-
90
- nodeset_vs.each do |va|
91
- _dd << $1 if va.value =~ /(http:\/\/say-move\.org\/comeplay\.php.*)/
92
- end
93
- _dd.reverse!
94
-
95
- #hard coding for adjust fetch limit
96
- _dd.each_with_index do |url,i|
97
- break if i > limit
98
- urls << url
99
- end
100
-
101
- urls.each_with_index do |url,i|
102
- job = MyJobAnisoku.new(
103
- :url => url,
104
- :title => _tt,
105
- :status => :third,
106
- :machine => @a[:machine]
107
- )
108
- @a[:machine].retry job
109
- end
110
- end
111
-
112
- #access say-move and make video job
113
- def third
114
- print "Third".yellow
115
- #sm has title and url
116
-
117
- sm = { :title => @a[:title],:url => @a[:url]}
118
- # debug fc2 video sm[:url] = "http://say-move.org/comeplay.php?comeid=217953"
119
- @agent.get(sm[:url])
120
- sm[:title] += @agent.page.title.gsub!('FC2 SayMove!','')
121
- set = @agent.page/"/html/body/div/div[2]/div[7]/div[2]/input/@value"
122
- if !set.empty?
123
- sm[:videourl] = set[0].value
124
- else
125
- set = @agent.page/"/html/body/div/div[2]/div[3]/object/param[5]/@value"
126
- fc2 = set[0].value.split('&')[1].split('=')[1]
127
- unless fc2.nil?
128
- job = MyJobAnisoku.new(
129
- :url => sm[:url],
130
- :fc2 => fc2,
131
- :title => sm[:title],
132
- :status => :fc2,
133
- :machine => @a[:machine]
134
- )
135
- @a[:machine].retry job
136
- return
137
- else
138
- end
139
- end
140
-
141
- job = MyJobAnisoku.new(
142
- :url => sm[:videourl],
143
- :title => sm[:title],
144
- :status => :video,
145
- :machine => @a[:machine]
146
- )
147
- @a[:machine].retry job
148
- end
149
-
150
- def fc2
151
- print "fc2".yellow
152
- require 'digest'
153
- # make md5 with magicword '_gGddgPfeaf_gzyr'
154
- url = "http://video.fc2.com/ginfo.php?mimi=#{Digest::MD5.hexdigest(@a[:fc2] + '_gGddgPfeaf_gzyr')}&v=#{@a[:fc2]}&upid=#{@a[:fc2]}&otag=1"
155
- url = `curl -# -L -R "#{url}"`
156
- url = url.split('&')[0].split('=')[1] + '?' + url.split('&')[1]
157
- puts url.red.bold
158
- job = MyJobAnisoku.new(
159
- :url => url,
160
- :title => @a[:title],
161
- :status => :video,
162
- :machine => @a[:machine]
163
- )
164
- @a[:machine].retry job
165
- end
166
-
167
- #fetch video
168
- def video
169
- print "video".yellow
170
- # save video directory is supplied by machine.
171
- savedir = @a[:machine].savedir
172
- Dir.chdir savedir
173
- filename = "#{@a[:title]}.mp4"
174
- savepath = "#{savedir}/#{filename}"
175
- # check fetch candidate had been already saved?
176
- if File.exist?(savepath) && File.size(savepath) > 1024 * 1024 * 3
177
- puts "File Already Saved ".yellow.bold + savepath
178
- return
179
- else
180
- puts "Fetching ".green.bold + savepath
181
- MyLogger.ln "Fetch Attempt Start ".green.bold + savepath
182
- end
183
-
184
- # use curl command
185
- # no need UA...
186
- # command = "curl -# -L -R -o '#{filename}' 'http://#{@a[:url].host}#{@a[:url].path}?#{@a[:url].query}' --user-agent 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0a1) Gecko/20110901 Firefox/9.0a1'"
187
- command = "curl -# -L -R -o '#{filename}' 'http://#{@a[:url].host}#{@a[:url].path}?#{@a[:url].query}' "
188
-
189
- p command
190
- system command
191
- end
192
-
193
- # run in thread
194
- def run
195
- t = Thread.new do
196
- case @a[:status]
197
- when :new then
198
- tokkakari
199
- when :second then
200
- second
201
- when :kobetu then
202
- kobetu
203
- when :third then
204
- third
205
- when :fc2 then
206
- fc2
207
- when :video then
208
- video
209
- end
210
- end
211
- end
212
-
213
- end
214
-
215
-
216
-
217
- #
218
- # Class of Machine by EventMachine.
219
- # this class controll jobs for Anisoku
220
- # @example
221
- # machine = MyMachineAnisoku.new("YourVideoSaveDir")
222
- # machine.setup
223
- # machine.go
224
- #
225
- class MyMachineAnisoku
226
- include MyMachine
227
-
228
- Version = "0.0.1"
229
-
230
- # directory of save video files default "#{ENV['HOME']}/Desktop/video"
231
- attr_accessor :savedir
232
-
233
- # set video save dir
234
- # @param [Hash] args
235
- # @option args [String] :savedir save dir
236
- # default "#{ENV['HOME']}/Desktop/video"
237
- def initialize(args={ })
238
- super()
239
- args[:savedir] ||= "#{ENV['HOME']}/Desktop/video2"
240
- @savedir = args[:savedir]
241
- begin
242
- Dir::mkdir(@savedir, 0777)
243
- rescue => ex
244
- warn ex
245
- end
246
- require 'rubygems'
247
- require 'eventmachine'
248
- # @gaman controll eventmachine end
249
- @gaman = 0
250
- end
251
-
252
- # machine go to run eventmachine
253
- def go
254
- EM.run do
255
- EM.add_periodic_timer(0.00001) do
256
- # print "loop".green
257
- if should_stop_machine?
258
- finalize_files
259
- EM.stop
260
- end
261
- @queue.pop.run unless @queue.empty?
262
- end
263
- end
264
- puts "End of fetch".green.bold
265
- end
266
-
267
-
268
- # delete tiny fail files
269
- def finalize_files
270
- command = "find #{@savedir} -size -1000k -type f -print0| xargs -0 rm -v "
271
- exec(command)
272
- end
273
-
274
- private
275
-
276
- # setup jobs
277
- def setupjobs
278
- ajob = MyJobAnisoku.new(
279
- :machine => self
280
- )
281
- @queue.push ajob
282
- end
283
-
284
- # should stop machine or not
285
- def should_stop_machine?
286
- @gaman += 1 if @queue.empty?
287
- print @gaman
288
- return @queue.empty? && @gaman > 1500
289
- end
290
- end