oembedder 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c2ab8e015f6d9b3d0435f6a7d421b30913d7850f
4
+ data.tar.gz: 9ef31b3a95ef39424c66e4d02412b1b2e8515d5d
5
+ SHA512:
6
+ metadata.gz: dcbf813253af19b1bfeea40f7ff759b162fc8800644902707dd8717ba3529b8598e9c3b099614431271f052f666580c6b492ce4082b227ce74cff5f370916a2a
7
+ data.tar.gz: 3dbaebece67226d44de78e93e7aa64826f15b0cf6cecc4a1c38ccc1757c85b89c8153f0b8d90c06160e1e805f32241d6684d1b31859b50a7f1dfa0f67b1050a4
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'faraday'
4
+ gem 'faraday_middleware'
5
+ gem 'multi_xml'
6
+
7
+
8
+ # Specify your gem's dependencies in oembedder.gemspec
9
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 k0uki
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Oembedder
2
+
3
+ An oEmbed consumer library
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'oembedder'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install oembedder
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ oe = Oembedder.new
23
+ response = oe.get('http://vimeo.com/84828674')
24
+ puts response.html
25
+ ```
26
+ The method get will return oEmded data.
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it ( https://github.com/[my-github-username]/oembedder/fork )
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
data/lib/oembedder.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'multi_xml'
4
+
5
+ require "oembedder/version"
6
+ require "oembedder/base"
7
+ require "oembedder/consumer_request"
8
+ require "oembedder/provider"
9
+ require "oembedder/provider_response"
10
+
11
+ module Oembedder
12
+ class << self
13
+ def new
14
+ Oembedder::Base.setup
15
+ end
16
+
17
+ def blank
18
+ Oembedder::Base.new
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ module Oembedder
2
+ class Base
3
+ attr_accessor :providers
4
+
5
+ def self.setup
6
+ oembed = Base.new
7
+ oembed.providers << create_vimeo
8
+ oembed.providers << create_dailymotion
9
+ oembed.providers << create_youtube
10
+ oembed
11
+ end
12
+
13
+ def self.create_vimeo
14
+ vimeo = Provider.new
15
+ vimeo.set_endpoint('http://vimeo.com/api/oembed.json')
16
+ vimeo.set_schemes(
17
+ ['http://vimeo.com/*',
18
+ 'http://vimeo.com/channels/*/*',
19
+ 'http://vimeo.com/groups/*/videos/*'])
20
+ vimeo
21
+ end
22
+
23
+ def self.create_dailymotion
24
+ dm = Provider.new(format_type: 'querystring')
25
+ dm.set_endpoint('http://www.dailymotion.com/services/oembed')
26
+ dm.set_schemes(['http://www.dailymotion.com/video/*'])
27
+ dm
28
+ end
29
+
30
+ def self.create_youtube
31
+ youtube = Provider.new(format_type: 'querystring')
32
+ youtube.set_endpoint('http://www.youtube.com/oembed')
33
+ youtube.set_schemes(['http://www.youtube.com/watch?v=*'])
34
+ youtube
35
+ end
36
+
37
+ def initialize
38
+ self.providers = []
39
+ end
40
+
41
+ def get(url, params = {})
42
+ provider = self.find_provider(url)
43
+ provider.get(ConsumerRequest.new(url, params)) if provider
44
+ end
45
+
46
+ def find_provider(target)
47
+ self.providers.each do |pv|
48
+ return pv if pv.match_scheme? target
49
+ end
50
+
51
+ false
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,20 @@
1
+ module Oembedder
2
+
3
+ class ConsumerRequest
4
+ attr_accessor :url, :maxwidth, :maxheight, :format
5
+
6
+ def initialize(url, params = {})
7
+ @url = url
8
+ @maxwidth = params[:maxwidth]
9
+ @maxheight = params[:maxheight]
10
+ @format = params[:format] ||= :json # default is json
11
+ end
12
+
13
+ def urlparams
14
+ param = "?url=#{self.url}"
15
+ param += "&maxwidth=#{self.maxwidth}" if self.maxwidth
16
+ param += "&maxheight=#{self.maxheight}" if self.maxheight
17
+ param
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,60 @@
1
+ module Oembedder
2
+ class Provider
3
+ attr_reader :endpoint, :schemes, :format_type
4
+
5
+ def initialize(params = {})
6
+ params[:format_type] ||= "url" # url or querystring
7
+ @format_type = params[:format_type]
8
+ end
9
+
10
+ def set_endpoint(endpoint)
11
+ @endpoint = URI.parse(endpoint)
12
+ end
13
+
14
+ def set_schemes(schemes)
15
+ @schemes = schemes
16
+ end
17
+
18
+ def match_scheme?(target)
19
+ target.gsub!(/\/$/, '') # delete trailing slash
20
+ mc = self.schemes.count do |scheme|
21
+ pattern = Regexp.escape(scheme).gsub('\\*', '[^/]+')
22
+ match = target.match Regexp.new(pattern)
23
+
24
+ target.size == match.to_s.size unless match.nil?
25
+ end
26
+ true if mc >= 1
27
+ end
28
+
29
+ # get content
30
+ def get(request)
31
+ conn = Faraday.new(:url => "#{self.endpoint.scheme}://#{self.endpoint.host}") do |faraday|
32
+ faraday.request :url_encoded
33
+ # faraday.response :logger
34
+ faraday.response :json, :content_type => /\bjson$/
35
+ faraday.response :xml, :content_type => /\bxml$/
36
+ faraday.adapter Faraday.default_adapter
37
+ end
38
+
39
+ params = request.urlparams
40
+ params += "&format=#{request.format}" if self.format_type == "querystring"
41
+
42
+ response = conn.get(create_request_path(request) + params)
43
+
44
+ ProviderResponse.create(request.format, response)
45
+ end
46
+
47
+ private
48
+ def create_request_path(request)
49
+ if self.format_type == "url"
50
+ if endpoint.path.match /\.\w+$/
51
+ self.endpoint.path.gsub(/\.\w+$/, ".#{request.format}")
52
+ else
53
+ self.endpoint.path + ".#{request.format}"
54
+ end
55
+ else
56
+ self.endpoint.path
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,48 @@
1
+ module Oembedder
2
+ class ProviderResponse
3
+ # attr_reader :type, :version, :title, :author_name, :author_url, :provider_name, :provider_url, :cache_age, :thumbnail_url, :thumbnail_width, :thumbnail_height, :url, :html, :width, :height
4
+ attr_reader :raw_data, :status, :has_error, :format
5
+
6
+ def self.create(format, faraday_response)
7
+ pr = ProviderResponse.new(format: format)
8
+ pr.handle_status faraday_response
9
+ pr.parse faraday_response.body
10
+ pr
11
+ end
12
+
13
+ def initialize(params = {})
14
+ @has_error = false
15
+ @format = params[:format]
16
+ end
17
+
18
+ def handle_status(faraday_response)
19
+ @status = faraday_response.status
20
+ @has_error = true unless faraday_response.status == 200
21
+ end
22
+
23
+ def parse(response)
24
+ @raw_data = response
25
+ end
26
+
27
+ def method_missing(name)
28
+ if data = find_data(name)
29
+ data
30
+ else
31
+ super
32
+ end
33
+ end
34
+
35
+ private
36
+ def find_data(name)
37
+ case self.format
38
+ when :json
39
+ @raw_data[name.to_s] if @raw_data.has_key?(name.to_s)
40
+ when :xml
41
+ @raw_data['oembed'][name.to_s] if @raw_data['oembed'].has_key?(name.to_s)
42
+ else
43
+ false
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module Oembedder
2
+ VERSION = "0.0.1"
3
+ end
data/oembedder.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'oembedder/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "oembedder"
8
+ spec.version = Oembedder::VERSION
9
+ spec.authors = ["k0uki"]
10
+ spec.email = ["k0uki221@gmail.com"]
11
+ spec.summary = "An oEmbed consumer library"
12
+ spec.description = "An oEmbed consumer library"
13
+ spec.homepage = "https://github.com/k0uki/oembedder"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oembedder::ConsumerRequest do
4
+ it 'create urlparams' do
5
+
6
+ cr = Oembedder::ConsumerRequest.new('yahoo.co.jp', maxwidth:1234, maxheight:555, format: :json)
7
+ expect(cr.urlparams).to eq('?url=yahoo.co.jp&maxwidth=1234&maxheight=555')
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oembedder do
4
+ it 'has a version number' do
5
+ expect(Oembedder::VERSION).not_to be nil
6
+ end
7
+
8
+ context 'get vimeo' do
9
+ it 'xml format' do
10
+ oe = Oembedder.new
11
+ response = oe.get('http://vimeo.com/84828674', format: :xml)
12
+ expect(response.title).to eq("The Xsjado Video - JEFF STOCKWELL")
13
+ end
14
+
15
+ it 'json format' do
16
+ oe = Oembedder.new
17
+ response = oe.get('http://vimeo.com/84828674')
18
+ expect(response.title).to eq("The Xsjado Video - JEFF STOCKWELL")
19
+ end
20
+ end
21
+
22
+ context 'daily motion' do
23
+ it 'get video' do
24
+ oe = Oembedder.new
25
+ url = 'http://www.dailymotion.com/video/x1nvvlo_20140412-%E5%B5%90%E3%81%AB%E3%81%97%E3%82%84%E3%81%8C%E3%82%8C-%E6%B0%B4%E5%8D%9C%E9%BA%BB%E7%BE%8E_lifestyle'
26
+ response = oe.get(url, format: :xml)
27
+ expect(response.type).to eq('video')
28
+ end
29
+ end
30
+
31
+ context 'youtube' do
32
+ it 'get video' do
33
+ oe = Oembedder.new
34
+ url = 'http://www.youtube.com/watch?v=Qf60wknp4q0'
35
+ response = oe.get(url, format: :xml)
36
+ expect(response.type).to eq('video')
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oembedder::ProviderResponse do
4
+ it 'parse response' do
5
+ response = {"type"=>"video", "version"=>"1.0", "provider_name"=>"Vimeo"}
6
+ pr = Oembedder::ProviderResponse.new(format: :json)
7
+ pr.parse(response)
8
+
9
+ expect(pr.type).to eq('video')
10
+ expect(pr.provider_name).to eq('Vimeo')
11
+
12
+ expect {pr.type1}.to raise_error(NoMethodError)
13
+ end
14
+
15
+ it 'provider error' do
16
+ oe = Oembedder.new
17
+ response = oe.get('http://vimeo.com/sfds121312')
18
+ expect(response.has_error).to be true
19
+
20
+ response2 = oe.get('http://vimeo.com/84828674')
21
+ expect(response2.has_error).to be_falsy
22
+ end
23
+
24
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oembedder::Provider do
4
+ before do
5
+ @vimeo = Oembedder::Provider.new
6
+ @vimeo.set_endpoint('http://vimeo.com/api/oembed.json')
7
+ @vimeo.set_schemes(
8
+ ['http://vimeo.com/*',
9
+ 'http://vimeo.com/channels/*/*',
10
+ 'http://vimeo.com/groups/*/videos/*'])
11
+ end
12
+
13
+ it 'match scheme' do
14
+ expect(@vimeo.match_scheme? 'http://vimeo.com/84828674').to be true
15
+ expect(@vimeo.match_scheme? 'http://vimeo.com/84828674').to be true
16
+ expect(@vimeo.match_scheme? 'http://vimeo.com/channels/84828674/1234').to be true
17
+ expect(@vimeo.match_scheme? 'http://vimeo.com/groups/1231/videos/121321/').to be true
18
+ end
19
+
20
+ it 'not match scheme' do
21
+ expect(@vimeo.match_scheme? 'http://vimeo.com/failed/831312312/').to be_falsy
22
+ expect(@vimeo.match_scheme? 'http://vimeo.com1/12321312/').to be_falsy
23
+ expect(@vimeo.match_scheme? 'http://vimeo.com/121312/failed').to be_falsy
24
+ end
25
+
26
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'oembedder'
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oembedder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - k0uki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: An oEmbed consumer library
56
+ email:
57
+ - k0uki221@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - lib/oembedder.rb
70
+ - lib/oembedder/base.rb
71
+ - lib/oembedder/consumer_request.rb
72
+ - lib/oembedder/provider.rb
73
+ - lib/oembedder/provider_response.rb
74
+ - lib/oembedder/version.rb
75
+ - oembedder.gemspec
76
+ - spec/consumer_response_spec.rb
77
+ - spec/oembedder_spec.rb
78
+ - spec/provider_response_spec.rb
79
+ - spec/provider_spec.rb
80
+ - spec/spec_helper.rb
81
+ homepage: https://github.com/k0uki/oembedder
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.2.2
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: An oEmbed consumer library
105
+ test_files:
106
+ - spec/consumer_response_spec.rb
107
+ - spec/oembedder_spec.rb
108
+ - spec/provider_response_spec.rb
109
+ - spec/provider_spec.rb
110
+ - spec/spec_helper.rb