porni 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.
- checksums.yaml +7 -0
- data/lib/porni.rb +8 -0
- data/lib/porni/client.rb +25 -0
- data/lib/porni/http_utils.rb +9 -0
- data/lib/porni/hubs/base.rb +5 -0
- data/lib/porni/hubs/client.rb +18 -0
- data/lib/porni/hubs/parser/base.rb +19 -0
- data/lib/porni/hubs/parser/porn_parser.rb +40 -0
- data/lib/porni/hubs/parser/pornhub_parser.rb +54 -0
- data/lib/porni/hubs/parser/redtube_parser.rb +34 -0
- data/lib/porni/hubs/porn.rb +24 -0
- data/lib/porni/hubs/pornhub.rb +24 -0
- data/lib/porni/hubs/redtube.rb +24 -0
- data/lib/porni/hubs/spankbang.rb +17 -0
- data/lib/porni/hubs/xvideos.rb +17 -0
- data/lib/porni/request.rb +36 -0
- data/lib/porni/version.rb +3 -0
- data/lib/porni/video.rb +4 -0
- data/porni.gemspec +27 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4d0013eb4310e5cc0cd7f3badfdc365cef961607
|
4
|
+
data.tar.gz: 69b4c70f747c8571640c9d8813240c429cb19410
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e16039b5c45ed5e89190e96fb5469914f0b3767bfd58fd3a7ff08044f8645495c3e5d15eaa1ef7195199b00e554702bee4772822a32df0fa8b6cb8cf84aa45ce
|
7
|
+
data.tar.gz: 65bfe27ef7d4952c64179499f42ba44f9d79bf6af04bcd58515bc3c8afb103623ea81d0ccc198a3972ff02447a3d8d045aa18b8b1a7b0cbebe147d312a9bdec6
|
data/lib/porni.rb
ADDED
data/lib/porni/client.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'porni/hubs/base'
|
2
|
+
|
3
|
+
module Porni
|
4
|
+
class Client
|
5
|
+
ALLOWED_PAGES = ['porn.com', 'redtube.com', 'pornhub.com']
|
6
|
+
|
7
|
+
def self.get_agent(options = {})
|
8
|
+
page = options[:page]
|
9
|
+
case page
|
10
|
+
when 'porn'
|
11
|
+
Porni::Hubs::Porn.new(options)
|
12
|
+
when 'redtube'
|
13
|
+
Porni::Hubs::Redtube.new(options)
|
14
|
+
when 'xvideos'
|
15
|
+
Porni::Hubs::Xvideos.new(options)
|
16
|
+
when 'spankbang'
|
17
|
+
Porni::Hubs::Spankbang.new(options)
|
18
|
+
when 'pornhub'
|
19
|
+
Porni::Hubs::Pornhub.new(options)
|
20
|
+
else
|
21
|
+
raise Porni::MissingApiError
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Porni
|
2
|
+
module Hubs
|
3
|
+
class Client
|
4
|
+
DEFAULT_TIMEOUT = {
|
5
|
+
connect: 2,
|
6
|
+
read: 5,
|
7
|
+
write: 20,
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
attr_reader :page, :timeout
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
@page = options[:page].to_s.downcase
|
14
|
+
@timeout = DEFAULT_TIMEOUT.merge(options[:timeout] || {})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Porni
|
2
|
+
module Hubs
|
3
|
+
module Parser
|
4
|
+
class Base
|
5
|
+
def initialize(body)
|
6
|
+
@body = body
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.parse_video(body)
|
10
|
+
new(body).parse_video
|
11
|
+
end
|
12
|
+
|
13
|
+
def invalid_attributes
|
14
|
+
{ valid: false, raw: @body }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'porni/video'
|
2
|
+
require 'porni/hubs/parser/base'
|
3
|
+
|
4
|
+
module Porni
|
5
|
+
module Hubs
|
6
|
+
module Parser
|
7
|
+
class PornParser < Base
|
8
|
+
def parse_video
|
9
|
+
if @body["success"]
|
10
|
+
Porni::Video.new(valid_attributes)
|
11
|
+
else
|
12
|
+
Porni::Video.new(invalid_attributes)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_attributes
|
17
|
+
video = @body["result"][0]
|
18
|
+
return invalid_attributes unless video
|
19
|
+
|
20
|
+
{
|
21
|
+
duration: seconds_to_hms(video["duration"]),
|
22
|
+
title: video["title"],
|
23
|
+
thumb: video["thumb"],
|
24
|
+
views: video["views"],
|
25
|
+
channel: video["channel"],
|
26
|
+
tags: video["tags"] || [],
|
27
|
+
pornstars: video["actors"] || [],
|
28
|
+
valid: true,
|
29
|
+
raw: @body
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def seconds_to_hms(sec)
|
35
|
+
[sec / 60 % 60, sec % 60].map{|t| t.to_s.rjust(2,'0')}.join(':')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'porni/video'
|
2
|
+
require 'porni/hubs/parser/base'
|
3
|
+
|
4
|
+
module Porni
|
5
|
+
module Hubs
|
6
|
+
module Parser
|
7
|
+
class PornhubParser < Base
|
8
|
+
def parse_video
|
9
|
+
if @body["video"]
|
10
|
+
Porni::Video.new(valid_attributes)
|
11
|
+
else
|
12
|
+
Porni::Video.new(invalid_attributes)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_attributes
|
17
|
+
video = @body["video"]
|
18
|
+
|
19
|
+
{
|
20
|
+
duration: video["duration"],
|
21
|
+
title: video["title"],
|
22
|
+
thumb: video["default_thumb"] || video["thumb"],
|
23
|
+
views: video["views"],
|
24
|
+
channel: nil,
|
25
|
+
tags: tags(video),
|
26
|
+
pornstars: pornstars(video),
|
27
|
+
valid: true,
|
28
|
+
raw: @body
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def tags(video)
|
34
|
+
all_tags = []
|
35
|
+
if video["tags"]
|
36
|
+
all_tags << video["tags"].map {|tag| tag["tag_name"]}
|
37
|
+
end
|
38
|
+
if video["categories"]
|
39
|
+
all_tags << video["categories"].map {|tag| tag["category"]}
|
40
|
+
end
|
41
|
+
all_tags.flatten
|
42
|
+
end
|
43
|
+
|
44
|
+
def pornstars(video)
|
45
|
+
all_pornstars = []
|
46
|
+
if video["pornstars"]
|
47
|
+
all_pornstars << video["pornstars"].map {|tag| tag["pornstar_name"]}
|
48
|
+
end
|
49
|
+
all_pornstars.flatten
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'porni/video'
|
2
|
+
require 'porni/hubs/parser/base'
|
3
|
+
|
4
|
+
module Porni
|
5
|
+
module Hubs
|
6
|
+
module Parser
|
7
|
+
class RedtubeParser < Base
|
8
|
+
def parse_video
|
9
|
+
if @body["video"]
|
10
|
+
Porni::Video.new(valid_attributes)
|
11
|
+
else
|
12
|
+
Porni::Video.new(invalid_attributes)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_attributes
|
17
|
+
video = @body["video"]
|
18
|
+
|
19
|
+
{
|
20
|
+
duration: video["duration"],
|
21
|
+
title: video["title"],
|
22
|
+
thumb: video["default_thumb"] || video["thumb"],
|
23
|
+
views: video["views"],
|
24
|
+
channel: nil,
|
25
|
+
tags: video["tags"] || [],
|
26
|
+
pornstars: [],
|
27
|
+
valid: true,
|
28
|
+
raw: @body
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'porni/http_utils'
|
2
|
+
require 'porni/hubs/client'
|
3
|
+
require 'porni/hubs/parser/porn_parser'
|
4
|
+
|
5
|
+
module Porni
|
6
|
+
module Hubs
|
7
|
+
class Porn < Client
|
8
|
+
include Porni::HttpUtils
|
9
|
+
|
10
|
+
def base_url
|
11
|
+
"https://api.porn.com/videos"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_video(id)
|
15
|
+
perform_request(:get, "/find.json?id=#{id}", {})
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_video_standardized(id)
|
19
|
+
body = get_video(id)
|
20
|
+
Porni::Hubs::Parser::PornParser.parse_video(body)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'porni/http_utils'
|
2
|
+
require 'porni/hubs/client'
|
3
|
+
require 'porni/hubs/parser/pornhub_parser'
|
4
|
+
|
5
|
+
module Porni
|
6
|
+
module Hubs
|
7
|
+
class Pornhub < Client
|
8
|
+
include Porni::HttpUtils
|
9
|
+
|
10
|
+
def base_url
|
11
|
+
"https://www.pornhub.com/webmasters"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_video(id)
|
15
|
+
perform_request(:get, "/video_by_id?id=#{id}", {})
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_video_standardized(id)
|
19
|
+
body = get_video(id)
|
20
|
+
Porni::Hubs::Parser::PornhubParser.parse_video(body)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'porni/http_utils'
|
2
|
+
require 'porni/hubs/client'
|
3
|
+
require 'porni/hubs/parser/redtube_parser'
|
4
|
+
|
5
|
+
module Porni
|
6
|
+
module Hubs
|
7
|
+
class Redtube < Client
|
8
|
+
include Porni::HttpUtils
|
9
|
+
|
10
|
+
def base_url
|
11
|
+
"https://api.redtube.com"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_video(id)
|
15
|
+
perform_request(:get, "/?data=redtube.Videos.getVideoById&video_id=#{id}&output=json&thumbsize=all", {})
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_video_standardized(id)
|
19
|
+
body = get_video(id)
|
20
|
+
Porni::Hubs::Parser::RedtubeParser.parse_video(body)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'http'
|
2
|
+
require 'oj'
|
3
|
+
require 'addressable/uri'
|
4
|
+
|
5
|
+
module Porni
|
6
|
+
class Request
|
7
|
+
def initialize(client, request_method, path, options = {})
|
8
|
+
@client = client
|
9
|
+
@request_method = request_method
|
10
|
+
@uri = Addressable::URI.parse(@client.base_url + path)
|
11
|
+
@headers = options[:headers] || {}
|
12
|
+
@path = @uri.path
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def perform
|
17
|
+
options_key = @request_method == :get ? :params : :form
|
18
|
+
response = http_client.public_send(@request_method, @uri.to_s)
|
19
|
+
|
20
|
+
STDERR.puts response.body if ENV['DEBUG'] == 'true'
|
21
|
+
|
22
|
+
fail_or_return(response.code, response.body.empty? ? '' : Oj.load(response.to_s, mode: :null))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def fail_or_return(code, body)
|
28
|
+
raise if code >= 300
|
29
|
+
body
|
30
|
+
end
|
31
|
+
|
32
|
+
def http_client
|
33
|
+
HTTP.timeout(connect: @client.timeout[:connect], read: @client.timeout[:read], write: @client.timeout[:write])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/porni/video.rb
ADDED
data/porni.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "porni/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "porni"
|
8
|
+
spec.version = Porni::VERSION
|
9
|
+
spec.authors = ["FastFaps"]
|
10
|
+
spec.email = ["marvelousito@fastfaps.com"]
|
11
|
+
spec.summary = "API from principal porn sites"
|
12
|
+
spec.description = "Gem works with pornhub.com, redtube.com, porn.com"
|
13
|
+
spec.homepage = "https://github.com/fastfaps/porni"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
# Specify which files should be added to the gem when it is released.
|
17
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
18
|
+
spec.files = %w(porni.gemspec) + Dir['lib/**/*.rb']
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
24
|
+
spec.add_dependency 'http', '~> 4.1'
|
25
|
+
spec.add_dependency 'oj', '~> 3.7'
|
26
|
+
spec.add_dependency 'addressable', '~> 2.6'
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: porni
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- FastFaps
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-08 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: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.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: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: http
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: oj
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.7'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: addressable
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.6'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.6'
|
97
|
+
description: Gem works with pornhub.com, redtube.com, porn.com
|
98
|
+
email:
|
99
|
+
- marvelousito@fastfaps.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- lib/porni.rb
|
105
|
+
- lib/porni/client.rb
|
106
|
+
- lib/porni/http_utils.rb
|
107
|
+
- lib/porni/hubs/base.rb
|
108
|
+
- lib/porni/hubs/client.rb
|
109
|
+
- lib/porni/hubs/parser/base.rb
|
110
|
+
- lib/porni/hubs/parser/porn_parser.rb
|
111
|
+
- lib/porni/hubs/parser/pornhub_parser.rb
|
112
|
+
- lib/porni/hubs/parser/redtube_parser.rb
|
113
|
+
- lib/porni/hubs/porn.rb
|
114
|
+
- lib/porni/hubs/pornhub.rb
|
115
|
+
- lib/porni/hubs/redtube.rb
|
116
|
+
- lib/porni/hubs/spankbang.rb
|
117
|
+
- lib/porni/hubs/xvideos.rb
|
118
|
+
- lib/porni/request.rb
|
119
|
+
- lib/porni/version.rb
|
120
|
+
- lib/porni/video.rb
|
121
|
+
- porni.gemspec
|
122
|
+
homepage: https://github.com/fastfaps/porni
|
123
|
+
licenses:
|
124
|
+
- MIT
|
125
|
+
metadata: {}
|
126
|
+
post_install_message:
|
127
|
+
rdoc_options: []
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
requirements: []
|
141
|
+
rubyforge_project:
|
142
|
+
rubygems_version: 2.6.11
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: API from principal porn sites
|
146
|
+
test_files: []
|