diff --git a/app/assets/javascripts/posts.js b/app/assets/javascripts/posts.js index 845e3a99d..eca330c26 100644 --- a/app/assets/javascripts/posts.js +++ b/app/assets/javascripts/posts.js @@ -299,7 +299,13 @@ Danbooru.Post.initialize_title_for = function(post) { var $post = $(post); var $img = $post.find("img"); - $img.attr("title", $post.attr("data-tags") + " user:" + $post.attr("data-uploader") + " rating:" + $post.data("rating") + " score:" + $post.data("score")); + var score = null; + if ($post.data("views")) { + score = " views:" + $post.data("views"); + } else { + score = " score:" + $post.data("score"); + } + $img.attr("title", $post.attr("data-tags") + " user:" + $post.attr("data-uploader") + " rating:" + $post.data("rating") + score); } Danbooru.Post.initialize_post_image_resize_links = function() { diff --git a/app/controllers/explore/posts_controller.rb b/app/controllers/explore/posts_controller.rb index 49b20f774..064831647 100644 --- a/app/controllers/explore/posts_controller.rb +++ b/app/controllers/explore/posts_controller.rb @@ -8,6 +8,12 @@ module Explore respond_with(@posts) end + def popular_view + @post_set = PostSets::PopularView.new(params[:date], params[:scale]) + @posts = @post_set.posts + respond_with(@posts) + end + def intro @presenter = IntroPresenter.new render :layout => "blank" diff --git a/app/logical/post_sets/popular_view.rb b/app/logical/post_sets/popular_view.rb new file mode 100644 index 000000000..bf68b03ba --- /dev/null +++ b/app/logical/post_sets/popular_view.rb @@ -0,0 +1,73 @@ +module PostSets + class PopularView < PostSets::Base + attr_reader :date, :scale + + def initialize(date, scale) + @date = date.blank? ? Time.zone.now : Time.zone.parse(date) + @scale = scale || "Day" + end + + def posts + @posts ||= begin + array = fetch_data.scan(/\S+/).in_groups_of(2) + post_ids = array.map(&:first) + posts = ::Post.where(id: post_ids).order(arbitrary_sql_order_clause(post_ids, "posts")) + posts.each.with_index do |post, i| + post.view_count = array[i][1].to_i + end + posts + end + end + + def min_date + case scale + when "week" + date.beginning_of_week + + when "month" + date.beginning_of_month + + else + date + end + end + + def max_date + case scale + when "week" + date.end_of_week + + when "month" + date.end_of_month + + else + date + end + end + + def source + "popular_by_#{scale.downcase}" + end + + def fetch_data + dates = date.strftime('%Y-%m-%d') + Cache.get("pv-#{scale}-#{dates}", 1.minute) do + url = URI.parse("#{Danbooru.config.report_server}/hits/#{source}?date=#{dates}") + response = [] + Net::HTTP.start(url.host, url.port, :use_ssl => url.is_a?(URI::HTTPS)) do |http| + http.read_timeout = 1 + http.request_get(url.request_uri) do |res| + if res.is_a?(Net::HTTPSuccess) + response = res.body + end + end + end + response + end + end + + def presenter + ::PostSetPresenters::Popular.new(self) + end + end +end diff --git a/app/models/post.rb b/app/models/post.rb index 374147e5d..2276e1f1c 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -7,7 +7,7 @@ class Post < ActiveRecord::Base :has_embedded_notes => 0x0001 } - attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning + attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning, :view_count after_destroy :delete_files after_destroy :delete_remote_files after_save :create_version diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb index e469a25f3..e1b5e4cca 100644 --- a/app/presenters/post_presenter.rb +++ b/app/presenters/post_presenter.rb @@ -79,6 +79,7 @@ class PostPresenter < Presenter data-parent-id="#{post.parent_id}" data-has-children="#{post.has_children?}" data-score="#{post.score}" + data-views="#{post.view_count}" data-fav-count="#{post.fav_count}" data-pixiv-id="#{post.pixiv_id}" data-md5="#{post.md5}" diff --git a/app/presenters/post_set_presenters/popular_view.rb b/app/presenters/post_set_presenters/popular_view.rb new file mode 100644 index 000000000..736ad4301 --- /dev/null +++ b/app/presenters/post_set_presenters/popular_view.rb @@ -0,0 +1,38 @@ +module PostSetPresenters + class PopularView < Popular + def initialize(post_set) + @post_set = post_set + end + + def nav_links_for_scale(template, scale) + html = [] + html << '' + html << template.link_to( + "«prev".html_safe, + template.popular_explore_post_views_path( + :date => prev_date_for_scale(scale), + :scale => scale.downcase + ), + :rel => (link_rel_for_scale?(template, scale.downcase) ? "prev" : nil) + ) + html << template.link_to( + scale, + template.popular_explore_post_views_path( + :date => date, + :scale => scale.downcase + ), + :class => "desc" + ) + html << template.link_to( + "next»".html_safe, + template.popular_explore_post_views_path( + :date => next_date_for_scale(scale), + :scale => scale.downcase + ), + :rel => (link_rel_for_scale?(template, scale.downcase) ? "next" : nil) + ) + html << '' + html.join("\n").html_safe + end + end +end diff --git a/app/views/explore/posts/popular_view.html.erb b/app/views/explore/posts/popular_view.html.erb new file mode 100644 index 000000000..630d55452 --- /dev/null +++ b/app/views/explore/posts/popular_view.html.erb @@ -0,0 +1,17 @@ +