fappu 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/Gemfile +14 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +64 -0
  6. data/Rakefile +6 -0
  7. data/fappu.gemspec +27 -0
  8. data/fixtures/cassettes/Fappu_Manga/The_manga_is_Right_now_while_cleaning_the_pool_/_download_url/returns_the_download_link.yml +53 -0
  9. data/fixtures/cassettes/Fappu_Manga/The_manga_is_Right_now_while_cleaning_the_pool_/_related/behaves_like_a_manga_collection/.yml +103 -0
  10. data/fixtures/cassettes/Fappu_Manga/The_manga_is_Right_now_while_cleaning_the_pool_/_related/behaves_like_a_manga_collection/returns_an_array_of_Mangas.yml +103 -0
  11. data/fixtures/cassettes/Fappu_Manga/The_manga_is_Right_now_while_cleaning_the_pool_/_related/should_include_related_manga_related_to_pool_sex.yml +103 -0
  12. data/fixtures/cassettes/Fappu_Tag/_list/.yml +273 -0
  13. data/fixtures/cassettes/Fappu_Tag/_list/should_return_an_array_of_tag_objects.yml +273 -0
  14. data/fixtures/cassettes/connection.yml +203 -0
  15. data/fixtures/cassettes/heck.yml +203 -0
  16. data/fixtures/cassettes/manga.yml +221 -0
  17. data/fixtures/cassettes/manga_read_pool_sex.yml +58 -0
  18. data/fixtures/cassettes/pool_cleaning_comments.yml +107 -0
  19. data/fixtures/cassettes/pool_cleaning_top_comments.yml +107 -0
  20. data/fixtures/cassettes/related_pool_sex_manga.yml +103 -0
  21. data/fixtures/cassettes/search_tagged_netorare.yml +96 -0
  22. data/fixtures/cassettes/search_term_sao.yml +98 -0
  23. data/index.html +0 -0
  24. data/lib/fappu.rb +11 -0
  25. data/lib/fappu/comment.rb +27 -0
  26. data/lib/fappu/connection.rb +21 -0
  27. data/lib/fappu/manga.rb +106 -0
  28. data/lib/fappu/page.rb +29 -0
  29. data/lib/fappu/search.rb +105 -0
  30. data/lib/fappu/tag.rb +33 -0
  31. data/lib/fappu/version.rb +3 -0
  32. data/spec/lib/fappu/connection_spec.rb +23 -0
  33. data/spec/lib/fappu/manga_spec.rb +49 -0
  34. data/spec/lib/fappu/page_spec.rb +18 -0
  35. data/spec/lib/fappu/search_spec.rb +149 -0
  36. data/spec/lib/fappu/tag_spec.rb +14 -0
  37. data/spec/lib/fappu_spec.rb +4 -0
  38. data/spec/shared_examples.rb +10 -0
  39. data/spec/spec_helper.rb +24 -0
  40. metadata +146 -0
@@ -0,0 +1,98 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.fakku.net/search/sword%20art%20online
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - cloudflare-nginx
23
+ Date:
24
+ - Fri, 08 Aug 2014 08:09:31 GMT
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Set-Cookie:
32
+ - __cfduid=d02b901001e0a18cf575737bbb61131c41407485371417; expires=Mon, 23-Dec-2019
33
+ 23:50:00 GMT; path=/; domain=.fakku.net; HttpOnly
34
+ Access-Control-Allow-Origin:
35
+ - '*'
36
+ X-Varnish:
37
+ - '849060859'
38
+ Age:
39
+ - '0'
40
+ Via:
41
+ - 1.1 varnish
42
+ X-Cache:
43
+ - MISS
44
+ Dicks:
45
+ - PH
46
+ Cf-Ray:
47
+ - 156a3b7352ac0bb1-HKG
48
+ body:
49
+ encoding: UTF-8
50
+ string: '{"content":[{"content_name":"Sword Art Unlimited","content_url":"http:\/\/www.fakku.net\/doujinshi\/sword-art-unlimited-english","content_description":"CONTAINS
51
+ MILD SWORD ART ONLINE SPOILERS.\r\n\r\nVisit us at http:\/\/ufw.arinashi.com\/
52
+ for downloads and more releases.","content_language":"english","content_category":"doujinshi","content_date":1344990979,"content_filesize":59,"content_favorites":3521,"content_comments":130,"content_pages":32,"content_poster":"Raze","content_poster_url":"http:\/\/www.fakku.net\/users\/raze","content_tags":[{"attribute":"Color","attribute_link":"\/tags\/color"},{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"UFW","attribute_link":"\/translators\/ufw"}],"content_series":[{"attribute":"Sword
53
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"ASTRO
54
+ CREEP","attribute_link":"\/artists\/astro-creep"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartunlimited_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartunlimited_e\/thumbs\/015.thumb.jpg"}},{"content_name":"Sword
55
+ Art Offline -Silica Route-","content_url":"http:\/\/www.fakku.net\/doujinshi\/sword-art-offline-silica-route-english","content_description":"No
56
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1347254938,"content_filesize":23,"content_favorites":1332,"content_comments":66,"content_pages":18,"content_poster":"Anonymous","content_poster_url":"http:\/\/www.fakku.net\/users\/anonymous","content_tags":[{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oral","attribute_link":"\/tags\/oral"},{"attribute":"Stockings","attribute_link":"\/tags\/stockings"},{"attribute":"Pettanko","attribute_link":"\/tags\/pettanko"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Team
57
+ Vanilla","attribute_link":"\/translators\/team-vanilla"}],"content_series":[{"attribute":"Sword
58
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Ahiru
59
+ Okano","attribute_link":"\/artists\/ahiru-okano"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartofflinesilicaroute_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartofflinesilicaroute_e\/thumbs\/004.thumb.jpg"}},{"content_name":"Sword
60
+ Art Extra","content_url":"http:\/\/www.fakku.net\/doujinshi\/sword-art-extra-english","content_description":"Brought
61
+ to you by http:\/\/life4kaoru.wordpress.com\/","content_language":"english","content_category":"doujinshi","content_date":1330745989,"content_filesize":21,"content_favorites":3321,"content_comments":89,"content_pages":21,"content_poster":"HououinKyouma","content_poster_url":"http:\/\/www.fakku.net\/users\/hououinkyouma","content_tags":[{"attribute":"Color","attribute_link":"\/tags\/color"},{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Kemonomimi","attribute_link":"\/tags\/kemonomimi"},{"attribute":"Stockings","attribute_link":"\/tags\/stockings"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Life4Kaoru","attribute_link":"\/translators\/life4kaoru"}],"content_series":[{"attribute":"Sword
62
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"ASTRO
63
+ CREEP","attribute_link":"\/artists\/astro-creep"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartextra_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/s\/swordartextra_e\/thumbs\/013.thumb.jpg"}},{"content_name":"SPECIAL
64
+ ASUNA ONLINE 2","content_url":"http:\/\/www.fakku.net\/doujinshi\/special-asuna-online-2-english","content_description":"No
65
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1395787581,"content_filesize":21936400,"content_favorites":677,"content_comments":19,"content_pages":26,"content_poster":"biribiri","content_poster_url":"http:\/\/www.fakku.net\/users\/biribiri","content_tags":[{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oral","attribute_link":"\/tags\/oral"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"},{"attribute":"Ahegao","attribute_link":"\/tags\/ahegao"}],"content_translators":[{"attribute":"biribiri","attribute_link":"\/translators\/biribiri"}],"content_series":[{"attribute":"Sword
66
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Nama
67
+ Cream Biyori","attribute_link":"\/artists\/nama-cream-biyori"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/s\/[Nama_Cream_Biyori]_Sword_Art_Online_-_SPECIAL_ASUNA_ONLINE_2\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/s\/[Nama_Cream_Biyori]_Sword_Art_Online_-_SPECIAL_ASUNA_ONLINE_2\/thumbs\/006.thumb.jpg"}},{"content_name":"Sister
68
+ Affection Online","content_url":"http:\/\/www.fakku.net\/doujinshi\/sister-affection-online-english","content_description":"No
69
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1358737668,"content_filesize":11,"content_favorites":1331,"content_comments":46,"content_pages":19,"content_poster":"Anonymous","content_poster_url":"http:\/\/www.fakku.net\/users\/anonymous","content_tags":[{"attribute":"Paizuri","attribute_link":"\/tags\/paizuri"},{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Usual
70
+ Translations","attribute_link":"\/translators\/usual-translations"}],"content_series":[{"attribute":"Sword
71
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Primal
72
+ Gym","attribute_link":"\/artists\/primal-gym"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/s\/sisteraffectiononline_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/s\/sisteraffectiononline_e\/thumbs\/006.thumb.jpg"}},{"content_name":"Lisbeth...
73
+ Kirito ni wa Suterare, Kyaku ni wa Okasare Nakadashi Ninshin... Asuna to no
74
+ Kakusa ga Hirogaru Online","content_url":"http:\/\/www.fakku.net\/doujinshi\/lisbeth-kirito-ni-wa-suterare-kyaku-ni-wa-okasare-nakadashi-ninshin-asuna-to-no-kakusa-ga-hirogaru-online-english","content_description":"To
75
+ survive in the world of business and trade, you need to expand to other outlets
76
+ if necessary.","content_language":"english","content_category":"doujinshi","content_date":1358570012,"content_filesize":5,"content_favorites":899,"content_comments":37,"content_pages":26,"content_poster":"CGrascal","content_poster_url":"http:\/\/www.fakku.net\/users\/cgrascal","content_tags":[{"attribute":"Paizuri","attribute_link":"\/tags\/paizuri"},{"attribute":"Anal","attribute_link":"\/tags\/anal"},{"attribute":"Oral","attribute_link":"\/tags\/oral"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Group","attribute_link":"\/tags\/group"}],"content_translators":[{"attribute":"CGRascal","attribute_link":"\/translators\/cgrascal"}],"content_series":[{"attribute":"Sword
77
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Studio
78
+ Nunchaku","attribute_link":"\/artists\/studio-nunchaku"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/l\/lisbethkiritoniwasuterarekyakuniwaokasarenakadashininshinasunatonokakusagahirogaruonline_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/l\/lisbethkiritoniwasuterarekyakuniwaokasarenakadashininshinasunatonokakusagahirogaruonline_e\/thumbs\/013.thumb.jpg"}},{"content_name":"Asuna
79
+ to Online","content_url":"http:\/\/www.fakku.net\/doujinshi\/asuna-to-online-english","content_description":"No
80
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1345456629,"content_filesize":17,"content_favorites":1801,"content_comments":50,"content_pages":23,"content_poster":"Anonymous","content_poster_url":"http:\/\/www.fakku.net\/users\/anonymous","content_tags":[{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oral","attribute_link":"\/tags\/oral"},{"attribute":"Stockings","attribute_link":"\/tags\/stockings"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Team
81
+ Vanilla","attribute_link":"\/translators\/team-vanilla"}],"content_series":[{"attribute":"Sword
82
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Mugenkidou
83
+ A","attribute_link":"\/artists\/mugenkidou-a"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/a\/asunatoonline_e\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/a\/asunatoonline_e\/thumbs\/014.thumb.jpg"}},{"content_name":"KARORFUL
84
+ MIX EX10","content_url":"http:\/\/www.fakku.net\/doujinshi\/karorful-mix-ex10-english","content_description":"Final
85
+ release for the SAO festival. Enjoy!","content_language":"english","content_category":"doujinshi","content_date":1405430220,"content_filesize":60230000,"content_favorites":1288,"content_comments":41,"content_pages":27,"content_poster":"EdMX","content_poster_url":"http:\/\/www.fakku.net\/users\/edmx","content_tags":[{"attribute":"Color","attribute_link":"\/tags\/color"},{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Genesis
86
+ Translations","attribute_link":"\/translators\/genesis-translations"}],"content_series":[{"attribute":"Sword
87
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Karomix","attribute_link":"\/artists\/karomix"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/k\/[Karomix]_Sword_Art_Online_-_KARORFUL_MIX_EX10\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/k\/[Karomix]_Sword_Art_Online_-_KARORFUL_MIX_EX10\/thumbs\/010.thumb.jpg"}},{"content_name":"KARORFUL
88
+ MIX EX9","content_url":"http:\/\/www.fakku.net\/doujinshi\/karorful-mix-ex9","content_description":"No
89
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1404829197,"content_filesize":41698800,"content_favorites":975,"content_comments":33,"content_pages":20,"content_poster":"Tech","content_poster_url":"http:\/\/www.fakku.net\/users\/tech","content_tags":[{"attribute":"Color","attribute_link":"\/tags\/color"},{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Genesis
90
+ Translations","attribute_link":"\/translators\/genesis-translations"}],"content_series":[{"attribute":"Sword
91
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Karomix","attribute_link":"\/artists\/karomix"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/k\/[Karomix]_Sword_Art_Online_-_KAROMIX_EX9\/thumbs\/002.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/k\/[Karomix]_Sword_Art_Online_-_KAROMIX_EX9\/thumbs\/014.thumb.jpg"}},{"content_name":"no
92
+ passage","content_url":"http:\/\/www.fakku.net\/doujinshi\/no-passage-english","content_description":"No
93
+ description has been written.","content_language":"english","content_category":"doujinshi","content_date":1404401594,"content_filesize":23235100,"content_favorites":1332,"content_comments":38,"content_pages":29,"content_poster":"Tech","content_poster_url":"http:\/\/www.fakku.net\/users\/tech","content_tags":[{"attribute":"Vanilla","attribute_link":"\/tags\/vanilla"},{"attribute":"Oppai","attribute_link":"\/tags\/oppai"},{"attribute":"Incest","attribute_link":"\/tags\/incest"},{"attribute":"Hentai","attribute_link":"\/tags\/hentai"}],"content_translators":[{"attribute":"Genesis
94
+ Translations","attribute_link":"\/translators\/genesis-translations"}],"content_series":[{"attribute":"Sword
95
+ Art Online","attribute_link":"\/series\/sword-art-online"}],"content_artists":[{"attribute":"Tracklisko","attribute_link":"\/artists\/tracklisko"}],"content_images":{"cover":"https:\/\/t.fakku.net\/images\/manga\/n\/[Tracklisko]_Sword_Art_Online_-_no_passage\/thumbs\/001.thumb.jpg","sample":"https:\/\/t.fakku.net\/images\/manga\/n\/[Tracklisko]_Sword_Art_Online_-_no_passage\/thumbs\/015.thumb.jpg"}}],"total":60,"page":1,"pages":6}'
96
+ http_version:
97
+ recorded_at: Fri, 08 Aug 2014 08:09:26 GMT
98
+ recorded_with: VCR 2.9.2
File without changes
@@ -0,0 +1,11 @@
1
+ require "fappu/version"
2
+
3
+ require 'open-uri'
4
+ require 'json'
5
+
6
+ require "fappu/connection"
7
+ require "fappu/comment"
8
+ require "fappu/manga"
9
+ require "fappu/page"
10
+ require "fappu/tag"
11
+ require "fappu/search"
@@ -0,0 +1,27 @@
1
+ module Fappu
2
+ class Comment
3
+ attr_accessor :id, :attached_id, :poster, :poster_url, :reputation,
4
+ :text, :date
5
+
6
+ def initialize args
7
+ comment_args = comment_parameters(args)
8
+ comment_args.each do |k,v|
9
+ instance_variable_set("@#{k}",v) unless v.nil?
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def comment_parameters(comment)
16
+ params = {
17
+ title: comment["comment_id"],
18
+ attached_id: comment["comment_attached_id"],
19
+ poster: comment["comment_poster"],
20
+ poster_url: comment["comment_poster_url"],
21
+ reputation: comment["comment_reputation"],
22
+ body: comment["comment_text"],
23
+ date: comment["comment_date"]
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ module Fappu
2
+ class Connection
3
+
4
+ attr_accessor :base_url, :title, :url, :documentation, :response, :body
5
+
6
+ def initialize(settings={})
7
+ @base_url = settings[:base_url] || "https://api.fakku.net/index"
8
+
9
+ # @response = RestClient.get @base_url
10
+ @response = URI.parse(@base_url).read
11
+
12
+ @body = JSON.parse @response
13
+ @title = @response['title']
14
+ end
15
+
16
+ def base_url
17
+ @base_url || "https://api.fakku.net"
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,106 @@
1
+ module Fappu
2
+ class Manga
3
+
4
+ attr_accessor :title, :url, :description, :language, :category, :date, :filesize,
5
+ :favorites, :comment_count, :page_count, :poster, :poster_url, :tags, :translators,
6
+ :series, :artists, :images, :tags
7
+
8
+
9
+ def initialize args
10
+ tags = args.delete(:tags)
11
+
12
+ args.each do |k,v|
13
+ instance_variable_set("@#{k}",v) unless v.nil?
14
+ end
15
+
16
+ set_tags(tags) if tags
17
+ end
18
+
19
+
20
+ def top_comments
21
+ response = JSON.parse( URI.parse(comment_api_url + "/top").read )
22
+ arr = response['comments']
23
+
24
+ arr.collect do |comment|
25
+ Fappu::Comment.new(comment)
26
+ end
27
+ end
28
+
29
+
30
+ def related
31
+ Fappu::Search.related(self)
32
+ end
33
+
34
+ def download_url
35
+ response = JSON.parse ( URI.parse(download_api_url).read )
36
+ response['downloads'].collect do |d|
37
+ d['download_url']
38
+ end
39
+ end
40
+
41
+ def pages
42
+ response = JSON.parse( URI.parse(read_online_url).read )
43
+ arr = response['pages']
44
+
45
+ arr.collect do |k,v|
46
+ Fappu::Page.new_from_json({k => v})
47
+ end
48
+ end
49
+
50
+ # WIP : Wait for API to be fixed
51
+ def comments(page = 1)
52
+ response = JSON.parse( URI.parse(comment_api_url + "/page/#{page}").read )
53
+ arr = response['comments']
54
+
55
+ arr.collect do |comment|
56
+ Fappu::Comment.new(comment)
57
+ end
58
+ end
59
+
60
+ def base_api_url
61
+ base_api_url = URI(url)
62
+
63
+ new_host = base_api_url.host.split('.')
64
+ new_host[0] = 'api'
65
+
66
+ base_api_url.host = new_host.join('.')
67
+ base_api_url.scheme = 'https'
68
+ base_api_url
69
+ end
70
+
71
+ private
72
+
73
+ def related_api_url
74
+ comment_url = base_api_url
75
+ comment_url.path += "/related"
76
+ comment_url.to_s
77
+ end
78
+
79
+ def download_api_url
80
+ comment_url = base_api_url
81
+ comment_url.path += "/download"
82
+ comment_url.to_s
83
+ end
84
+
85
+ def set_tags(tags)
86
+ @tags = tags.collect do |tag|
87
+ Fappu::Tag.new(name: tag['attribute'], url: tag['attribute_link'])
88
+ end
89
+ end
90
+
91
+ def read_online_url
92
+ read_url = base_api_url
93
+ read_url.path += '/read'
94
+ read_url.to_s
95
+ end
96
+
97
+
98
+
99
+ def comment_api_url
100
+ comment_url = base_api_url
101
+ comment_url.path += "/comments"
102
+ comment_url.to_s
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,29 @@
1
+ module Fappu
2
+ class Page
3
+
4
+ attr_accessor :thumbnail_url, :image_url, :page_number
5
+
6
+ def initialize(args={})
7
+ args.each do |k,v|
8
+ instance_variable_set("@#{k}",v) unless v.nil?
9
+ end
10
+ end
11
+
12
+ # Receies page has
13
+ # ex. self.new_from_json({'1' => { thumb => 'xx', image => 'yy')}})
14
+ #
15
+ # Returns
16
+ # #<Page @page_number: 1, @thumbnail_url: 'xx', @image_url: 'yy>
17
+ def self.new_from_json(args)
18
+ page = Page.new
19
+ args.each do |k,v|
20
+ page.page_number = k
21
+ page.thumbnail_url = v["thumb"]
22
+ page.image_url = v["image"]
23
+ end
24
+ page
25
+ end
26
+
27
+ end
28
+ end
29
+
@@ -0,0 +1,105 @@
1
+ module Fappu
2
+ module Search
3
+
4
+ module_function
5
+ URL = "https://api.fakku.net/manga"
6
+
7
+ def self.tagged(tag)
8
+ tag.downcase!
9
+ url = "https://api.fakku.net/tags/#{tag}"
10
+ response = JSON.parse( URI.parse(url).read )
11
+ arr = response["content"]
12
+
13
+ arr.collect do |manga|
14
+ Fappu::Manga.new(manga_parameters(manga))
15
+ end
16
+ end
17
+
18
+ def self.terms(search_terms)
19
+ search_terms.downcase!
20
+ search_terms = URI.encode(search_terms)
21
+ url = "https://api.fakku.net/search/#{search_terms}"
22
+ response = JSON.parse( URI.parse(url).read )
23
+ arr = response["content"]
24
+
25
+ arr.collect do |manga|
26
+ Fappu::Manga.new(manga_parameters(manga))
27
+ end
28
+ end
29
+
30
+ # Returns an array of the latest mangas as Manga instances
31
+ def self.latest
32
+ response = JSON.parse( URI.parse("https://api.fakku.net/manga").read )
33
+ arr = response["latest"]
34
+
35
+ arr.collect do |manga|
36
+ Fappu::Manga.new(manga_parameters(manga))
37
+ end
38
+ end
39
+
40
+ # Returns an array of the most favorite'd mangas as Manga instances
41
+ def self.favorites
42
+ response = JSON.parse( URI.parse("https://api.fakku.net/manga").read )
43
+ arr = response["favorites"]
44
+
45
+ arr.collect do |manga|
46
+ Fappu::Manga.new(manga_parameters(manga))
47
+ end
48
+ end
49
+
50
+ # Returns an array of the most popular mangas as Manga instances
51
+ def self.popular
52
+ response = JSON.parse( URI.parse("https://api.fakku.net/manga").read )
53
+ arr = response["popular"]
54
+
55
+ arr.collect do |manga|
56
+ Fappu::Manga.new(manga_parameters(manga))
57
+ end
58
+ end
59
+
60
+ # Returns an array of the most controversial mangas as Manga instances
61
+ def self.controversial
62
+ response = JSON.parse( URI.parse("https://api.fakku.net/manga").read )
63
+ arr = response["controversial"]
64
+
65
+ arr.collect do |manga|
66
+ Fappu::Manga.new(manga_parameters(manga))
67
+ end
68
+ end
69
+
70
+ # Returns an array of related mangas
71
+ def self.related(manga)
72
+ response = JSON.parse ( URI.parse(manga.base_api_url.to_s + "/related").read )
73
+ arr = response["related"]
74
+
75
+ arr.collect do |m|
76
+ Fappu::Manga.new(manga_parameters(m))
77
+ end
78
+ end
79
+ private
80
+
81
+ # Removes the 'content' suffix for manga attributes from the json response
82
+ def self.manga_parameters(raw_manga_params)
83
+ params = {
84
+ title: raw_manga_params["content_name"],
85
+ url: raw_manga_params["content_url"],
86
+ description: raw_manga_params["content_description"],
87
+ language: raw_manga_params["content_language"],
88
+ category: raw_manga_params["content_category"],
89
+ date: raw_manga_params["content_date"],
90
+ filesize: raw_manga_params["content_filesize"],
91
+ favorites: raw_manga_params["content_favorites"],
92
+ comment_count: raw_manga_params["content_comments"],
93
+ page_count: raw_manga_params["content_pages"],
94
+ poster: raw_manga_params["content_poster"],
95
+ poster_url: raw_manga_params["content_poster_url"],
96
+ tags: raw_manga_params["content_tags"],
97
+ translators: raw_manga_params["content_translators"],
98
+ series: raw_manga_params["content_series"],
99
+ artists: raw_manga_params["content_artists"],
100
+ images: raw_manga_params["content_images"],
101
+ tags: raw_manga_params["content_tags"]
102
+ }
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,33 @@
1
+ module Fappu
2
+ class Tag
3
+
4
+ attr_accessor :name, :url
5
+ URL = "https://api.fakku.net/tags"
6
+
7
+ def initialize args
8
+ args.each do |k,v|
9
+ instance_variable_set("@#{k}",v) unless v.nil?
10
+ end
11
+ end
12
+
13
+ def self.list
14
+ response = JSON.parse( URI.parse(URL).read )
15
+ arr = response["tags"]
16
+
17
+ arr.collect do |tag|
18
+ self.new(tag_parameters(tag))
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def self.tag_parameters(tag)
25
+ params = {
26
+ name: tag["tag_name"],
27
+ url: tag["tag_url"]
28
+ }
29
+ end
30
+
31
+
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ module Fappu
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fappu::Connection, vcr: {cassette_name: 'connection'} do
4
+ describe ".new" do
5
+ subject { described_class.new }
6
+
7
+ it {expect(subject).to be_a Fappu::Connection}
8
+
9
+ it "defaults to Fakku's API url" do
10
+ expect(subject.base_url).to eq("https://api.fakku.net/index")
11
+ end
12
+
13
+ end
14
+
15
+ describe "#body" do
16
+ subject {described_class.new.body}
17
+ it "lists info about hentai mangoes" do
18
+ expect(subject['total']).to be > 0
19
+ end
20
+ end
21
+
22
+
23
+ end