thwomp 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ 1.9.3
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+
5
+ before_install:
6
+ - sudo apt-get update -qq
7
+ - sudo apt-get install -qq gnash libagg-dev automake autoconf libtool libltdl-dev libjpeg-dev libgif-dev libboost-dev libboost-thread-dev libboost-program-options-dev libfontconfig1-dev libfreetype6-dev ffmpeg libpng-dev libspeex-dev libsdl-dev libspeexdsp-dev imagemagick
8
+
9
+ script:
10
+ - rspec spec
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -63,7 +63,7 @@ Option 1: Install from source
63
63
  make
64
64
  sudo make install
65
65
 
66
- Option 2: Install from tarbal from the intertubes:
66
+ Option 2: Install from tarball from the intertubes:
67
67
  cd /tmp/
68
68
  wget ftp://ftp.mirror.nl/pub/mirror/gnu/gnash/0.8.9/gnash-0.8.9.tar.gz
69
69
  tar -xzf gnash-0.8.9.tar.gz
@@ -76,24 +76,27 @@ Don't forget to add sudo before gnash.
76
76
 
77
77
  === Ubuntu
78
78
 
79
- TODO
79
+ git clone git://git.sv.gnu.org/gnash.git
80
+ cd gnash
81
+ sudo apt-get install -y libagg-dev automake autoconf libtool libltdl-dev libjpeg-dev libgif-dev libboost-dev libboost-thread-dev libboost-program-options-dev libfontconfig1-dev libfreetype6-dev ffmpeg libpng-dev libspeex-dev libsdl-dev libspeexdsp-dev imagemagick
82
+ ./autogen.sh
83
+ ./configure --prefix=/usr/local/gnash-dump --enable-renderer=agg --enable-gui=dump --enable-media=no --disable-menus
84
+ make
85
+ sudo make install
80
86
 
81
87
  == Installing the thwomp gem
82
88
  gem install thwomp
83
89
 
84
90
  == Usage
85
91
 
86
- <b>Retrieiving image from frame:</b>
87
- renderer = Thwomp::Renderer.new("http://www.example.com/flash.swf")
88
- data = renderer.png_data(2)
92
+ <b>Finding the most suitable thumbnail for a swf movie:</b>
93
+ thumbnail_path = Thwomp.pick("http://www.example.com/flash.swf")
89
94
 
90
- <b>Creating a thumbnail from a frame:</b>
91
- renderer = Thwomp::Renderer.new("http://www.example.com/flash.swf")
92
- data = Thwomp::Thumbnail.new(renderer).png_data(2)
95
+ This picks the right renderer based on file extension. If that doesn't work
96
+ for you, you can instantiate the right renderer yourself. Like this;
93
97
 
94
- <b>Finding the most suitble thumbnail for a swf movie:</b>
95
- renderer = Thwomp::Renderer.new("http://www.example.com/flash.swf")
96
- data = Thwomp::SuitableThumbnail.new(renderer).png_data
98
+ renderer = Thwomp::Renderers::SWF.new("http://www.example.com/flash.swf")
99
+ thumbnail_path = ThumbnailPicker.pick(renderer.frames)
97
100
 
98
101
  <b>Creating a GIF animation from a swf movie:</b>
99
102
  renderer = Thwomp::Renderer.new("http://www.example.com/flash.swf")
data/Rakefile CHANGED
@@ -1,2 +1,5 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new
@@ -9,7 +9,7 @@ end
9
9
 
10
10
  if ask('Install required libs with homebrew? [y/n]') =~ /^[Yy]$/
11
11
  puts 'Installing required libs with homebrew'
12
- `brew update && brew install giflib boost libagg`
12
+ `brew update && brew install libtool giflib boost libagg gconf`
13
13
  end
14
14
 
15
15
  if ask('Install gnash? This may take a while! [y/n]') =~ /^[Yy]$/
@@ -21,8 +21,8 @@ if ask('Install gnash? This may take a while! [y/n]') =~ /^[Yy]$/
21
21
  rm -fr gnash
22
22
  git clone git://git.sv.gnu.org/gnash.git
23
23
  cd gnash
24
- ./autogen
25
- ./configure --prefix=/usr/local/gnash-dump --enable-renderer=agg --enable-gui=dump --enable-media=no --disable-kparts --disable-nsapi --disable-menus make
24
+ ./autogen.sh
25
+ ./configure --prefix=/usr/local/gnash-dump --enable-renderer=agg --enable-gui=dump --enable-media=no --disable-kparts --disable-nsapi --disable-menus
26
26
  make
27
27
  sudo make install`
28
28
  end
@@ -1,10 +1,26 @@
1
1
  require 'thwomp/version'
2
2
  require 'thwomp/renderer'
3
+ require 'thwomp/renderers/helper'
4
+ require 'thwomp/renderers/swf'
5
+ require 'thwomp/renderers/ffmpeg'
3
6
  require 'thwomp/color_counter'
4
7
  require 'thwomp/downloader'
8
+ require 'thwomp/thumbnail_picker'
5
9
  require 'thwomp/thumbnail'
6
- require 'thwomp/suitable_thumbnail'
7
10
  require 'thwomp/animation_preview'
11
+ require 'thwomp/command'
8
12
 
9
13
  module Thwomp
14
+
15
+ class << self
16
+
17
+ attr_accessor :gnash_path, :ffmpeg_path
18
+
19
+ def pick(url)
20
+ renderer = Renderer.new(url)
21
+ ThumbnailPicker.pick(renderer.frames.reverse)
22
+ end
23
+
24
+ end
25
+
10
26
  end
@@ -1,58 +1,27 @@
1
1
  require 'tmpdir'
2
2
 
3
3
  module Thwomp
4
- class AnimationPreview < Struct.new(:renderer)
4
+ class AnimationPreview
5
5
 
6
- attr_accessor :renderer, :max_width, :max_height, :max_frames
6
+ # TODO: (optional) use Thumbnail class to make png's from the
7
+ # rendered frames, instead of passing the frames directly to 'convert'
7
8
 
8
- DEFAULT_OPTIONS = { :max_width => 128,
9
- :max_height => 128,
10
- :max_frames => 10 }
9
+ attr_reader :frames
11
10
 
12
- #
13
- # Creates an GIF animation from a given SWF
14
- #
15
- # Options
16
- # :max_width Maximum width of GIF
17
- # :max_height Maximum height of GIF
18
- #
19
- def initialize(renderer, options = {})
20
- DEFAULT_OPTIONS.merge(options).each { |k,v| send(:"#{k}=", v) if v }
21
- @renderer = renderer
11
+ def initialize(frames)
12
+ @frames = frames
22
13
  end
23
14
 
24
- # returns the gif binary data of generated animation
25
- def gif_data
26
- File.open(filename, 'rb') { |f| f.read }
27
- end
28
-
29
- # returns temp filename of generated animation
30
- def filename
31
- @filename ||= generate_gif!
32
- end
33
-
34
- private
35
-
36
- def thumbnail
37
- @thumbnail ||= Thumbnail.new(renderer, :max_width => max_width, :max_height => max_height)
38
- end
39
-
40
- # returns all filenames of the seperate frames in the flash animation
41
- def frame_filenames
42
- unless @frame_filenames
43
- frames = (0..max_frames).to_a + ['last']
44
- renderer.render_batch!(frames)
45
- @frame_filenames = frames.map { |frame| thumbnail.filename(frame) }.compact
46
- end
47
-
48
- @frame_filenames
49
- end
50
-
51
- def generate_gif!
15
+ def generate!
52
16
  filename = "#{Dir.tmpdir}/animation_#{Time.now.to_i}.gif"
53
- `convert #{frame_filenames.join(' ')} #{filename}`
17
+ Command.exec("convert #{frames.join(' ')} #{filename}")
54
18
  filename
55
19
  end
56
20
 
21
+ # returns the gif binary data of generated animation
22
+ def gif_data
23
+ File.open(generate!, 'rb') { |f| f.read }
24
+ end
25
+
57
26
  end
58
27
  end
@@ -22,10 +22,18 @@ module Thwomp
22
22
  !empty?
23
23
  end
24
24
 
25
+ def valid_png?
26
+ !!png
27
+ end
28
+
25
29
  private
26
30
 
27
31
  def png
28
- @png ||= ChunkyPNG::Image.from_file(image_filename)
32
+ @png ||= begin
33
+ ChunkyPNG::Image.from_file(image_filename)
34
+ rescue Errno::ENOENT, ChunkyPNG::Exception, RangeError, NoMethodError
35
+ false
36
+ end
29
37
  end
30
38
 
31
39
  def width
@@ -72,7 +80,7 @@ module Thwomp
72
80
 
73
81
  # returns the color at pixel X,Y
74
82
  def color_at(x,y)
75
- png[y, x]
83
+ png[x, y]
76
84
  end
77
85
 
78
86
  def flattened_color_at(x,y)
@@ -0,0 +1,11 @@
1
+ module Thwomp
2
+
3
+ class Command
4
+
5
+ def self.exec(cmd)
6
+ system(cmd)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -1,98 +1,17 @@
1
- require 'tmpdir'
2
-
3
1
  module Thwomp
4
2
 
5
- # Renders SWF files
6
3
  class Renderer
7
4
 
8
- attr_accessor :url, :max_width, :max_height, :max_frames
9
-
10
- DEFAULT_OPTIONS = { :max_width => 500,
11
- :max_height => 500,
12
- :max_frames => 10 }
13
-
14
- # Initializer the Thwomp renderer
15
- #
16
- # Options:
17
- # :max_width Maximum width of renderer
18
- # :max_height Maximum height of renderer
19
- # :max_frames Maximum number of frames the renderer can handle
20
- def initialize(url, options = {})
21
- DEFAULT_OPTIONS.merge(options).each { |k,v| send(:"#{k}=", v) if v }
22
- @url = url
23
- end
24
-
25
- # returns filename of frame
26
- def frame_filename(frame)
27
- frame_exists?(frame) ? @frame_filename[frame] : nil
28
- end
29
-
30
- # returns PNG data from given frame
31
- def png_data(frame)
32
- frame_exists?(frame) ? frame_data(frame) : nil
33
- end
34
-
35
- # renders a batch of frames
36
- def render_batch!(frames)
37
- @frame_filename ||= {}
5
+ def self.new(*args)
6
+ url = args.first
38
7
 
39
- frame_batch = frames.join(',')
40
- file_mask = frame_output_filename('%f')
41
-
42
- `#{self.class.gnash_binary} -s1 --screenshot=#{frame_batch} --screenshot-file=#{file_mask} -1 -r1 --timeout 200 #{filename} -j #{max_width} -k #{max_height}`
43
-
44
- frames.each do |frame|
45
- @frame_filename[frame] = file_mask.gsub('%f', frame.to_s)
8
+ if url.match(/\.swf$/)
9
+ Renderers::SWF.new(*args)
10
+ else
11
+ Renderers::FFMPEG.new(*args)
46
12
  end
47
13
  end
48
14
 
49
- def frame_exists?(frame)
50
- render_frame!(frame)
51
- File.exists?(@frame_filename[frame])
52
- end
53
-
54
- # returns the current set gnash binary
55
- def self.gnash_binary
56
- @gnash_binary ||= 'gnash-dump'
57
- end
58
-
59
- # sets the path to the gnash binary
60
- def self.gnash_binary=(binary)
61
- @gnash_binary = binary
62
- end
63
-
64
- private
65
-
66
- def frame_data(frame)
67
- File.open(@frame_filename[frame], 'rb') { |f| f.read }
68
- end
69
-
70
- # renders all the frames from the SWF file and dump them to a RAW file
71
- def render_frame!(frame)
72
- @frame_filename ||= {}
73
-
74
- unless @frame_filename[frame]
75
- @frame_filename[frame] = frame_output_filename(frame)
76
-
77
- `#{self.class.gnash_binary} -s1 --screenshot=#{frame} --screenshot-file #{@frame_filename[frame]} -1 -r1 --timeout 200 #{filename} -j #{max_width} -k #{max_height}`
78
- end
79
-
80
- @frame_filename[frame]
81
- end
82
-
83
- def filename
84
- downloader.filename
85
- end
86
-
87
- # returns the downloader
88
- def downloader
89
- @downloader ||= Downloader.new(url)
90
- end
91
-
92
- # returns temp filename for given frame no.
93
- def frame_output_filename(frame)
94
- "#{Dir.tmpdir}/frame_#{Time.now.to_i}_#{frame}.png"
95
- end
96
-
97
15
  end
16
+
98
17
  end
@@ -0,0 +1,31 @@
1
+ module Thwomp
2
+
3
+ module Renderers
4
+
5
+ class FFMPEG
6
+ include Renderers::Helper
7
+
8
+ attr_reader :filename
9
+
10
+ def initialize(url)
11
+ @filename = Downloader.new(url).filename
12
+ end
13
+
14
+ def frames
15
+ timestamp = Time.now.to_i
16
+ output_file_name = "#{Dir.tmpdir}/frame_#{timestamp}_%d.png"
17
+
18
+ Command.exec("#{executable} -i #{filename} -f image2 -r 1 -vf scale=128:-1 #{output_file_name} &> /dev/null")
19
+
20
+ sort Dir.glob("#{Dir.tmpdir}/frame_#{timestamp}_*.png")
21
+ end
22
+
23
+ def executable
24
+ Thwomp.ffmpeg_path || "ffmpeg"
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,21 @@
1
+ module Thwomp
2
+
3
+ module Renderers
4
+
5
+ module Helper
6
+
7
+ def sort(frames)
8
+ frames.sort do |a, b|
9
+ frame_number(File.basename(a)) <=> frame_number(File.basename(b))
10
+ end
11
+ end
12
+
13
+ def frame_number(file_name)
14
+ file_name.scan(/\d+/).last.to_i
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,63 @@
1
+ require 'tmpdir'
2
+
3
+ module Thwomp
4
+
5
+ # Renders SWF files
6
+ module Renderers
7
+
8
+ class SWF
9
+
10
+ include Renderers::Helper
11
+
12
+ attr_reader :filename, :frame_count, :width, :height
13
+
14
+ def initialize(url, options={})
15
+ @filename = Downloader.new(url).filename
16
+ @frame_count = options.fetch(:frame_count) { 10 }
17
+ @width = options.fetch(:width) { 500 }
18
+ @height = options.fetch(:height) { 500 }
19
+ end
20
+
21
+ def frames
22
+ timestamp = Time.now.to_i
23
+
24
+ Command.exec(
25
+ "#{executable} -s1 --screenshot=#{frame_batch}" \
26
+ " --screenshot-file=#{output_file(timestamp)}" \
27
+ " -1 -r1 --timeout 200 #{filename} -j #{width}" \
28
+ " -k #{height} > /dev/null 2>&1"
29
+ )
30
+
31
+ sort Dir.glob("#{Dir.tmpdir}/frame_#{timestamp}_*.png")
32
+ end
33
+
34
+ def frame(number)
35
+ timestamp = Time.now.to_i
36
+
37
+ Command.exec(
38
+ "#{executable} -s1 --screenshot=#{number}" \
39
+ " --screenshot-file=#{output_file(timestamp)}" \
40
+ " -1 -r1 --timeout 200 #{filename} -j #{width}" \
41
+ " -k #{height} > /dev/null 2>&1"
42
+ )
43
+
44
+ "#{Dir.tmpdir}/frame_#{timestamp}_#{number}.png"
45
+ end
46
+
47
+ def frame_batch
48
+ batch = ['last'] + (0..frame_count).to_a.reverse
49
+ batch.join(',')
50
+ end
51
+
52
+ def output_file(timestamp)
53
+ "#{Dir.tmpdir}/frame_#{timestamp}_%f.png"
54
+ end
55
+
56
+ def executable
57
+ Thwomp.gnash_path || "gnash-dump"
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -3,52 +3,25 @@ require 'oily_png'
3
3
 
4
4
  module Thwomp
5
5
 
6
- # Creates thumbnail of SWF movies
7
6
  class Thumbnail
8
7
 
9
- attr_accessor :renderer, :max_width, :max_height
10
-
11
- DEFAULT_OPTIONS = { :max_width => 128,
12
- :max_height => 128 }
13
-
14
- #
15
- # Intializes thumbnail renderer
16
- #
17
- # Options
18
- # :max_width Maximum width of thumbnail
19
- # :max_height Maximum height of thumbnail
20
- #
21
- def initialize(renderer, options = {})
22
- DEFAULT_OPTIONS.merge(options).each { |k,v| send(:"#{k}=", v) if v }
23
- @renderer = renderer
24
- end
25
-
26
- # returns the png binary data of the generated thumbnail
27
- def png_data(frame)
28
- File.open(filename(frame), 'rb') { |f| f.read } if renderer.frame_exists?(frame)
29
- end
30
-
31
- # returns the temp filename of the generated thumbnail
32
- def filename(frame)
33
- @filename ||= {}
34
- @filename[frame] ||= generate_thumbnail!(frame) if renderer.frame_exists?(frame)
35
- end
8
+ def self.generate!(path, options={})
9
+ width = options.fetch(:width, 128)
10
+ height = options.fetch(:height, 128)
36
11
 
37
- def render_batch!(frames)
12
+ filename = path.gsub(/frame/, 'thumbnail')
38
13
 
39
- end
40
-
41
- private
42
-
43
- def generate_thumbnail!(frame)
44
- filename = "#{Dir.tmpdir}/thumbnail_#{Time.now.to_i}_#{frame}.png"
14
+ begin
15
+ thumbnail = ChunkyPNG::Image.from_file(path)
16
+ thumbnail.resample_bilinear!(width, height)
17
+ thumbnail.save(filename)
45
18
 
46
- thumbnail = ChunkyPNG::Image.from_file(renderer.frame_filename(frame))
47
- thumbnail.resample_bilinear!(max_width, max_height)
48
- thumbnail.save(filename)
49
-
50
- filename
19
+ filename
20
+ rescue ChunkyPNG::Exception, RangeError, NoMethodError
21
+ false
22
+ end
51
23
  end
52
24
 
53
25
  end
26
+
54
27
  end
@@ -0,0 +1,16 @@
1
+ module Thwomp
2
+
3
+ class ThumbnailPicker
4
+
5
+ def self.pick(image_paths)
6
+ path = image_paths.find do |path|
7
+ counter = ColorCounter.new(path)
8
+ counter.valid_png? && counter.present?
9
+ end
10
+
11
+ Thumbnail.generate!(path)
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Thwomp
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,12 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Thwomp::AnimationPreview do
3
+ module Thwomp
4
4
 
5
- let(:renderer) { Thwomp::Renderer.new("#{File.dirname(__FILE__)}/fixtures/test.swf") }
5
+ describe AnimationPreview do
6
+
7
+ it "shells out to 'convert' to create an animated gif" do
8
+ frames = %w(a.png b.png c.png)
9
+ now = Time.now
10
+ output_file = "#{Dir.tmpdir}/animation_#{now.to_i}.gif"
11
+
12
+ cmd = "convert #{frames.join(' ')} #{output_file}"
13
+ Command.should_receive(:exec).with(cmd)
14
+
15
+ Time.stub(:now).and_return(now)
16
+ preview = AnimationPreview.new(frames)
17
+ preview.generate!.should == output_file
18
+ end
6
19
 
7
- it 'generates a gif animation' do
8
- animation = Thwomp::AnimationPreview.new(renderer, :max_width => 60, :max_height => 60)
9
- animation.gif_data.should == get_contents("#{File.dirname(__FILE__)}/fixtures/frames.gif")
10
20
  end
11
21
 
12
22
  end
@@ -1,30 +1,29 @@
1
1
  require 'spec_helper'
2
2
  require 'thwomp'
3
3
 
4
- describe Thwomp::Renderer do
5
- describe 'extracting frames from flash' do
4
+ module Thwomp
6
5
 
7
- subject { Thwomp::Renderer.new("#{File.dirname(__FILE__)}/fixtures/test.swf") }
6
+ describe Renderer do
8
7
 
9
- it 'extracts frame 1' do
10
- subject.png_data(0).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame0.png")
8
+ it "instantiates the ffmpeg renderer for flv" do
9
+ path = "/some/path/test.flv"
10
+ Renderers::FFMPEG.should_receive(:new).with(path)
11
+ renderer = Renderer.new(path)
11
12
  end
12
13
 
13
- it 'extracts frame 2' do
14
- subject.png_data(1).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame1.png")
14
+ it "instantiates the gnash renderer for swf" do
15
+ path = "/some/path/test.swf"
16
+ Renderers::SWF.should_receive(:new).with(path)
17
+ renderer = Renderer.new(path)
15
18
  end
16
19
 
17
- it 'extracts frame 3' do
18
- subject.png_data(2).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame2.png")
19
- end
20
-
21
- it 'extracts frame 4' do
22
- subject.png_data(3).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame3.png")
23
- end
24
-
25
- it 'extracts frame 5' do
26
- subject.png_data(4).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame4.png")
20
+ it "passes all arguments to the renderer" do
21
+ path = "/some/path/test.swf"
22
+ options = { :width => 200, :height => 200 }
23
+ Renderers::SWF.should_receive(:new).with(path, options)
24
+ renderer = Renderer.new(path, options)
27
25
  end
28
26
 
29
27
  end
28
+
30
29
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'thwomp'
3
+
4
+ module Thwomp
5
+
6
+ describe Renderers::FFMPEG do
7
+
8
+ let(:path) { File.expand_path("./spec/fixtures/test.flv") }
9
+
10
+ it "creates a screenshot every second" do
11
+ renderer = Renderers::FFMPEG.new(path)
12
+ now = Time.now
13
+ output_file = "#{Dir.tmpdir}/frame_#{now.to_i}_%d.png"
14
+ cmd = "ffmpeg -i #{path} -f image2 -r 1 -vf scale=128:-1 #{output_file} &> /dev/null"
15
+
16
+ Time.stub(:now).and_return(now)
17
+ Command.should_receive(:exec).with(cmd)
18
+ renderer.frames
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'thwomp'
3
+
4
+ module Thwomp
5
+
6
+ describe Renderers::SWF do
7
+
8
+ let(:input) { "./some/path/to/test.swf" }
9
+
10
+ it "shells out to 'gnash' to extract frames from an SWF movie" do
11
+ renderer = Renderers::SWF.new(input)
12
+ now = Time.now
13
+ Time.stub(:now).and_return(now)
14
+ output_file = "#{Dir.tmpdir}/frame_#{now.to_i}_%f.png"
15
+ cmd = "gnash-dump -s1 --screenshot=last,10,9,8,7,6,5,4,3,2,1,0 --screenshot-file=#{output_file} -1 -r1 --timeout 200 #{input} -j 500 -k 500 > /dev/null 2>&1"
16
+ Command.should_receive(:exec).with(cmd)
17
+ renderer.frames
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -9,4 +9,4 @@ def get_contents(file)
9
9
  File.open(file, 'rb') { |f| f.read }
10
10
  end
11
11
 
12
- Thwomp::Renderer.gnash_binary = '/usr/local/gnash-dump/bin/dump-gnash'
12
+ # Thwomp::Renderer.gnash_binary = '/usr/local/gnash-dump/bin/dump-gnash'
@@ -2,30 +2,8 @@ require 'spec_helper'
2
2
  require 'thwomp'
3
3
 
4
4
  describe Thwomp::Thumbnail do
5
- describe 'creating thumbnails from frames' do
6
-
7
- let(:renderer) { Thwomp::Renderer.new("#{File.dirname(__FILE__)}/fixtures/test.swf") }
8
- subject { Thwomp::Thumbnail.new(renderer, :max_width => 128, :max_height => 128) }
9
-
10
- it 'creates thumbnail from frame 1' do
11
- subject.png_data(0).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame0_thumbnail.png")
12
- end
13
-
14
- it 'creates thumbnail from frame 2' do
15
- subject.png_data(1).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame1_thumbnail.png")
16
- end
17
-
18
- it 'creates thumbnail from frame 3' do
19
- subject.png_data(2).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame2_thumbnail.png")
20
- end
21
-
22
- it 'creates thumbnail from frame 4' do
23
- subject.png_data(3).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame3_thumbnail.png")
24
- end
25
-
26
- it 'creates thumbnail from frame 5' do
27
- subject.png_data(4).should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame4_thumbnail.png")
28
- end
29
5
 
6
+ describe 'creating thumbnails from frames' do
7
+ pending
30
8
  end
31
9
  end
metadata CHANGED
@@ -1,77 +1,77 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: thwomp
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 6
10
- version: 0.0.6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Altovista
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-08-11 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2013-08-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: rspec
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: oily_png
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: oily_png
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
47
38
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: highline
51
39
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
53
41
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: highline
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :runtime
62
- version_requirements: *id003
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
63
62
  description: Creates thumbnails or gif animations using Gnash as SWF renderer
64
- email:
63
+ email:
65
64
  - webmaster@altovista.nl
66
- executables:
65
+ executables:
67
66
  - install_gnash_osx
68
67
  - install_gnash_ubuntu
69
68
  extensions: []
70
-
71
69
  extra_rdoc_files: []
72
-
73
- files:
70
+ files:
74
71
  - .gitignore
72
+ - .ruby-version
73
+ - .travis.yml
74
+ - Gemfile
75
75
  - README.rdoc
76
76
  - Rakefile
77
77
  - bin/install_gnash_osx
@@ -79,11 +79,14 @@ files:
79
79
  - lib/thwomp.rb
80
80
  - lib/thwomp/animation_preview.rb
81
81
  - lib/thwomp/color_counter.rb
82
+ - lib/thwomp/command.rb
82
83
  - lib/thwomp/downloader.rb
83
- - lib/thwomp/raw_renderer.rb
84
84
  - lib/thwomp/renderer.rb
85
- - lib/thwomp/suitable_thumbnail.rb
85
+ - lib/thwomp/renderers/ffmpeg.rb
86
+ - lib/thwomp/renderers/helper.rb
87
+ - lib/thwomp/renderers/swf.rb
86
88
  - lib/thwomp/thumbnail.rb
89
+ - lib/thwomp/thumbnail_picker.rb
87
90
  - lib/thwomp/version.rb
88
91
  - spec/animation_preview_spec.rb
89
92
  - spec/color_counter_spec.rb
@@ -102,45 +105,36 @@ files:
102
105
  - spec/fixtures/insignificant.png
103
106
  - spec/fixtures/significant.png
104
107
  - spec/renderer_spec.rb
108
+ - spec/renderers/ffmpeg_spec.rb
109
+ - spec/renderers/swf_spec.rb
105
110
  - spec/spec_helper.rb
106
- - spec/suitable_thumbnail_spec.rb
107
111
  - spec/thumbnail_spec.rb
108
112
  - thwomp.gemspec
109
- has_rdoc: true
110
113
  homepage: http://www.altovista.nl
111
114
  licenses: []
112
-
113
115
  post_install_message:
114
116
  rdoc_options: []
115
-
116
- require_paths:
117
+ require_paths:
117
118
  - lib
118
- required_ruby_version: !ruby/object:Gem::Requirement
119
+ required_ruby_version: !ruby/object:Gem::Requirement
119
120
  none: false
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- hash: 3
124
- segments:
125
- - 0
126
- version: "0"
127
- required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
126
  none: false
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- hash: 3
133
- segments:
134
- - 0
135
- version: "0"
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
136
131
  requirements: []
137
-
138
132
  rubyforge_project: thwomp
139
- rubygems_version: 1.6.2
133
+ rubygems_version: 1.8.24
140
134
  signing_key:
141
135
  specification_version: 3
142
136
  summary: Create thumbnails or gif animations from SWF files
143
- test_files:
137
+ test_files:
144
138
  - spec/animation_preview_spec.rb
145
139
  - spec/color_counter_spec.rb
146
140
  - spec/fixtures/frame0.png
@@ -158,6 +152,7 @@ test_files:
158
152
  - spec/fixtures/insignificant.png
159
153
  - spec/fixtures/significant.png
160
154
  - spec/renderer_spec.rb
155
+ - spec/renderers/ffmpeg_spec.rb
156
+ - spec/renderers/swf_spec.rb
161
157
  - spec/spec_helper.rb
162
- - spec/suitable_thumbnail_spec.rb
163
158
  - spec/thumbnail_spec.rb
@@ -1,40 +0,0 @@
1
- require 'tmpdir'
2
-
3
- # TODO maybe nice to use RAW files instead of screenshot files
4
- module Thwomp
5
- # Renders SWF files
6
- class RawRenderer < Renderer
7
-
8
- attr_accessor :max_advances
9
-
10
- private
11
-
12
- # calculates offset of given frame
13
- def frame_offset(frame)
14
- frame_size * frame
15
- end
16
-
17
- # calculates size of frame
18
- def frame_size
19
- max_width * max_height * 4
20
- end
21
-
22
- # maximum number of captures frames
23
- def max_advances
24
- @max_advances ||= 100
25
- end
26
-
27
- # extracts one frame from dump and returns the raw data
28
- def extract_frame_from_raw(frame)
29
- #@render_frames ||= `#{gnash_binary} #{downloader.filename} -D #{raw_filename} --max-advances #{max_advances} 1 -j 500 -k 500`
30
- render_frame!(frame)
31
-
32
- File.open('rb', raw_filename) do |file|
33
- file.seek(frame_offset(frame))
34
- file.read(frame_size)
35
- end
36
- end
37
-
38
- end
39
- end
40
-
@@ -1,52 +0,0 @@
1
- module Thwomp
2
-
3
- # Creates thumbnail of SWF movie and finds the most interesting frame in the movie
4
- class SuitableThumbnail < Thumbnail
5
-
6
- # returns the png binary data of the generated thumbnail
7
- def png_data
8
- File.open(filename, 'rb') { |f| f.read }
9
- end
10
-
11
- # returns the temp filename of the generated thumbnail
12
- def filename
13
- @filename ||= generate_thumbnail!
14
- end
15
-
16
- private
17
-
18
- # loop till we find the most suitable frame
19
- def suitable_frame
20
- unless @suitable_frame
21
- frames = ['last'] + (0..renderer.max_frames).to_a.reverse
22
-
23
- # render a batch of frames to speed up the process
24
- renderer.render_batch!(frames)
25
-
26
- frames.each do |frame|
27
- @suitable_frame = frame if !@suitable_frame && suitable_frame?(frame)
28
- end
29
-
30
- @suitable_frame ||= 'last'
31
- end
32
-
33
- @suitable_frame
34
- end
35
-
36
- # tests if the given frame no. is suitable for a thumbnail
37
- # tests if the frame doesn't contain a too high concentration of one color
38
- def suitable_frame?(frame)
39
- renderer.frame_exists?(frame) && ColorCounter.new(renderer.frame_filename(frame)).present?
40
- end
41
-
42
- def suitable_frame_filename
43
- @suitable_frame_filename ||= renderer.frame_filename(suitable_frame)
44
- end
45
-
46
- def generate_thumbnail!
47
- super(suitable_frame)
48
- end
49
-
50
- end
51
-
52
- end
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
- require 'thwomp'
3
-
4
- describe Thwomp::SuitableThumbnail do
5
- it 'finds a suitable preview image' do
6
- renderer = Thwomp::Renderer.new("#{File.dirname(__FILE__)}/fixtures/test.swf")
7
- subject = Thwomp::SuitableThumbnail.new(renderer, :max_width => 128, :max_height => 128)
8
-
9
- subject.png_data.should == get_contents("#{File.dirname(__FILE__)}/fixtures/frame5_thumbnail.png")
10
- end
11
- end