uploads: add ability to search your uploads by AI tags.

Add ability to search your unposted uploads using AI tags. Like with
media assets, only basic tags are supported (no metatags) and complex
multi-tag searches will probably be slow.

The default AI tag confidence threshold is 50%. There's a hidden
search[min_score] URL param that lets you change this.
This commit is contained in:
evazion
2022-07-06 01:58:42 -05:00
parent d7e08d1313
commit 2350362183
2 changed files with 32 additions and 3 deletions

View File

@@ -87,16 +87,35 @@ class Upload < ApplicationRecord
end end
end end
def self.ai_tags_match(tag_string, score_range: (50..))
upload_media_assets = AITagQuery.search(tag_string, relation: UploadMediaAsset.all, foreign_key: :media_asset_id, score_range: score_range)
where(upload_media_assets.where("upload_media_assets.upload_id = uploads.id").arel.exists)
end
def self.search(params) def self.search(params)
q = search_attributes(params, :id, :created_at, :updated_at, :source, :referer_url, :status, :media_asset_count, :uploader, :upload_media_assets, :media_assets, :posts) q = search_attributes(params, :id, :created_at, :updated_at, :source, :referer_url, :status, :media_asset_count, :uploader, :upload_media_assets, :media_assets, :posts)
if params[:ai_tags_match].present?
min_score = params.fetch(:min_score, 50).to_i
q = q.ai_tags_match(params[:ai_tags_match], score_range: (min_score..))
end
if params[:is_posted].to_s.truthy? if params[:is_posted].to_s.truthy?
q = q.where.not(id: Upload.where.missing(:posts)) q = q.where.not(id: Upload.where.missing(:posts))
elsif params[:is_posted].to_s.falsy? elsif params[:is_posted].to_s.falsy?
q = q.where(id: Upload.where.missing(:posts)) q = q.where(id: Upload.where.missing(:posts))
end end
q.apply_default_order(params) case params[:order]
when "id", "id_desc"
q = q.order(id: :desc)
when "id_asc"
q = q.order(id: :asc)
else
q = q.apply_default_order(params)
end
q
end end
def async_process_upload! def async_process_upload!

View File

@@ -2,10 +2,20 @@
<div id="a-index"> <div id="a-index">
<h1 class="mb-2">My Uploads</h1> <h1 class="mb-2">My Uploads</h1>
<%= search_form_for(current_page_path) do |f| %>
<%= f.input :ai_tags_match, label: "Tags", input_html: { value: params.dig(:search, :ai_tags_match), data: { autocomplete: "tag-query" } } %>
<%= f.input :status, collection: %w[pending completed error], include_blank: true, selected: params.dig(:search, :status) %>
<%= f.input :is_posted, as: :hidden, input_html: { value: params.dig(:search, :is_posted) } %>
<%= f.input :min_score, as: :hidden, input_html: { value: params.dig(:search, :min_score) } %>
<%= f.input :order, collection: [%w[Newest id], %w[Oldest id_asc]], include_blank: true, selected: params[:search][:order] %>
<%= f.submit "Search" %>
<% end %>
<div class="border-b mb-4 flex flex-wrap gap-4"> <div class="border-b mb-4 flex flex-wrap gap-4">
<%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> <%= link_to "All", current_page_path(search: search_params.to_h.without("is_posted")), class: ["inline-block p-1 pb-2", (search_params[:is_posted].nil? ? "border-current border-b-2 -mb-px" : "inactive-link")] %>
<%= link_to "Posted", current_page_path(search: { is_posted: true }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> <%= link_to "Posted", current_page_path(search: search_params.merge(is_posted: true)), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.truthy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %>
<%= link_to "Unposted", current_page_path(search: { is_posted: false }), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %> <%= link_to "Unposted", current_page_path(search: search_params.merge(is_posted: false)), class: ["inline-block p-1 pb-2", (search_params[:is_posted].to_s.falsy? ? "border-current border-b-2 -mb-px" : "inactive-link")] %>
<span class="flex-1"></span> <span class="flex-1"></span>