mp4 uploads

mostly referenced from Donovan's fork:
336fd469b2
This commit is contained in:
edshot99 2024-10-31 16:47:53 -05:00
parent b7fee5fe2f
commit 92e1fadd20
6 changed files with 24 additions and 9 deletions

View File

@ -21,7 +21,7 @@
type="file" type="file"
ref="post_file" ref="post_file"
id="file-input" id="file-input"
accept="image/png,image/apng,image/jpeg,image/gif,video/webm,.png,.apng,.jpg,.jpeg,.gif,.webm" accept="image/png,image/apng,image/jpeg,image/gif,video/webm,video/mp4,.png,.apng,.jpg,.jpeg,.gif,.webm,.mp4"
@change="updatePreviewFile" @change="updatePreviewFile"
:disabled="disableFileUpload" :disabled="disableFileUpload"
/> />
@ -200,7 +200,7 @@ export default {
} }
this.whitelist.oldDomain = domain; this.whitelist.oldDomain = domain;
if(/^(https?\:\/\/|www).*?$/.test(this.uploadURL)) { if(/^(https?\:\/\/|www).*?$/.test(this.uploadURL)) {
const isVideo = /^(https?\:\/\/|www).*?\.(webm)$/.test(this.uploadURL); const isVideo = /^(https?\:\/\/|www).*?\.(webm|mp4)$/.test(this.uploadURL);
this.previewChanged(this.uploadURL, isVideo); this.previewChanged(this.uploadURL, isVideo);
} else { } else {
this.setEmptyThumb(); this.setEmptyThumb();
@ -222,7 +222,7 @@ export default {
const objectUrl = URL.createObjectURL(file); const objectUrl = URL.createObjectURL(file);
this.disableURLUpload = true; this.disableURLUpload = true;
this.uploadValueChanged(file); this.uploadValueChanged(file);
this.previewChanged(objectUrl, file.type === "video/webm"); this.previewChanged(objectUrl, (file.type === "video/webm") || (file.type === "video/mp4"));
}, },
uploadValueChanged(value) { uploadValueChanged(value) {
this.$emit("uploadValueChanged", value); this.$emit("uploadValueChanged", value);

View File

@ -59,6 +59,10 @@ article.post-preview {
&[data-file-ext=webm] > a:before { &[data-file-ext=webm] > a:before {
@include preview-type-badge('WEBM'); @include preview-type-badge('WEBM');
} }
&[data-file-ext=mp4] > a:before {
@include preview-type-badge('MP4');
}
} }
#edit-dialog textarea { #edit-dialog textarea {

View File

@ -37,7 +37,7 @@ class PostVideoConversionJob < ApplicationJob
sm.store(named_samples[1], mp4_path) sm.store(named_samples[1], mp4_path)
named_samples[1].close! named_samples[1].close!
end end
sm.store(samples[:original][1], sm.file_path(md5, "mp4", :original, post.is_deleted?)) sm.store(samples[:original][1], sm.file_path(md5, post.is_webm? ? "mp4" : "webm", :original, post.is_deleted?))
samples[:original].each(&:close!) samples[:original].each(&:close!)
end end
@ -48,7 +48,7 @@ class PostVideoConversionJob < ApplicationJob
scaled_dims = post.scaled_sample_dimensions(dims) scaled_dims = post.scaled_sample_dimensions(dims)
outputs[size] = generate_scaled_video(post.file_path, scaled_dims) outputs[size] = generate_scaled_video(post.file_path, scaled_dims)
end end
outputs[:original] = generate_scaled_video(post.file_path, post.scaled_sample_dimensions([post.image_width, post.image_height]), format: :mp4) outputs[:original] = generate_scaled_video(post.file_path, post.scaled_sample_dimensions([post.image_width, post.image_height]), format: post.is_webm? ? :mp4 : :webm)
outputs outputs
end end

View File

@ -83,6 +83,8 @@ module FileMethods
"png" "png"
when "video/webm" when "video/webm"
"webm" "webm"
when "video/mp4"
"mp4"
else else
mime_type mime_type
end end

View File

@ -71,10 +71,18 @@ class FileValidator
record.errors.add(:base, "video isn't valid") record.errors.add(:base, "video isn't valid")
return return
end end
valid_video_codec = %w[vp8 vp9 av1].include?(video.video_codec) if record.is_webm?
valid_container = video.container == "matroska,webm" valid_video_codec = %w[vp8 vp9 av1].include?(video.video_codec)
valid_container = video.container == "matroska,webm"
elsif record.is_mp4?
valid_video_codec = %w[h264 hevc].include?(video.video_codec)
valid_container = video.container == "mov,mp4,m4a,3gp,3g2,mj2"
else
valid_video_codec = false
valid_container = false
end
unless valid_video_codec && valid_container unless valid_video_codec && valid_container
record.errors.add(:base, "video container/codec isn't valid for webm") record.errors.add(:base, "video container/codec isn't valid for webm/mp4")
end end
end end

View File

@ -366,7 +366,8 @@ module Danbooru
'jpg' => 100.megabytes, 'jpg' => 100.megabytes,
'png' => 100.megabytes, 'png' => 100.megabytes,
'gif' => 20.megabytes, 'gif' => 20.megabytes,
'webm' => 100.megabytes 'webm' => 100.megabytes,
'mp4' => 100.megabytes
} }
end end