From c99d0523bbe406d89bd70c6c35b1c443f30bcc95 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 29 Sep 2021 07:35:30 -0500 Subject: [PATCH] /media_assets: add basic index and show pages. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add a basic index page at https://danbooru.donmai.us/media_assets. * Add a basic show page at https://danbooru.donmai.us/media_assets/1. * Add ability to search /media_assets.json by metadata. Example: ** https://danbooru.donmai.us/media_assets.json?search[metadata][File:ColorComponents]=3 * Add a "»" link next to the filesize on posts linking to the metadata page. Known issues: * Sometimes the MD5 links on the /media_assets page return "That record was not found" errors. These are unfinished uploads that haven't been made into posts yet. * No good way to search for custom metadata fields in the search form. * Design is ugly. --- app/controllers/media_assets_controller.rb | 11 +++++- .../src/styles/common/utilities.scss | 2 +- app/models/media_asset.rb | 7 +++- app/views/media_assets/index.html.erb | 39 +++++++++++++++++++ app/views/media_assets/show.html.erb | 20 ++++++++++ .../posts/partials/show/_information.html.erb | 1 + config/routes.rb | 2 +- .../media_assets_controller_test.rb | 18 ++++++++- 8 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 app/views/media_assets/index.html.erb create mode 100644 app/views/media_assets/show.html.erb diff --git a/app/controllers/media_assets_controller.rb b/app/controllers/media_assets_controller.rb index cd8c37c91..b4c55007a 100644 --- a/app/controllers/media_assets_controller.rb +++ b/app/controllers/media_assets_controller.rb @@ -1,8 +1,15 @@ class MediaAssetsController < ApplicationController - respond_to :json, :xml + respond_to :html, :json, :xml def index - @media_assets = authorize MediaAsset.visible(CurrentUser.user).paginated_search(params, count_pages: true) + @media_assets = authorize MediaAsset.visible(CurrentUser.user).paginated_search(params, count_pages: false) + @media_assets = @media_assets.joins(:media_metadata) respond_with(@media_assets) end + + def show + @media_asset = authorize MediaAsset.find(params[:id]) + @post = Post.find_by_md5(@media_asset.md5) + respond_with(@media_asset) + end end diff --git a/app/javascript/src/styles/common/utilities.scss b/app/javascript/src/styles/common/utilities.scss index 22f375b2f..ba273a574 100644 --- a/app/javascript/src/styles/common/utilities.scss +++ b/app/javascript/src/styles/common/utilities.scss @@ -8,7 +8,7 @@ $spacer: 0.25rem; /* 4px */ .invisible { visibility: hidden; } .visible { visibility: visible; } -.font-monospace { font-family: var(--monospace-font); } +.font-monospace { font: var(--monospace-font); } .font-bold { font-weight: bold; } .inline-block { display: inline-block; } diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index bc14af6f7..074bd5458 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -11,7 +11,12 @@ class MediaAsset < ApplicationRecord } def self.search(params) - q = search_attributes(params, :id, :created_at, :updated_at, :md5, :file_ext, :file_size, :image_width, :image_height) + q = search_attributes(params, :id, :created_at, :updated_at, :md5, :file_ext, :file_size, :image_width, :image_height, :media_metadata) + + if params[:metadata].present? + q = q.joins(:media_metadata).merge(MediaMetadata.search(metadata: params[:metadata])) + end + q.apply_default_order(params) end diff --git a/app/views/media_assets/index.html.erb b/app/views/media_assets/index.html.erb new file mode 100644 index 000000000..f69972245 --- /dev/null +++ b/app/views/media_assets/index.html.erb @@ -0,0 +1,39 @@ +
+
+ <%= search_form_for(media_assets_path) do |f| %> + <%= f.input :md5, input_html: { value: params[:search][:md5] } %> + <%= f.input :image_width, input_html: { value: params[:search][:image_width] } %> + <%= f.input :image_height, input_html: { value: params[:search][:image_height] } %> + <%= f.input :file_size, input_html: { value: params[:search][:file_size] } %> + <%= f.input :file_ext, input_html: { value: params[:search][:file_ext] } %> + + <%= f.simple_fields_for :metadata do |meta| %> + <% params.dig(:search, :metadata).to_h.each do |key, value| %> + <%= meta.input key, label: key, input_html: { value: value } %> + <% end %> + <% end %> + + <%= f.submit "Search" %> + <% end %> + + <%= table_for @media_assets, class: "striped autofit" do |t| %> + <% t.column "MD5", td: { class: "font-monospace" } do |media_asset| %> + <%= link_to media_asset.md5, posts_path(md5: media_asset.md5) %> + <% end %> + <% t.column :image_width %> + <% t.column :image_height %> + <% t.column :file_size %> + <% t.column :file_ext %> + + <% t.column "Metadata" do |media_asset| %> + <%= link_to pluralize(media_asset.metadata.size, "tags"), media_asset %> + <% end %> + + <% t.column "Created" do |media_asset| %> + <%= time_ago_in_words_tagged(media_asset.created_at) %> + <% end %> + <% end %> + + <%= numbered_paginator(@media_assets) %> +
+
diff --git a/app/views/media_assets/show.html.erb b/app/views/media_assets/show.html.erb new file mode 100644 index 000000000..dbb20a74f --- /dev/null +++ b/app/views/media_assets/show.html.erb @@ -0,0 +1,20 @@ +
+
+

Media Asset

+ + <% if @post.present? %> + <%= post_preview(@post, show_deleted: true) %> + <% else %> +

MD5: <%= link_to @media_asset.md5, posts_path(md5: @media_asset.md5) %>

+ <% end %> + + + <% @media_asset.metadata.sort.each do |key, value| %> + + + + + <% end %> +
<%= key %><%= link_to value, media_assets_path(search: { metadata: { key => value }}) %>
+
+
\ No newline at end of file diff --git a/app/views/posts/partials/show/_information.html.erb b/app/views/posts/partials/show/_information.html.erb index 33cf1d7d7..a389d4be2 100644 --- a/app/views/posts/partials/show/_information.html.erb +++ b/app/views/posts/partials/show/_information.html.erb @@ -16,6 +16,7 @@
  • Size: <%= link_to_if policy(post).visible?, "#{number_to_human_size(post.file_size)} .#{post.file_ext}", post.tagged_file_url %> (<%= post.image_width %>x<%= post.image_height %>) + <%= link_to "»", @post.media_asset %>
  • Source: <%= post_source_tag(post.source, post.normalized_source) %>
  • Rating: <%= post.pretty_rating %>
  • diff --git a/config/routes.rb b/config/routes.rb index 0bead6648..54300560e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -154,7 +154,7 @@ Rails.application.routes.draw do get :check, to: redirect {|path_params, req| "/iqdb_queries?#{req.query_string}"} end end - resources :media_assets, only: [:index] + resources :media_assets, only: [:index, :show] resources :media_metadata, only: [:index] resources :mod_actions resources :moderation_reports, only: [:new, :create, :index, :show] diff --git a/test/functional/media_assets_controller_test.rb b/test/functional/media_assets_controller_test.rb index a652dc9d6..33014c1b2 100644 --- a/test/functional/media_assets_controller_test.rb +++ b/test/functional/media_assets_controller_test.rb @@ -3,12 +3,28 @@ require 'test_helper' class MediaAssetsControllerTest < ActionDispatch::IntegrationTest context "The media assets controller" do context "index action" do + setup do + @media_asset = create(:media_asset) + end + should "render" do - create(:media_asset) get media_assets_path, as: :json assert_response :success end + + should respond_to_search({}).with { @media_asset } + should respond_to_search(metadata: { "File:ColorComponents" => 3 }).with { @media_asset } + should respond_to_search(metadata: { "File:ColorComponents" => 4 }).with { [] } + end + + context "show action" do + should "render" do + @media_asset = create(:media_asset) + get media_asset_path(@media_asset), as: :json + + assert_response :success + end end end end