add mock recommender service for development, add user-context recommended posts
This commit is contained in:
@@ -452,6 +452,9 @@
|
||||
$("#edit").hide();
|
||||
$("#share").hide();
|
||||
$("#recommended").show();
|
||||
$.get("/recommended_posts", {context: "post", post_id: Danbooru.meta("post-id")}, function(data) {
|
||||
$("#recommended").html(data);
|
||||
});
|
||||
} else {
|
||||
$("#edit").hide();
|
||||
$("#comments").hide();
|
||||
|
||||
23
app/controllers/recommended_posts_controller.rb
Normal file
23
app/controllers/recommended_posts_controller.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
class RecommendedPostsController < ApplicationController
|
||||
before_action :member_only
|
||||
respond_to :html
|
||||
|
||||
def show
|
||||
@posts = load_posts()
|
||||
|
||||
if request.xhr?
|
||||
render partial: "show", layout: false
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_posts
|
||||
if params[:context] == "post"
|
||||
@posts = RecommenderService.recommend(post_id: params[:post_id])
|
||||
|
||||
elsif params[:context] == "user"
|
||||
@posts = RecommenderService.recommend(user_id: CurrentUser.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,16 +1,10 @@
|
||||
module PostSets
|
||||
class Recommended < PostSets::Post
|
||||
def initialize(post)
|
||||
attr_reader :posts
|
||||
|
||||
def initialize(posts)
|
||||
super("")
|
||||
@post = post
|
||||
end
|
||||
|
||||
def posts
|
||||
@posts ||= begin
|
||||
response = RecommenderService.similar(@post)
|
||||
post_ids = response.reject {|x| x[0] == @post.id}.slice(0, 6).map {|x| x[0]}
|
||||
::Post.find(post_ids)
|
||||
end
|
||||
@posts = posts
|
||||
end
|
||||
|
||||
def presenter
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
module RecommenderService
|
||||
extend self
|
||||
|
||||
SCORE_THRESHOLD = 10
|
||||
SCORE_THRESHOLD = 5
|
||||
|
||||
def enabled?
|
||||
Danbooru.config.recommender_server.present?
|
||||
end
|
||||
|
||||
def available?(post)
|
||||
def available_for_post?(post)
|
||||
return true if Rails.env.development?
|
||||
|
||||
enabled? && CurrentUser.enable_recommended_posts? && post.created_at > Date.civil(2018, 1, 1) && post.score >= SCORE_THRESHOLD
|
||||
end
|
||||
|
||||
def similar(post)
|
||||
if Danbooru.config.recommender_server == "development"
|
||||
return Post.order("random()").limit(6).map {|x| [x.id, "1.000"]}
|
||||
end
|
||||
def available_for_user?
|
||||
enabled? && CurrentUser.is_gold?
|
||||
end
|
||||
|
||||
Cache.get("rss:#{post.id}", 1.day) do
|
||||
def recommend_for_user(user_id)
|
||||
ids = Cache.get("rsu:#{user_id}", 1.day) do
|
||||
resp = HTTParty.get(
|
||||
"#{Danbooru.config.recommender_server}/similar/#{post.id}",
|
||||
"#{Danbooru.config.recommender_server}/recommend/#{user_id}",
|
||||
Danbooru.config.httparty_options.merge(
|
||||
basic_auth: {
|
||||
username: "danbooru",
|
||||
@@ -29,5 +30,30 @@ module RecommenderService
|
||||
)
|
||||
JSON.parse(resp.body)
|
||||
end
|
||||
Post.find(ids.map(&:first))
|
||||
end
|
||||
|
||||
def recommend_for_post(post_id)
|
||||
ids = 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
|
||||
Post.find(ids.reject {|x| x[0] == post_id}.map(&:first))
|
||||
end
|
||||
|
||||
def recommend(post_id: nil, user_id: nil)
|
||||
if post_id
|
||||
recommend_for_post(post_id)
|
||||
elsif user_id
|
||||
recommend_for_user(user_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
<li><%= link_to "Listing", posts_path %></li>
|
||||
<li id="secondary-links-posts-upload" class="nonessential"><%= link_to "Upload", new_upload_path %></li>
|
||||
<li id="secondary-links-posts-hot"><%= link_to "Hot", posts_path(:tags => "order:rank", :d => "1") %></li>
|
||||
<% if RecommenderService.available_for_user? %>
|
||||
<li><%= link_to "Recommended", recommended_posts_path(context: "user") %></li>
|
||||
<% end %>
|
||||
<% unless CurrentUser.is_anonymous? %>
|
||||
<li id="secondary-links-posts-favorites"><%= link_to "Favorites", favorites_path %></li>
|
||||
<li id="secondary-links-posts-favorite-groups"><%= link_to "Fav groups", favorite_groups_path %></li>
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
<menu id="post-sections">
|
||||
<li><a href="#comments">Comments</a></li>
|
||||
|
||||
<% if RecommenderService.enabled? %>
|
||||
<% if RecommenderService.available_for_post?(@post) %>
|
||||
<li><a href="#recommended">Recommended</a></li>
|
||||
<% end %>
|
||||
|
||||
@@ -100,13 +100,11 @@
|
||||
<li><a href="#share">Share</a></li>
|
||||
</menu>
|
||||
|
||||
<section id="recommended" data-available="<%= RecommenderService.available?(@post) %>">
|
||||
<% if RecommenderService.available?(@post) %>
|
||||
<%= render "posts/partials/index/recommended", post: @post %>
|
||||
<% else %>
|
||||
<p><em>Not enough data available</em></p>
|
||||
<% end %>
|
||||
</section>
|
||||
<% if RecommenderService.available_for_post?(@post) %>
|
||||
<section id="recommended">
|
||||
<p><em>Loading...</em></p>
|
||||
</section>
|
||||
<% end %>
|
||||
|
||||
<section id="comments">
|
||||
<% if !CurrentUser.user.is_builder? %>
|
||||
|
||||
3
app/views/recommended_posts/_show.html.erb
Normal file
3
app/views/recommended_posts/_show.html.erb
Normal file
@@ -0,0 +1,3 @@
|
||||
<section class="recommended-posts user-disable-cropped-<%= Danbooru.config.enable_image_cropping && CurrentUser.user.disable_cropped_thumbnails? %>">
|
||||
<%= PostSets::Recommended.new(@posts).presenter.post_previews_html(self) %>
|
||||
</section>
|
||||
15
app/views/recommended_posts/show.html.erb
Normal file
15
app/views/recommended_posts/show.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<div id="c-posts">
|
||||
<div id="a-index">
|
||||
<h1>Recommended Posts</h1>
|
||||
|
||||
<p>Based on your voting history, you may enjoy these posts. Vote more to get more accurate results. These recommendations update every hour.</p>
|
||||
|
||||
<%= render partial: "show" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= render "posts/partials/common/secondary_links" %>
|
||||
|
||||
<% content_for(:page_title) do %>
|
||||
Recommended Posts - <%= Danbooru.config.app_name %>
|
||||
<% end %>
|
||||
Reference in New Issue
Block a user