mirror of
https://github.com/storytold/artcraft.git
synced 2026-10-21 17:28:24 -04:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9883887b3 | ||
|
|
50d655c77a | ||
|
|
aa47795441 | ||
|
|
e54fe12125 |
+12
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nINSERT INTO uploaded_videos\nSET\n token = ?,\n sha1_checksum = ?,\n filesize_bytes = ?,\n maybe_filename = ?,\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n upload_ip_address = ?,\n created_at = NOW()\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 11
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "14e63e59f7d550181126151029bcd17d08278196ba0ee4d32450c2567b1da26e"
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nUPDATE uploaded_videos\nSET\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n maybe_updated_ip_address = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 8
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "62f08d5f32bdc35e6faf43e3d21affa2dcf1501cda831cb88524bf1571d08e2f"
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nINSERT INTO uploaded_videos\nSET\n token = ?,\n sha1_checksum = ?,\n filesize_bytes = ?,\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n upload_ip_address = ?,\n created_at = NOW()\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 10
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "64efd175fa4eb751be1125d55de93ed66a9fc6582e36cec4fc8225c350ec51e2"
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"db_name": "MySQL",
|
||||
"query": "\nUPDATE uploaded_videos\nSET\n maybe_filename = ?,\n maybe_width = ?,\n maybe_height = ?,\n maybe_resolution = ?,\n maybe_detected_model_family = ?,\n maybe_detected_model_type = ?,\n maybe_report = ?,\n maybe_updated_ip_address = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ",
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"parameters": {
|
||||
"Right": 9
|
||||
},
|
||||
"nullable": []
|
||||
},
|
||||
"hash": "c6bbdc963e0d49ac55973a728d04b371967c20bfb9dd4bd75e4693dc7a114c99"
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
-- noinspection SqlDialectInspectionForFile
|
||||
-- noinspection SqlNoDataSourceInspectionForFile
|
||||
-- noinspection SqlResolveForFile
|
||||
|
||||
ALTER TABLE uploaded_videos
|
||||
DROP COLUMN maybe_filename;
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
-- noinspection SqlDialectInspectionForFile
|
||||
-- noinspection SqlNoDataSourceInspectionForFile
|
||||
-- noinspection SqlResolveForFile
|
||||
|
||||
ALTER TABLE uploaded_videos
|
||||
ADD COLUMN maybe_filename VARCHAR(512) DEFAULT NULL AFTER filesize_bytes;
|
||||
@@ -16,6 +16,9 @@ CREATE TABLE uploaded_videos (
|
||||
-- Size of the uploaded file in bytes.
|
||||
filesize_bytes INT(10) UNSIGNED NOT NULL,
|
||||
|
||||
-- Original filename of the uploaded clip, as provided by the user.
|
||||
maybe_filename VARCHAR(512) DEFAULT NULL,
|
||||
|
||||
-- Pixel dimensions, when they could be determined.
|
||||
maybe_width INT(10) UNSIGNED DEFAULT NULL,
|
||||
maybe_height INT(10) UNSIGNED DEFAULT NULL,
|
||||
|
||||
+3
@@ -12,6 +12,7 @@ where
|
||||
{
|
||||
pub sha1_checksum: &'e str,
|
||||
pub filesize_bytes: u32,
|
||||
pub maybe_filename: Option<&'e str>,
|
||||
|
||||
pub maybe_width: Option<u32>,
|
||||
pub maybe_height: Option<u32>,
|
||||
@@ -45,6 +46,7 @@ SET
|
||||
token = ?,
|
||||
sha1_checksum = ?,
|
||||
filesize_bytes = ?,
|
||||
maybe_filename = ?,
|
||||
maybe_width = ?,
|
||||
maybe_height = ?,
|
||||
maybe_resolution = ?,
|
||||
@@ -57,6 +59,7 @@ SET
|
||||
token.as_str(),
|
||||
args.sha1_checksum,
|
||||
args.filesize_bytes,
|
||||
args.maybe_filename,
|
||||
args.maybe_width,
|
||||
args.maybe_height,
|
||||
args.maybe_resolution,
|
||||
|
||||
+4
@@ -12,6 +12,8 @@ where
|
||||
{
|
||||
pub token: &'e UploadedVideoToken,
|
||||
|
||||
pub maybe_filename: Option<&'e str>,
|
||||
|
||||
pub maybe_width: Option<u32>,
|
||||
pub maybe_height: Option<u32>,
|
||||
pub maybe_resolution: Option<&'e str>,
|
||||
@@ -41,6 +43,7 @@ where
|
||||
r#"
|
||||
UPDATE uploaded_videos
|
||||
SET
|
||||
maybe_filename = ?,
|
||||
maybe_width = ?,
|
||||
maybe_height = ?,
|
||||
maybe_resolution = ?,
|
||||
@@ -52,6 +55,7 @@ SET
|
||||
WHERE token = ?
|
||||
LIMIT 1
|
||||
"#,
|
||||
args.maybe_filename,
|
||||
args.maybe_width,
|
||||
args.maybe_height,
|
||||
args.maybe_resolution,
|
||||
|
||||
+18
@@ -10,6 +10,7 @@ use std::marker::PhantomData;
|
||||
use std::sync::Arc;
|
||||
|
||||
use actix_multipart::form::tempfile::TempFile;
|
||||
use actix_multipart::form::text::Text;
|
||||
use actix_multipart::form::MultipartForm;
|
||||
use actix_web::web::Json;
|
||||
use actix_web::{web, HttpRequest};
|
||||
@@ -47,6 +48,11 @@ pub struct VideoInfoUploadForm {
|
||||
#[multipart(limit = "256 MiB")]
|
||||
#[schema(value_type = Vec<u8>, format = Binary)]
|
||||
file: TempFile,
|
||||
|
||||
/// Optional filename to record. Falls back to the uploaded file's own name.
|
||||
#[multipart(limit = "2 KiB")]
|
||||
#[schema(value_type = Option<String>, format = Binary)]
|
||||
maybe_filename: Option<Text<String>>,
|
||||
}
|
||||
|
||||
/// Detect a video's AI-generation provenance and persist the result.
|
||||
@@ -90,6 +96,16 @@ pub async fn video_info_upload_handler(
|
||||
let filesize_bytes = bytes.len().min(u32::MAX as usize) as u32;
|
||||
let ip_address = get_request_ip(&http_request);
|
||||
|
||||
// Prefer an explicit `maybe_filename` field; otherwise use the uploaded file's
|
||||
// own name. Trimmed; empty becomes absent.
|
||||
let maybe_filename = form
|
||||
.maybe_filename
|
||||
.as_ref()
|
||||
.map(|filename| filename.as_str().to_string())
|
||||
.or_else(|| form.file.file_name.clone())
|
||||
.map(|filename| filename.trim().to_string())
|
||||
.filter(|filename| !filename.is_empty());
|
||||
|
||||
let sha1_checksum =
|
||||
sha1_hash_bytes_as_crockford(&bytes).map_err(CommonWebError::from_error)?;
|
||||
|
||||
@@ -154,6 +170,7 @@ pub async fn video_info_upload_handler(
|
||||
Some(existing) => {
|
||||
update_uploaded_video(UpdateUploadedVideoArgs {
|
||||
token: &existing.token,
|
||||
maybe_filename: maybe_filename.as_deref(),
|
||||
maybe_width,
|
||||
maybe_height,
|
||||
maybe_resolution: maybe_resolution.as_deref(),
|
||||
@@ -171,6 +188,7 @@ pub async fn video_info_upload_handler(
|
||||
insert_uploaded_video(InsertUploadedVideoArgs {
|
||||
sha1_checksum: &sha1_checksum,
|
||||
filesize_bytes,
|
||||
maybe_filename: maybe_filename.as_deref(),
|
||||
maybe_width,
|
||||
maybe_height,
|
||||
maybe_resolution: maybe_resolution.as_deref(),
|
||||
|
||||
@@ -33,6 +33,9 @@ export async function uploadVideo(
|
||||
): Promise<VideoInfoUploadResponse> {
|
||||
const form = new FormData();
|
||||
form.append('file', file, file.name || 'upload');
|
||||
if (file.name) {
|
||||
form.append('maybe_filename', file.name);
|
||||
}
|
||||
|
||||
let response: Response;
|
||||
try {
|
||||
|
||||
@@ -200,6 +200,7 @@ export function App() {
|
||||
<ReportForm
|
||||
key={result.uploadedVideoToken}
|
||||
uploadedVideoToken={result.uploadedVideoToken}
|
||||
fileName={result.fileName}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -16,9 +16,11 @@ type SaveStatus = 'idle' | 'saving' | 'saved' | 'error';
|
||||
interface ReportFormProps {
|
||||
/** The uploaded video this report is about. */
|
||||
uploadedVideoToken: string;
|
||||
/** The original filename of the uploaded video, recorded with the note. */
|
||||
fileName: string;
|
||||
}
|
||||
|
||||
export function ReportForm({ uploadedVideoToken }: ReportFormProps) {
|
||||
export function ReportForm({ uploadedVideoToken, fileName }: ReportFormProps) {
|
||||
const [modelType, setModelType] = useState('');
|
||||
const [customModelName, setCustomModelName] = useState('');
|
||||
const [website, setWebsite] = useState('');
|
||||
@@ -51,6 +53,7 @@ export function ReportForm({ uploadedVideoToken }: ReportFormProps) {
|
||||
const request: VideoInfoNoteRequest = {
|
||||
uploaded_video_token: uploadedVideoToken,
|
||||
maybe_uploaded_video_note_token: noteToken ?? undefined,
|
||||
maybe_filename: fileName.trim() || undefined,
|
||||
maybe_reported_model_type: modelChosen ? modelType : undefined,
|
||||
maybe_reported_model_name:
|
||||
modelType === CUSTOM_VALUE ? customModelName.trim() || undefined : undefined,
|
||||
@@ -76,6 +79,7 @@ export function ReportForm({ uploadedVideoToken }: ReportFormProps) {
|
||||
}, [
|
||||
hasContent,
|
||||
uploadedVideoToken,
|
||||
fileName,
|
||||
noteToken,
|
||||
modelChosen,
|
||||
modelType,
|
||||
|
||||
Reference in New Issue
Block a user