Recommend posts on /posts/show based on voting patterns

This commit is contained in:
Albert Yi 2018-07-18 10:54:03 -07:00
parent 93f52adc81
commit d9a1eeacc9
5 changed files with 59 additions and 3 deletions

6
.env
View File

@ -80,8 +80,8 @@
# export DANBOORU_AWS_SQS_REGION=
# export DANBOORU_IQDBS_AUTH_KEY=
# export DANBOORU_IQDBS_SERVER=
# export DANBOORU_CCS_SERVER=
# export DANBOORU_CCS_KEY=
# export DANBOORU_CLOUDFLARE_KEY=
# export DANBOORU_CLOUDFLARE_EMAIL=
# export DANBOORU_CLOUDFLARE_ZONE=
# export DANBOORU_CLOUDFLARE_ZONE=
# export DANBOORU_RECOMMENDER_KEY=
# export DANBOORU_RECOMMENDER_SERVER=

View File

@ -0,0 +1,19 @@
module PostSets
class Similar < PostSets::Post
def initialize(post)
super(tags)
end
def posts
@posts ||= begin
post_ids, scores = RecommenderService.similar(post)
post_ids = post_ids.reject {|x| x == post.id}.slice(0, 5)
Post.find(post_ids)
end
end
def presenter
::Presenters::PostSetPresenters::Post.new(self)
end
end
end

View File

@ -0,0 +1,26 @@
module RecommenderService
extend self
def enabled?
Danbooru.config.recommender_server.present?
end
def available?(post)
enabled? && CurrentUser.id == 1 && post.created_at > 6.months.ago && post.score >= 10
end
def similar(post)
Cache.get("rss:#{post.id}", 1.day) do
resp = HTTParty.get(
"#{Danbooru.config.recommender_server}/similar/#{post.id}",
Danbooru.config.httparty_options.merge(
basic_auth: {
username: "danbooru",
password: Danbooru.config.recommender_key
}
)
)
JSON.parse(resp.body)
end
end
end

View File

@ -0,0 +1,7 @@
<div class="recent-posts">
<p>You might also like:</p>
<div>
<%= PostSets::Similar.new(post).presenter.post_previews_html(self) %>
</div>
</div>

View File

@ -82,6 +82,10 @@
</div>
<% end %>
<% if RecommenderService.available?(@post) %>
<%= render "posts/partials/index/similar", post: @post %>
<% end %>
<% if @post.presenter.has_nav_links?(self) %>
<%= render "posts/partials/show/nav_links", :post => @post, :position => "bottom" %>
<% end %>