Compare commits

...
Author SHA1 Message Date
ArEnSc 08f59a1989 Update .env 2023-12-21 19:53:07 -05:00
Michael Chung 15c218286f Bucket Orchestration work complete. 2023-12-21 19:51:32 -05:00
Michael Chung 0efe2d8177 Working Tests 2023-12-21 12:38:04 -05:00
Michael Chung ed97cdbb0d Ok builds again going to run unit tests. 2023-12-21 02:25:20 -05:00
Michael Chung 6b2d4ffdce Adding the mocks 2023-12-21 01:58:43 -05:00
Michael Chung 86c80fdf19 Things build again editor works well. 2023-12-21 01:01:35 -05:00
Michael Chung eca8b01f14 Missed 1 file. 2023-12-21 00:42:22 -05:00
Michael Chung 1bddb21e9f Missed 1 file. 2023-12-21 00:41:26 -05:00
Michael Chung 20b950794c Ok it builds need to test it using a mock. 2023-12-21 00:40:17 -05:00
Michael Chung 0d58176f0f Minor bug fixes then testing. 2023-12-20 02:23:45 -05:00
Michael Chung 57f383612f Now testing time! 2023-12-20 02:20:44 -05:00
Michael Chung ab3a312898 Ok so it actually compiles right now. 2023-12-20 00:13:02 -05:00
Michael Chung a2aa71e8a6 builds properly now working on the download aspect. 2023-12-19 23:25:18 -05:00
Michael Chung 3e02d791af Merge branch 'master' into feature/weights_files 2023-12-19 17:44:39 -05:00
Michael Chung 70694ce330 Need to replace the hashing function with a new one and merge master. 2023-12-19 17:43:24 -05:00
Brandon Thomas 5093621995 Merge pull request #227 from storytold/brandon-migration-fixes
migration fixes (tested locally)
2023-12-19 05:53:43 -05:00
Brandon Thomas 44056ee956 revert testing changes, re-codegen 2023-12-19 05:51:59 -05:00
Brandon Thomas 70e4af2b4c fix rvc index 2023-12-19 05:36:29 -05:00
Brandon Thomas fd28585e13 download to new public buckets for weights 2023-12-19 05:30:15 -05:00
Brandon Thomas 0e8aefce5c download job should also save sha 2023-12-19 04:53:49 -05:00
Brandon Thomas 0549e8eb6a migrate shasum 2023-12-19 04:48:02 -05:00
Brandon Thomas 0c35dc5068 fix inference job bucket client choice 2023-12-19 04:15:34 -05:00
Brandon Thomas 987d983051 download / upload models 2023-12-19 03:53:42 -05:00
Brandon Thomas 0144c969bc DO NOT MERGE - migration fixes
Don't land the LEFT OUTER JOIN to users !!!!!!
!!!!!
!!!!
2023-12-19 03:10:26 -05:00
Michael Chung 775d867add Ok fixed compilation issues. 2023-12-19 03:05:39 -05:00
Michael Chung da62443522 Fixed some issues using a box 2023-12-19 02:48:41 -05:00
Michael Chung 1ae2df8fa7 working on the file manager for uploads and downloads 2023-12-19 02:40:42 -05:00
Brandon Thomas e63eef03cd missed a few migration queries 2023-12-19 02:33:27 -05:00
Brandon Thomas 36c76365bc Merge pull request #226 from storytold/brandon-migration-tool
voice_conversion_models ➤➤➤➤➤ model_weights
2023-12-19 01:50:00 -05:00
Brandon Thomas 1432c19d3b fix all failing lints 2023-12-19 01:47:36 -05:00
Brandon Thomas 4edea1d68f codegen db + fix compile error 2023-12-19 01:40:40 -05:00
Brandon Thomas 2b186720c1 analytic query 2023-12-19 01:37:21 -05:00
Brandon Thomas d2faacc796 This might be it! model list is ported 2023-12-19 01:37:21 -05:00
Brandon Thomas b2555bc756 populate "new token" 2023-12-19 01:37:21 -05:00
Brandon Thomas 169b45413d port internal model cache 2023-12-19 01:37:21 -05:00
Brandon Thomas b0df97b2be reuse migration code (+ migration crate) 2023-12-19 01:37:21 -05:00
Brandon Thomas d03fb5ed0f migration support + tests 2023-12-19 01:37:21 -05:00
Brandon Thomas 0420605535 inference query for weights (vc) 2023-12-19 01:37:21 -05:00
Brandon Thomas 5454171112 move module 2023-12-19 01:37:21 -05:00
Brandon Thomas d518d54471 download job query 2023-12-19 01:37:21 -05:00
Brandon Thomas b17b1f565c working 2023-12-19 01:37:21 -05:00
Brandon Thomas bacb3ce5b1 migration code wip 2023-12-19 01:37:21 -05:00
Brandon Thomas b124028055 Migration tool for voice conversion models 2023-12-19 01:37:21 -05:00
Michael Chung 2e6d7d96e4 Merge branch 'master' into feature/weights_files 2023-12-18 21:18:01 -05:00
ArEnSc 382fd8680d Merge pull request #225 from storytold/feature/weights_seed_fix
Seed Model weights fix
2023-12-18 21:13:34 -05:00
Michael Chung 87a7bd6ac4 Seed Model weights fix 2023-12-18 21:08:43 -05:00
ArEnSc d68979024e Merge pull request #224 from storytold/feature/rerender
Feature/rerender
2023-12-18 19:06:35 -05:00
saltacc 25b90c07ce add model downloading 2023-12-18 15:49:55 -08:00
Michael Chung 39bae02259 Merge branch 'feature/weights_files' of https://github.com/storytold/storyteller-rust into feature/weights_files 2023-12-18 09:26:42 -05:00
Michael Chung 7755a5683b Working on file descriptors though gotta learn some rust things, quickly for boiler plate. 2023-12-18 09:26:12 -05:00
Brandon Thomas 0578980205 re-home nessu's models (per vegito) 2023-12-16 23:26:16 -05:00
Brandon Thomas 732dd27d0f fix build errors; kebab-case all CLI apps 2023-12-15 19:39:06 -05:00
Brandon Thomas c137e1ace3 migration tool binary bootstrap 2023-12-15 19:28:37 -05:00
ArEnSc f31e93b109 Merge pull request #218 from storytold/feature/weights_files
Feature/weights files
2023-12-15 18:36:31 -05:00
ArEnSc 6aeb325d10 Merge branch 'master' into feature/weights_files 2023-12-15 18:36:23 -05:00
Michael Chung 2c6a07659a Ok weights now are properly linked. 2023-12-15 16:59:13 -05:00
Michael Chung 0e1f6187bf Weights path working on the generic version. 2023-12-15 16:29:36 -05:00
Brandon Thomas a6806d3616 indices on model_weights and users (there weren't any on model_weights!) 2023-12-15 13:57:22 -05:00
Brandon Thomas 98fa0a67ea rename extension tables 2023-12-15 13:33:14 -05:00
Brandon Thomas 11e3a4e429 rename model_weights_samples -> model_weights_preview_samples
- doing this before anyone else runs these migrations
- also added "squashed" documentation on the model_weights and
  associated tables
- also added (commented) good indices for model_weights
2023-12-15 12:47:33 -05:00
Brandon Thomas d9e45c0291 Merge pull request #217 from storytold/brandon-lots-of-schema-changes-afoot
Lots of schema changes afoot - model_weights migration, covers, samples
2023-12-15 10:27:58 -05:00
Brandon Thomas 5108f94c0f Lots of schema changes afoot - model_weights migration, covers, samples
Model weights migration (old tokens):

- model_weights.maybe_migration_old_model_token

Model weights migration (new tokens):

- tts_models.maybe_migration_new_model_weights_token
- vocoder_models.maybe_migration_new_model_weights_token
- voice_conversion_models.maybe_migration_new_model_weights_token

Cover and banner images for models:

- model_weights.maybe_banner_media_file_token
- model_weights.maybe_cover_media_file_token

Avatar and banner images for users:

- users.maybe_avatar_media_file_token
- users.maybe_cover_media_file_token

Sample multimedia for models:

- model_weights_samples (new table)
2023-12-15 10:26:08 -05:00
Brandon Thomas 6fc1dd263c migration dir had a space in it 2023-12-14 20:23:03 -05:00
Brandon Thomas 186979ecbd fix lints and other issues 2023-12-14 18:40:44 -05:00
Brandon Thomas 6c9b0a5c2a fix bad github merge 2023-12-14 18:30:54 -05:00
Brandon Thomas 92b5a4c90b Merge pull request #215 from storytold/brandon-fix-clap-upgrade
Fix clap in various CLI tools post 2.x -> 4.x upgrade
2023-12-14 18:23:46 -05:00
Brandon Thomas e9cd505e0b Fix clap in various CLI tools post 2.x -> 4.x upgrade 2023-12-14 18:22:05 -05:00
Brandon Thomas 561493182e Merge pull request #164 from storytold/dependabot/cargo/clap-4.4.8
Bump clap from 2.34.0 to 4.4.8
2023-12-14 17:52:26 -05:00
Brandon Thomas 5f673095eb Merge pull request #173 from storytold/dependabot/cargo/old_code/pubsub-enricher/openssl-0.10.60
Bump openssl from 0.10.33 to 0.10.60 in /old_code/pubsub-enricher
2023-12-14 17:36:43 -05:00
Brandon Thomas bf3c199592 Merge pull request #172 from storytold/dependabot/cargo/old_code/twitch-ingestion-client/openssl-0.10.60
Bump openssl from 0.10.32 to 0.10.60 in /old_code/twitch-ingestion-client
2023-12-14 17:36:19 -05:00
Brandon Thomas 9cf629c324 Merge pull request #174 from storytold/dependabot/cargo/old_code/twitter-ingestion-client/openssl-0.10.60
Bump openssl from 0.10.34 to 0.10.60 in /old_code/twitter-ingestion-client
2023-12-14 17:36:11 -05:00
Brandon Thomas 4a6009cf78 Merge pull request #175 from storytold/dependabot/cargo/old_code/twitch-tts-desktop-client/openssl-0.10.60
Bump openssl from 0.10.36 to 0.10.60 in /old_code/twitch-tts-desktop-client
2023-12-14 17:36:01 -05:00
Brandon Thomas 8789c53a0a Merge pull request #183 from storytold/dependabot/cargo/async-stripe-0.26.0
Bump async-stripe from 0.25.2 to 0.26.0
2023-12-14 17:27:07 -05:00
Brandon Thomas 46f5689cbb Merge pull request #213 from storytold/dec-14-mithoo
make media endpoint for profiles follow public pagination
2023-12-14 17:26:13 -05:00
Brandon Thomas 97ee848e64 Merge pull request #178 from storytold/nov-29-mithoo
update media file visibilty handler
2023-12-14 17:23:53 -05:00
Brandon Thomas 2f67bd41cf Merge branch 'master' into nov-29-mithoo 2023-12-14 17:23:45 -05:00
Brandon Thomas 4b2cfaeb09 Merge pull request #211 from storytold/brandon-deterministic-test-tokens
deterministic test tokens
2023-12-14 17:03:22 -05:00
Brandon Thomas b05cde1de1 Merge pull request #214 from storytold/brandon-fix-logout
fix logout
2023-12-14 17:01:55 -05:00
Brandon Thomas 60d4199216 fix logout
The reason this is so labyrinthine is because of the users and billing
components. They bind dynamic behaviors that are defined in
storyteller-web (one of them being clearing the redis session cache).

Actually, the users component _didn't_, because it was defined in the
billing component. So I hoisted it out into a new component library.

In the fullness of time I imagine all of this will be consolidated back
under storyteller-web so we don't have to worry about binding actions at
a distance.

Anyway, this is tested and works locally.
2023-12-14 16:58:37 -05:00
Brandon Thomas a88d888c18 featured media weights endpoint 2023-12-14 16:35:07 -05:00
Brandon Thomas 5a4d2a8c06 media files query by tokens (WHERE IN clause) 2023-12-14 15:15:31 -05:00
Brandon Thomas 32b1786b59 No hateful / antisemitic models on our service (hitler) 2023-12-14 14:53:17 -05:00
Brandon Thomas 8618e774e7 codegen db 2023-12-14 13:37:25 -05:00
Brandon Thomas d447ad7d86 deterministic test tokens
it'd be good to use the same token values in tests, dev seed tools, etc.

this should be a threadsafe, resettable, deterministic RNG
2023-12-14 03:49:58 -05:00
saltacc 2f971dda60 add model downloading 2023-12-13 21:17:44 -08:00
dependabot[bot] cf034a900e Bump clap from 2.34.0 to 4.4.8
Bumps [clap](https://github.com/clap-rs/clap) from 2.34.0 to 4.4.8.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v2.34.0...v4.4.8)

---
updated-dependencies:
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-14 04:27:36 +00:00
dependabot[bot] 8bb82c0fe5 Bump async-stripe from 0.25.2 to 0.26.0
Bumps [async-stripe](https://github.com/arlyon/async-stripe) from 0.25.2 to 0.26.0.
- [Release notes](https://github.com/arlyon/async-stripe/releases)
- [Changelog](https://github.com/arlyon/async-stripe/blob/master/CHANGELOG.md)
- [Commits](https://github.com/arlyon/async-stripe/compare/v0.25.2...v0.26.0)

---
updated-dependencies:
- dependency-name: async-stripe
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-12 16:59:57 +00:00
kasisnu 133ccff348 update media file visibilty handler 2023-11-29 17:12:22 +05:30
dependabot[bot] a3ab634725 Bump openssl in /old_code/twitch-tts-desktop-client
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.36 to 0.10.60.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.36...openssl-v0.10.60)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 21:11:08 +00:00
dependabot[bot] 93ebe101f3 Bump openssl in /old_code/twitter-ingestion-client
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.34 to 0.10.60.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.34...openssl-v0.10.60)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 21:03:53 +00:00
dependabot[bot] 0128134d3d Bump openssl from 0.10.33 to 0.10.60 in /old_code/pubsub-enricher
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.33 to 0.10.60.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.33...openssl-v0.10.60)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 21:02:17 +00:00
dependabot[bot] da15968c4e Bump openssl in /old_code/twitch-ingestion-client
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.32 to 0.10.60.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.32...openssl-v0.10.60)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 21:00:56 +00:00
210 changed files with 6850 additions and 837 deletions
+4
View File
@@ -3,6 +3,7 @@
.env
.env-aichatbot-secrets
.env-elasticsearch-secrets
.env-migration-tool-secrets
.env-secrets
_develop/tools/.secrets
_develop/tools/db_secrets.toml
@@ -17,6 +18,9 @@ secrets.toml
secrets.yaml
twitch_secrets.toml
# Old env secrets
.*-secrets
# New env secrets (per-app)
*-secrets.env
@@ -1,12 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO voice_conversion_models\nSET\n token = ?,\n model_type = ?,\n title = ?,\n description_markdown = '',\n description_rendered_html = '',\n creator_user_token = ?,\n ip_address_creation = ?,\n ip_address_last_update = ?,\n original_download_url = ?,\n has_index_file = ?,\n private_bucket_hash = ?,\n private_bucket_object_name = ?,\n file_size_bytes = ?\n ",
"query": "\nINSERT INTO voice_conversion_models\nSET\n token = ?,\n model_type = ?,\n title = ?,\n description_markdown = '',\n description_rendered_html = '',\n creator_user_token = ?,\n ip_address_creation = ?,\n ip_address_last_update = ?,\n original_download_url = ?,\n has_index_file = ?,\n private_bucket_hash = ?,\n private_bucket_object_name = ?,\n file_size_bytes = ?,\n maybe_migration_new_model_weights_token = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 11
"Right": 12
},
"nullable": []
},
"hash": "1e85e546684feffc151a26b0495b9ab8aa4ee5f1627464a9872e9c357ba1dc7a"
"hash": "06734395f0a844e59d26c7d1cbc3e4b9a27f44c4bdacb8548d06a9e1dfb3db03"
}
@@ -0,0 +1,135 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n w.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n\n w.title,\n vc.has_index_file,\n\n w.private_bucket_hash,\n w.maybe_private_bucket_prefix,\n w.maybe_private_bucket_extension,\n\n w.created_at,\n w.updated_at,\n w.user_deleted_at,\n w.mod_deleted_at\n\nFROM model_weights as w\nJOIN model_weights_extension_voice_conversion_details as vc\nON vc.model_weights_token = w.token\n\nWHERE w.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "has_index_file",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 4,
"name": "private_bucket_hash",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 5,
"name": "maybe_private_bucket_prefix",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 6,
"name": "maybe_private_bucket_extension",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 8,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 9,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 10,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
true,
true,
false,
false,
true,
true
]
},
"hash": "0d4c43d9055cea3ce35c71ab8ef27058075414496dc5858d57a9f06d7c076bab"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights_extension_voice_conversion_details\nSET\n model_weights_token = ?,\n has_index_file = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "34aaedaebab0ea772714f31f42563b7e6b243c34a784e3f66f06aa102af3f1f9"
}
@@ -0,0 +1,212 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n f.token as `token: tokens::tokens::user_bookmarks::UserBookmarkToken`,\n f.entity_type as `entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType`,\n f.entity_token,\n f.user_token as `user_token: tokens::tokens::users::UserToken`,\n u.username,\n u.display_name as user_display_name,\n u.email_gravatar_hash as user_gravatar_hash,\n f.created_at,\n f.updated_at,\n f.deleted_at,\n\n media_files.media_type as `maybe_media_file_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n media_files.origin_product_category as `maybe_media_file_origin_category: enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory`,\n\n model_weights.title as maybe_descriptive_text_model_weight_title,\n tts_models.title as maybe_descriptive_text_tts_model_title,\n tts_results.raw_inference_text as maybe_descriptive_text_tts_result_inference_text,\n users.display_name as maybe_descriptive_text_user_display_name,\n voice_conversion_models.title as maybe_descriptive_text_voice_conversion_model_title,\n zs_voices.title as maybe_descriptive_text_zs_voice_title\n\nFROM\n user_bookmarks AS f\nJOIN users AS u\n ON f.user_token = u.token\n\nLEFT OUTER JOIN model_weights ON model_weights.token = f.entity_token\nLEFT OUTER JOIN media_files ON media_files.token = f.entity_token\nLEFT OUTER JOIN tts_models ON tts_models.token = f.entity_token\nLEFT OUTER JOIN tts_results ON tts_results.token = f.entity_token\nLEFT OUTER JOIN users ON users.token = f.entity_token\nLEFT OUTER JOIN voice_conversion_models ON voice_conversion_models.token = f.entity_token\nLEFT OUTER JOIN zs_voices ON zs_voices.token = f.entity_token\n\nWHERE\n u.username = ?\n AND f.entity_type = ?\n AND f.deleted_at IS NULL\nORDER BY f.id DESC\nLIMIT 50\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::user_bookmarks::UserBookmarkToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "entity_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "user_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 6,
"name": "user_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 8,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 9,
"name": "deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 10,
"name": "maybe_media_file_type: enums::by_table::media_files::media_file_type::MediaFileType",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 11,
"name": "maybe_media_file_origin_category: enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 12,
"name": "maybe_descriptive_text_model_weight_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 13,
"name": "maybe_descriptive_text_tts_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 14,
"name": "maybe_descriptive_text_tts_result_inference_text",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 15,
"name": "maybe_descriptive_text_user_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 16,
"name": "maybe_descriptive_text_voice_conversion_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 17,
"name": "maybe_descriptive_text_zs_voice_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true
]
},
"hash": "3a7ac7f979ac270dad1070031d0d663d0eb3d969365f6b2fd048ca41c5c455b2"
}
@@ -28,7 +28,7 @@
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -38,7 +38,7 @@
"name": "weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -128,7 +128,7 @@
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_thumbnail_token = NULL,\n maybe_avatar_media_file_token = NULL,\n maybe_cover_media_file_token = NULL,\n description_markdown = ?,\n description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n private_bucket_hash = ?,\n maybe_private_bucket_prefix = ?,\n maybe_private_bucket_extension = ?,\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n\nON DUPLICATE KEY UPDATE\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_thumbnail_token = NULL,\n maybe_avatar_media_file_token = NULL,\n maybe_cover_media_file_token = NULL,\n description_markdown = ?,\n description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n private_bucket_hash = ?,\n maybe_private_bucket_prefix = ?,\n maybe_private_bucket_extension = ?,\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 43
},
"nullable": []
},
"hash": "4f36ec7baa9fa98cca25b5cc11f09d0eaaa2dd5797374b4c1aa103999e8e1542"
}
@@ -0,0 +1,146 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n w.weights_type as `weight_type: enums::by_table::model_weights::weights_types::WeightsType`,\n w.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash as creator_gravatar_hash,\n w.title,\n w_extension.ietf_language_tag,\n w_extension.ietf_primary_language_subtag,\n w.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n w.created_at,\n w.updated_at\nFROM model_weights as w\nLEFT OUTER JOIN model_weights_extension_voice_conversion_details as w_extension\n ON w_extension.model_weights_token = w.token\nJOIN users\n ON users.token = w.creator_user_token\nWHERE\n w.weights_type IN (\"rvc_v2\", \"so_vits_svc\")\n AND w.user_deleted_at IS NULL\n AND w.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "weight_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 6,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 7,
"name": "ietf_language_tag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 8,
"name": "ietf_primary_language_subtag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 48
}
},
{
"ordinal": 9,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 10,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 11,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
false,
false
]
},
"hash": "57a63d507ccd60824e0cf346a6aa3d69b1e34361294f7e90733a497cb8643908"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n\n maybe_thumbnail_token = NULL,\n maybe_avatar_media_file_token = NULL,\n maybe_cover_media_file_token = NULL,\n description_markdown = NULL,\n description_rendered_html = NULL,\n\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n private_bucket_hash = ?,\n maybe_private_bucket_prefix = ?,\n maybe_private_bucket_extension = ?,\n\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n\n maybe_migration_old_model_token = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 15
},
"nullable": []
},
"hash": "685839dd0d875409fc1f3262e234518760c3d5b10c46fb8daf96756746c01c81"
}
@@ -28,7 +28,7 @@
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -38,7 +38,7 @@
"name": "weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -78,7 +78,7 @@
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -98,7 +98,7 @@
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
@@ -0,0 +1,212 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n f.token as `token: tokens::tokens::user_bookmarks::UserBookmarkToken`,\n f.entity_type as `entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType`,\n f.entity_token,\n f.user_token as `user_token: tokens::tokens::users::UserToken`,\n u.username,\n u.display_name as user_display_name,\n u.email_gravatar_hash as user_gravatar_hash,\n f.created_at,\n f.updated_at,\n f.deleted_at,\n\n media_files.media_type as `maybe_media_file_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n media_files.origin_product_category as `maybe_media_file_origin_category: enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory`,\n\n model_weights.title as maybe_descriptive_text_model_weight_title,\n tts_models.title as maybe_descriptive_text_tts_model_title,\n tts_results.raw_inference_text as maybe_descriptive_text_tts_result_inference_text,\n users.display_name as maybe_descriptive_text_user_display_name,\n voice_conversion_models.title as maybe_descriptive_text_voice_conversion_model_title,\n zs_voices.title as maybe_descriptive_text_zs_voice_title\n\nFROM\n user_bookmarks AS f\nJOIN users AS u\n ON f.user_token = u.token\n\nLEFT OUTER JOIN model_weights ON model_weights.token = f.entity_token\nLEFT OUTER JOIN media_files ON media_files.token = f.entity_token\nLEFT OUTER JOIN tts_models ON tts_models.token = f.entity_token\nLEFT OUTER JOIN tts_results ON tts_results.token = f.entity_token\nLEFT OUTER JOIN users ON users.token = f.entity_token\nLEFT OUTER JOIN voice_conversion_models ON voice_conversion_models.token = f.entity_token\nLEFT OUTER JOIN zs_voices ON zs_voices.token = f.entity_token\n\nWHERE\n u.username = ?\n AND f.deleted_at IS NULL\nORDER BY f.id DESC\nLIMIT 50\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::user_bookmarks::UserBookmarkToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "entity_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "user_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 6,
"name": "user_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 8,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 9,
"name": "deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 10,
"name": "maybe_media_file_type: enums::by_table::media_files::media_file_type::MediaFileType",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 11,
"name": "maybe_media_file_origin_category: enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 12,
"name": "maybe_descriptive_text_model_weight_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 13,
"name": "maybe_descriptive_text_tts_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 14,
"name": "maybe_descriptive_text_tts_result_inference_text",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 15,
"name": "maybe_descriptive_text_user_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 16,
"name": "maybe_descriptive_text_voice_conversion_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 17,
"name": "maybe_descriptive_text_zs_voice_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true
]
},
"hash": "707af35ee4ab4519f28e6d69982944666e6c7c0f24b5da79dde828ffdb2c8302"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights_extension_voice_conversion_details\nSET\n model_weights_token = ?,\n has_index_file = ?\nON DUPLICATE KEY UPDATE\n has_index_file = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "760f4250fe5fb700c95ba0296b6b06ed89c2399fd1cb03dbae36d6c35143aa30"
}
@@ -0,0 +1,36 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n w.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`\nFROM model_weights as w\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false
]
},
"hash": "98d53b1732bf0b0642ac6ebae3a3a2c40f21ec732693b92ad4bda69ae2b8d5bb"
}
@@ -28,7 +28,7 @@
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -38,7 +38,7 @@
"name": "weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -128,7 +128,7 @@
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
@@ -0,0 +1,344 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id,\n token as `token: tokens::tokens::voice_conversion_models::VoiceConversionModelToken`,\n\n model_type as `model_type: enums::by_table::voice_conversion_models::voice_conversion_model_type::VoiceConversionModelType`,\n maybe_vocoder_token as `maybe_vocoder_token: tokens::tokens::vocoder_models::VocoderModelToken`,\n\n title,\n description_markdown,\n description_rendered_html,\n\n ietf_language_tag,\n ietf_primary_language_subtag,\n\n has_index_file,\n\n is_front_page_featured,\n\n original_download_url,\n original_filename,\n file_size_bytes,\n\n creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n\n ip_address_creation,\n ip_address_last_update,\n\n maybe_last_update_user_token as `maybe_last_update_user_token: tokens::tokens::users::UserToken`,\n\n creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n private_bucket_hash,\n private_bucket_object_name,\n\n is_public_listing_approved,\n is_locked_from_user_modification,\n maybe_mod_comments,\n\n maybe_migration_new_model_weights_token as `maybe_migration_new_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n\n version,\n\n created_at,\n updated_at,\n\n user_deleted_at,\n mod_deleted_at\n\nFROM voice_conversion_models\nWHERE\n id > ?\nORDER BY id ASC\nLIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token: tokens::tokens::voice_conversion_models::VoiceConversionModelToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "model_type: enums::by_table::voice_conversion_models::voice_conversion_model_type::VoiceConversionModelType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "maybe_vocoder_token: tokens::tokens::vocoder_models::VocoderModelToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "description_markdown",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 6,
"name": "description_rendered_html",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 7,
"name": "ietf_language_tag",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 8,
"name": "ietf_primary_language_subtag",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY",
"char_set": 224,
"max_size": 48
}
},
{
"ordinal": 9,
"name": "has_index_file",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 10,
"name": "is_front_page_featured",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 11,
"name": "original_download_url",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 12,
"name": "original_filename",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 13,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 14,
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 15,
"name": "ip_address_creation",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 16,
"name": "ip_address_last_update",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 17,
"name": "maybe_last_update_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 18,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 19,
"name": "private_bucket_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 20,
"name": "private_bucket_object_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 21,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 22,
"name": "is_locked_from_user_modification",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 23,
"name": "maybe_mod_comments",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 24,
"name": "maybe_migration_new_model_weights_token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 25,
"name": "version",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 11
}
},
{
"ordinal": 26,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 27,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 28,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 29,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
true,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
false,
false,
false,
true,
false,
false,
false,
true,
false,
true,
true,
false,
false,
false,
true,
true
]
},
"hash": "d1da969247415305e6bff625150b4d2a8b3801fd27999be19cb47f5f86ea279c"
}
@@ -28,7 +28,7 @@
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -38,7 +38,7 @@
"name": "weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -78,7 +78,7 @@
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
@@ -98,7 +98,7 @@
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
@@ -0,0 +1,36 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n m.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n m.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`\nFROM model_weights as m\nWHERE m.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false
]
},
"hash": "f80fb6c91b897bc4a5c24cfd1e16c5975f9438c88421f19a1788531f335e75c2"
}
Generated
+92 -82
View File
@@ -483,15 +483,6 @@ dependencies = [
"libc",
]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "anstream"
version = "0.6.4"
@@ -605,9 +596,9 @@ dependencies = [
[[package]]
name = "async-stripe"
version = "0.25.2"
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1b39347f478f57a40cbaf82cbaebb4a350acc757cda30fc7ff88707a11d1d81"
checksum = "19a0b12cb3b2df9abfaa381632e4d55b2aede9063034daaa0d0145413719a7e1"
dependencies = [
"chrono",
"futures-util",
@@ -629,9 +620,9 @@ dependencies = [
[[package]]
name = "async-trait"
version = "0.1.74"
version = "0.1.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98"
dependencies = [
"proc-macro2",
"quote",
@@ -684,17 +675,6 @@ dependencies = [
"url",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi 0.1.19",
"libc",
"winapi 0.3.9",
]
[[package]]
name = "autocfg"
version = "1.1.0"
@@ -813,6 +793,7 @@ dependencies = [
"tokio",
"toml 0.5.11",
"url_config",
"user_traits_component",
]
[[package]]
@@ -1098,21 +1079,6 @@ dependencies = [
"inout",
]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags 1.3.2",
"strsim 0.8.0",
"textwrap",
"unicode-width",
"vec_map",
]
[[package]]
name = "clap"
version = "4.4.8"
@@ -1132,7 +1098,7 @@ dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim 0.10.0",
"strsim",
]
[[package]]
@@ -1158,10 +1124,19 @@ name = "cloud_storage"
version = "0.0.1"
dependencies = [
"anyhow",
"async-trait",
"buckets",
"crockford",
"easyenv",
"env_logger",
"errors",
"filesys",
"hashing",
"log",
"mimetypes",
"my-workspace-hack",
"rust-s3",
"storyteller_root",
"tokio",
]
@@ -1529,7 +1504,7 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"strsim",
"syn 1.0.109",
]
@@ -1543,7 +1518,7 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"strsim",
"syn 1.0.109",
]
@@ -1557,7 +1532,7 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"strsim",
"syn 2.0.39",
]
@@ -1737,7 +1712,7 @@ name = "dev-database-seed"
version = "0.0.1"
dependencies = [
"buckets",
"clap 2.34.0",
"clap",
"cloud_storage",
"config",
"easyenv",
@@ -1763,7 +1738,7 @@ name = "dev-upload-media-file"
version = "0.0.1"
dependencies = [
"buckets",
"clap 2.34.0",
"clap",
"cloud_storage",
"config",
"easyenv",
@@ -1911,6 +1886,7 @@ version = "0.0.1"
dependencies = [
"anyhow",
"bootstrap",
"buckets",
"chrono",
"cloud_storage",
"concurrency",
@@ -1928,6 +1904,7 @@ dependencies = [
"hyper",
"jobs_common",
"log",
"migration",
"mimetypes",
"my-workspace-hack",
"mysql_queries",
@@ -1940,6 +1917,7 @@ dependencies = [
"subprocess",
"subprocess_common",
"tempdir",
"tokens",
"tokio",
"zip",
]
@@ -2046,7 +2024,7 @@ name = "elasticsearch-cli"
version = "0.0.1"
dependencies = [
"buckets",
"clap 2.34.0",
"clap",
"config",
"easyenv",
"elasticsearch",
@@ -2102,7 +2080,6 @@ dependencies = [
"bootstrap",
"buckets",
"chrono",
"clap 2.34.0",
"cloud_storage",
"concurrency",
"config",
@@ -2666,15 +2643,6 @@ dependencies = [
"unicode-segmentation",
]
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "hermit-abi"
version = "0.3.3"
@@ -3017,6 +2985,7 @@ dependencies = [
"log",
"media",
"memory_caching",
"migration",
"mime",
"mimetypes",
"my-workspace-hack",
@@ -3077,7 +3046,7 @@ version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi 0.3.3",
"hermit-abi",
"rustix",
"windows-sys 0.48.0",
]
@@ -3380,7 +3349,7 @@ dependencies = [
name = "lru-delete-models"
version = "0.0.1"
dependencies = [
"clap 4.4.8",
"clap",
"errors",
"logging",
"my-workspace-hack",
@@ -3524,6 +3493,56 @@ dependencies = [
"my-workspace-hack",
]
[[package]]
name = "migration"
version = "0.0.1"
dependencies = [
"anyhow",
"buckets",
"chrono",
"cloud_storage",
"enums",
"errors",
"jobs_common",
"my-workspace-hack",
"mysql_queries",
"once_cell",
"serde",
"serde_derive",
"serde_json",
"serial_test",
"sqlx",
"tokens",
"tokio",
"toml 0.5.11",
]
[[package]]
name = "migration-tool"
version = "0.0.1"
dependencies = [
"buckets",
"clap",
"cloud_storage",
"config",
"easyenv",
"enums",
"errors",
"hashing",
"log",
"my-workspace-hack",
"mysql_queries",
"serde",
"serde_derive",
"serde_json",
"sqlx",
"storyteller_root",
"strum",
"tempdir",
"tokens",
"tokio",
]
[[package]]
name = "mime"
version = "0.3.17"
@@ -3973,7 +3992,7 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi 0.3.3",
"hermit-abi",
"libc",
]
@@ -5125,7 +5144,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
name = "scrape_test"
version = "0.0.1"
dependencies = [
"clap 2.34.0",
"clap",
"errors",
"my-workspace-hack",
"tokio",
@@ -5921,6 +5940,7 @@ dependencies = [
"md-5 0.9.1",
"media",
"memory_caching",
"migration",
"mimetypes",
"my-workspace-hack",
"mysql_queries",
@@ -5954,6 +5974,7 @@ dependencies = [
"twitch_oauth2",
"url_config",
"user_input_common",
"user_traits_component",
"users_component",
"utoipa",
"utoipa-swagger-ui",
@@ -6006,12 +6027,6 @@ dependencies = [
"unicode-normalization",
]
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.10.0"
@@ -6331,15 +6346,6 @@ dependencies = [
"my-workspace-hack",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]]
name = "thiserror"
version = "1.0.50"
@@ -6764,7 +6770,6 @@ version = "0.0.1"
dependencies = [
"anyhow",
"chrono",
"clap 2.34.0",
"cloud_storage",
"collections",
"config",
@@ -7066,6 +7071,16 @@ dependencies = [
"unicode-segmentation",
]
[[package]]
name = "user_traits_component"
version = "0.0.1"
dependencies = [
"actix-web",
"errors",
"mockall",
"my-workspace-hack",
]
[[package]]
name = "users_component"
version = "0.0.1"
@@ -7109,6 +7124,7 @@ dependencies = [
"tokens",
"toml 0.5.11",
"user_input_common",
"user_traits_component",
]
[[package]]
@@ -7185,12 +7201,6 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version-sync"
version = "0.9.5"
+7 -4
View File
@@ -10,13 +10,14 @@ members = [
"crates/_types/tokens",
# CLI tools for operations, etc.
"crates/cli/database_backup",
"crates/cli/database_cleanup",
"crates/cli/dev_database_seed",
"crates/cli/dev_upload_media_file",
"crates/cli/database-backup",
"crates/cli/database-cleanup",
"crates/cli/dev-database-seed",
"crates/cli/dev-upload-media-file",
"crates/cli/elasticsearch-cli",
"crates/cli/kubectl-pod-cleanup",
"crates/cli/lru-delete-models",
"crates/cli/migration-tool",
"crates/cli/scrape_test",
# Shared libraries
@@ -48,6 +49,7 @@ members = [
"crates/lib/idempotency",
"crates/lib/jobs_common",
"crates/lib/logging",
"crates/lib/migration",
"crates/lib/mysql_queries",
"crates/lib/password",
"crates/lib/redis_common",
@@ -83,6 +85,7 @@ members = [
# Service Plugins: complete subsystems that can be plugged into services (users, billing, etc.)
"crates/service/plugins/billing",
"crates/service/plugins/inference_workloads",
"crates/service/plugins/user_traits_component",
"crates/service/plugins/users",
# Vendored code
+6
View File
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Re-home Nessu's models
update tts_models set creator_user_token = "user_7z1h6sykg4r62" where creator_user_token = "U:C00NRSW1AE8T4" limit 5;
+12
View File
@@ -13,6 +13,9 @@ where token IN (
'vcm_502wkt2pca3y'
);
-- Re-home Nessu's models
update voice_conversion_models set creator_user_token = "user_7z1h6sykg4r62" where creator_user_token = "U:C00NRSW1AE8T4" limit 5;
-- Remove broken models
update voice_conversion_models
set
@@ -376,6 +379,15 @@ where token IN (
);
update voice_conversion_models
set
mod_deleted_at = NOW(),
maybe_mod_comments = 'abuse'
where token IN (
'vcm_qajyd528p8kw',
'vcm_f5pcdecmzcc5'
);
@@ -23,6 +23,27 @@ and success_execution_millis IS NOT NULL
order by id desc
limit 50;
-- See how many are using a deleted model
select
creator_ip_address,
count(*)
from generic_inference_jobs
where maybe_model_token = 'vcm_4x8a30h1r26z'
and created_at > NOW() - INTERVAL 24 HOUR
group by creator_ip_address
-- See which deleted models are in use
select
vm.token,
vm.title,
count(*)
from generic_inference_jobs as j
join voice_conversion_models as vm
on j.maybe_model_token = vm.token
where vm.mod_deleted_at IS NOT NULL
and j.created_at > NOW() - INTERVAL 24 HOUR
group by vm.token, vm.title
-- See who is uploading SadTalker jobs
select
maybe_creator_user_token,
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights DROP COLUMN maybe_migration_old_model_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights
ADD COLUMN maybe_migration_old_model_token VARCHAR(32) DEFAULT NULL
AFTER cached_user_ratings_last_updated_at;
ALTER TABLE model_weights
ADD UNIQUE INDEX unique_index_maybe_migration_old_model_token (maybe_migration_old_model_token);
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE voice_conversion_models
DROP COLUMN maybe_migration_new_model_weights_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE voice_conversion_models
ADD COLUMN maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL
AFTER maybe_mod_comments;
ALTER TABLE voice_conversion_models
ADD UNIQUE INDEX unique_index_maybe_migration_new_model_weights_token (maybe_migration_new_model_weights_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE tts_models DROP COLUMN maybe_migration_new_model_weights_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE tts_models
ADD COLUMN maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL
AFTER maybe_mod_user_token;
ALTER TABLE tts_models
ADD UNIQUE INDEX unique_index_maybe_migration_new_model_weights_token (maybe_migration_new_model_weights_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE vocoder_models DROP COLUMN maybe_migration_new_model_weights_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE vocoder_models
ADD COLUMN maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL
AFTER maybe_mod_user_token;
ALTER TABLE vocoder_models
ADD UNIQUE INDEX unique_index_maybe_migration_new_model_weights_token (maybe_migration_new_model_weights_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights DROP COLUMN maybe_avatar_media_file_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights
ADD COLUMN maybe_avatar_media_file_token VARCHAR(32) DEFAULT NULL
AFTER maybe_thumbnail_token;
ALTER TABLE model_weights
ADD INDEX index_maybe_avatar_media_file_token (maybe_avatar_media_file_token);
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights DROP COLUMN maybe_cover_media_file_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights
ADD COLUMN maybe_cover_media_file_token VARCHAR(32) DEFAULT NULL
AFTER maybe_avatar_media_file_token;
ALTER TABLE model_weights
ADD INDEX index_maybe_cover_media_file_token (maybe_cover_media_file_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users DROP COLUMN maybe_avatar_media_file_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users
ADD COLUMN maybe_avatar_media_file_token VARCHAR(32) DEFAULT NULL
AFTER ip_address_last_update;
ALTER TABLE users
ADD INDEX index_maybe_avatar_media_file_token (maybe_avatar_media_file_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users DROP COLUMN maybe_cover_media_file_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE users
ADD COLUMN maybe_cover_media_file_token VARCHAR(32) DEFAULT NULL
AFTER maybe_avatar_media_file_token;
ALTER TABLE users
ADD INDEX index_maybe_cover_media_file_token (maybe_cover_media_file_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE model_weights_preview_samples;
@@ -0,0 +1,47 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE TABLE model_weights_preview_samples (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== WEIGHTS CLASSIFICATION ==========
-- Foreign key to model weights.
-- This is in a composite index with media_file_token to make sure a media file only applies
-- to a given model once.
model_weight_token VARCHAR(32) NOT NULL,
-- Foreign key to media files
-- This is in a composite index with model_weight_token to make sure a media file only applies
-- to a given model once.
media_file_token VARCHAR(32) NOT NULL,
-- Information about who set the sample
-- * automation
-- * author
-- * community
set_by VARCHAR(16) NOT NULL,
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weight_token, media_file_token),
KEY index_model_weight_token (model_weight_token),
KEY index_media_file_token (media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,9 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- I'm doing this to visually align these tables and sort them together, because there will likely be other model_weights_* tables.
RENAME TABLE model_weights_extension_image_generation_details TO model_weights_image_generation_details;
RENAME TABLE model_weights_extension_tts_details TO model_weights_tts_details;
RENAME TABLE model_weights_extension_vocoder_details TO model_weights_vocoder_details;
RENAME TABLE model_weights_extension_voice_conversion_details TO model_weights_voice_conversion_details;
@@ -0,0 +1,9 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- I'm doing this to visually align these tables and sort them together, because there will likely be other model_weights_* tables.
RENAME TABLE model_weights_image_generation_details TO model_weights_extension_image_generation_details;
RENAME TABLE model_weights_tts_details TO model_weights_extension_tts_details;
RENAME TABLE model_weights_vocoder_details TO model_weights_extension_vocoder_details;
RENAME TABLE model_weights_voice_conversion_details TO model_weights_extension_voice_conversion_details;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP INDEX index_weights_type ON model_weights;
DROP INDEX index_weights_category ON model_weights;
DROP INDEX fk_creator_user_token ON model_weights;
DROP INDEX index_creator_set_visibility ON model_weights;
DROP INDEX fk_maybe_avatar_media_file_token ON model_weights;
DROP INDEX fk_maybe_cover_media_file_token ON model_weights;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE INDEX index_weights_type ON model_weights (weights_type);
CREATE INDEX index_weights_category ON model_weights (weights_category);
CREATE INDEX fk_creator_user_token ON model_weights (creator_user_token);
CREATE INDEX index_creator_set_visibility ON model_weights (creator_set_visibility);
CREATE INDEX fk_maybe_avatar_media_file_token ON model_weights (maybe_avatar_media_file_token);
CREATE INDEX fk_maybe_cover_media_file_token ON model_weights (maybe_cover_media_file_token);
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP INDEX fk_maybe_avatar_media_file_token ON users;
DROP INDEX fk_maybe_cover_media_file_token ON users;
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE INDEX fk_maybe_avatar_media_file_token ON users (maybe_avatar_media_file_token);
CREATE INDEX fk_maybe_cover_media_file_token ON users (maybe_cover_media_file_token);
@@ -0,0 +1,200 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Every type of fine tuned model that users can upload.
CREATE TABLE model_weights (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Effective "primary key" (PUBLIC)
token VARCHAR(32) NOT NULL,
-- ========== WEIGHTS CLASSIFICATION ==========
-- The exact type of weights
-- Currently supported values:
-- * 'hifigan_tt2' - hifigan for Tacotron2; TTS vocoder
-- * 'rvc_v2' - RVC (v2); voice conversion
-- * 'sd_1.5' - Stable Diffusion 1.5; image generation
-- * 'sdxl' - Stable Diffusion XL; image generation
-- * 'so_vits_svc' - SVC; voice conversion
-- * 'tt2' - Tacotron2; TTS
weights_type VARCHAR(32) NOT NULL,
-- The broader category of the weights
-- Currently supported values:
-- * 'image_generation' (SD1.5, SDXL)
-- * 'text_to_speech' (TT2)
-- * 'vocoder' (Hifigan)
-- * 'voice_conversion' (RVCv2, SVC)
weights_category VARCHAR(32) NOT NULL,
-- ========== MODEL DESCRIPTION ==========
-- The "name" of the model, which might be complicated.
title VARCHAR(255) NOT NULL,
-- TODO(bt, 2023-12-14): Delete the `maybe_thumbnail_token` column later.
-- We're using other columns instead.
maybe_thumbnail_token VARCHAR(32) DEFAULT NULL,
-- The "avatar" image is a media file of type image that serves as a
-- small avatar or profile picture icon.
maybe_avatar_media_file_token VARCHAR(32) DEFAULT NULL,
-- The "cover" image is a media file of type image that covers the
-- top of the page.
maybe_cover_media_file_token VARCHAR(32) DEFAULT NULL,
-- The description of the model in markdown.
description_markdown TEXT NOT NULL,
-- Generated HTML (not user-editable).
description_rendered_html TEXT NOT NULL,
-- ========== CREATOR DETAILS ==========
-- The person that created the model.
creator_user_token VARCHAR(32) NOT NULL,
-- For abuse tracking.
-- Wide enough for IPv4/6.
-- IP address of creator at time of creation.
creator_ip_address VARCHAR(40) NOT NULL,
-- (THIS MIGHT NOT BE USED)
-- NB: DO NOT SORT!
-- THIS MUST MATCH THE RESPECTIVE JOBS TABLE.
creator_set_visibility ENUM(
'public',
'hidden',
'private'
) NOT NULL DEFAULT 'public',
-- The synthetic id associated with this model.
-- These ids are incremented on a per-user basis to help users
-- sequence their own work. They serve no other purpose.
-- "weights" synthetic ids are incremented over all media files
-- creator_weights_synthetic_id BIGINT(20) DEFAULT NULL,
-- "weights_type" synthetic ids are incremented over a given weight type
-- creator_weights_type_synthetic_id BIGINT(20) DEFAULT NULL,
-- The last user to edit the model. This could be the creator or a moderator.
-- Check the future audit logs table for more info.
maybe_last_update_user_token VARCHAR(32) DEFAULT NULL,
-- ========== IMMUTABLE PROVENANCE AND METADATA ==========
-- Where the file was originally downloaded (if it was downloaded)
original_download_url VARCHAR(512) DEFAULT NULL,
-- The filename that was used at upload time (if available)
original_filename VARCHAR(255) DEFAULT NULL,
-- File characteristics
file_size_bytes INT(10) NOT NULL DEFAULT 0,
-- Checksum of the original weights file
-- SHA2 hash [SHA2 = CHAR(64), SHA1 = CHAR(40), MD5 = CHAR(32)]
-- Note that SHA2 is a hash family (SHA-228, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256, ...)
-- and produces different lengths output depending on the choice of algorithm.
file_checksum_sha2 CHAR(64) NOT NULL,
-- ========== BUCKET STORAGE ==========
-- The hash for the bucket directory that contains the original upload
-- as well as any associated other files.
-- The bucket filename for the primary file (not including the directory path) is given by:
-- `[{maybe_private_bucket_prefix}]{private_bucket_hash}[{maybe_private_bucket_extension}]`
private_bucket_hash VARCHAR(32) NOT NULL,
-- An optional prefix on the bucket filename.
-- If present, this will be prepended to the beginning of the bucket filename to access the file.
-- The bucket filename for the primary file (not including the directory path) is given by:
-- `[{maybe_private_bucket_prefix}]{private_directory_hash}[{maybe_private_bucket_extension}]`
maybe_private_bucket_prefix VARCHAR(16) DEFAULT NULL,
-- An optional appended extension on the bucket filename.
-- If present, this will be appended to the end of the bucket filename to access the file.
-- To allow for flexibility, this extension typically will contain a leading period if
-- the file needs it (eg ".mp4" rather than "mp4")!
-- The bucket filename for the primary file (not including the directory path) is given by:
-- `[{maybe_private_bucket_prefix}]{private_directory_hash}[{maybe_private_bucket_extension}]`
maybe_private_bucket_extension VARCHAR(16) DEFAULT NULL,
-- ========== MODERATION DETAILS ==========
-- Mods may have to approve of vc models for them to show up in a public index.
-- Models can be used by the author (or other parties that know the URL) before
-- they're approved, but unapproved models won't show up in public indices.
-- This is independent of other visibility controls (is_mod_disabled, deleted_at,
-- and creator_set_visibility)
-- is_public_listing_approved BOOLEAN DEFAULT NULL,
-- Extremely popular models may be locked from deletion or modification by users.
-- is_locked_from_user_modification BOOLEAN NOT NULL DEFAULT FALSE,
-- ========== RATING AND RANKING ==========
-- User ratings are cached on the model, but are *not* a source of truth.
-- Total count only includes "positive" and "negative" votes, not neutral ones.
cached_user_ratings_total_count INT(10) UNSIGNED NOT NULL DEFAULT 0,
-- Total positive
cached_user_ratings_positive_count INT(10) UNSIGNED NOT NULL DEFAULT 0,
-- Total negative
cached_user_ratings_negative_count INT(10) UNSIGNED NOT NULL DEFAULT 0,
-- User ratings are cached on the model, but are *not* a source of truth.
-- Total count only includes "positive" and "negative" votes, not neutral ones.
maybe_cached_user_ratings_ratio FLOAT,
-- When the cached ratings were last calculated and updated.
cached_user_ratings_last_updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- ========== MIGRATION DETAILS ==========
-- If migrated from another table, this is the token of the original model.
maybe_migration_old_model_token VARCHAR(32) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_weights_type (weights_type),
KEY index_weights_category (weights_category),
KEY fk_creator_user_token (creator_user_token),
KEY index_creator_set_visibility (creator_set_visibility),
KEY fk_maybe_avatar_media_file_token (maybe_avatar_media_file_token),
KEY fk_maybe_cover_media_file_token (maybe_cover_media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,50 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Every type of fine tuned model that users can upload.
CREATE TABLE model_weights_extension_image_generation_details (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Simultaneous primary and foreign key.
-- This should match a single record in the `model_weights` table.
-- This turns this table into a polymorphic extension table.
model_weights_token VARCHAR(32) NOT NULL,
-- ========== IMAGE GENERATION MODEL METADATA ==========
-- RVC (v2) specific - whether the model has an index file associated with it
-- These files improve the quality of the results.
vc_has_index_file BOOLEAN NOT NULL DEFAULT FALSE,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weights_token)
-- TODO:
-- KEY index_model_type (model_type),
-- KEY fk_maybe_vocoder_token (maybe_vocoder_token),
-- KEY fk_creator_user_token (creator_user_token),
-- KEY index_creator_set_visibility (creator_set_visibility),
-- KEY index_private_bucket_hash (private_bucket_hash),
-- KEY index_is_public_listing_approved (is_public_listing_approved),
-- KEY index_is_locked_from_user_modification (is_locked_from_user_modification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,73 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Extra metadata on tts models
CREATE TABLE model_weights_extension_tts_details (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Simultaneous primary and foreign key.
-- This should match a single record in the `model_weights` table.
-- This turns this table into a polymorphic extension table.
model_weights_token VARCHAR(32) NOT NULL,
-- ========== TTS MODEL METADATA ==========
-- The full IETF BCP47 language tag (eg. en, en-US, es-419, ja-JP, pt, etc.)
-- (Not that it matters apart from categorization, since voice conversion is universal.)
ietf_language_tag VARCHAR(64) NOT NULL DEFAULT 'en',
-- The IETF BCP47 language tag's primary language subtag (eg. "es-419" becomes "es")
-- (Not that it matters apart from categorization, since voice conversion is universal.)
ietf_primary_language_subtag VARCHAR(12) NOT NULL DEFAULT 'en',
-- This is for Tacotron2, specifically.
-- The name of the type of pipeline to use, eg "legacy_fakeyou", "legacy_vocodes", "english_v1", etc.
-- New pipelines may be added at any point in the future and the source of truth for them will mostly
-- live in the `storyteller-ml` repository.
-- Older models and brand new models will have this field set to null, and we'll infer which value to
-- lazily backfill based on the creation date and language setting.
-- tts_text_pipeline_type VARCHAR(64) DEFAULT NULL,
-- If true, multiply the mel outputs before being vocoded by a globally default constant.
use_default_mel_multiply_factor BOOLEAN NOT NULL DEFAULT FALSE,
-- If not null, multiply the mel outputs before being vocoded by this value.
-- This is used instead of the default if `tts_use_default_mel_multiply_factor` is
-- set (ie. `tts_use_default_mel_multiply_factor` is ignored and this custom value is used instead)
maybe_custom_mel_multiply_factor DOUBLE DEFAULT NULL,
-- If set, use a different pretrained vocoder.
-- If not set, use the website default. (Currently HifiGan-SS)
maybe_default_pretrained_vocoder VARCHAR(64) DEFAULT NULL,
-- If set, we'll use a custom vocoder (from table vocoder_models) instead of a default vocoder.
-- If not set, we'll use `maybe_default_pretrained_vocoder` (or the website default).
maybe_custom_vocoder_token VARCHAR(32) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weights_token)
-- TODO:
-- KEY index_model_type (model_type),
-- KEY fk_maybe_vocoder_token (maybe_vocoder_token),
-- KEY fk_creator_user_token (creator_user_token),
-- KEY index_creator_set_visibility (creator_set_visibility),
-- KEY index_private_bucket_hash (private_bucket_hash),
-- KEY index_is_public_listing_approved (is_public_listing_approved),
-- KEY index_is_locked_from_user_modification (is_locked_from_user_modification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,50 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Every type of fine tuned model that users can upload.
CREATE TABLE model_weights_extension_vocoder_details (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Simultaneous primary and foreign key.
-- This should match a single record in the `model_weights` table.
-- This turns this table into a polymorphic extension table.
model_weights_token VARCHAR(32) NOT NULL,
-- ========== VOCODER MODEL METADATA ==========
-- Whether the vocoder is recommended for use
-- vocoder_is_staff_recommended BOOLEAN NOT NULL DEFAULT FALSE,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weights_token)
-- TODO:
-- KEY index_model_type (model_type),
-- KEY fk_maybe_vocoder_token (maybe_vocoder_token),
-- KEY fk_creator_user_token (creator_user_token),
-- KEY index_creator_set_visibility (creator_set_visibility),
-- KEY index_private_bucket_hash (private_bucket_hash),
-- KEY index_is_public_listing_approved (is_public_listing_approved),
-- KEY index_is_locked_from_user_modification (is_locked_from_user_modification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,62 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Every type of fine tuned model that users can upload.
CREATE TABLE model_weights_extension_voice_conversion_details (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- Simultaneous primary and foreign key.
-- This should match a single record in the `model_weights` table.
-- This turns this table into a polymorphic extension table.
model_weights_token VARCHAR(32) NOT NULL,
-- ========== VOICE CONVERSION MODEL METADATA ==========
-- The full IETF BCP47 language tag (eg. en, en-US, es-419, ja-JP, pt, etc.)
-- (Not that it matters apart from categorization, since voice conversion is universal.)
ietf_language_tag VARCHAR(64) NOT NULL DEFAULT 'en',
-- The IETF BCP47 language tag's primary language subtag (eg. "es-419" becomes "es")
-- (Not that it matters apart from categorization, since voice conversion is universal.)
ietf_primary_language_subtag VARCHAR(12) NOT NULL DEFAULT 'en',
-- RVC (v2) specific - whether the model has an index file associated with it
-- These files improve the quality of the results.
has_index_file BOOLEAN NOT NULL DEFAULT FALSE,
-- Pitch algorithm to use by default
default_pitch_algorithm VARCHAR(64) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weights_token)
-- TODO:
-- KEY index_model_type (model_type),
-- KEY fk_maybe_vocoder_token (maybe_vocoder_token),
-- KEY fk_creator_user_token (creator_user_token),
-- KEY index_creator_set_visibility (creator_set_visibility),
-- KEY index_private_bucket_hash (private_bucket_hash),
-- KEY index_is_public_listing_approved (is_public_listing_approved),
-- KEY index_is_locked_from_user_modification (is_locked_from_user_modification)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,47 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
CREATE TABLE model_weights_preview_samples (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== WEIGHTS CLASSIFICATION ==========
-- Foreign key to model weights.
-- This is in a composite index with media_file_token to make sure a media file only applies
-- to a given model once.
model_weight_token VARCHAR(32) NOT NULL,
-- Foreign key to media files
-- This is in a composite index with model_weight_token to make sure a media file only applies
-- to a given model once.
media_file_token VARCHAR(32) NOT NULL,
-- Information about who set the sample
-- * automation
-- * author
-- * community
set_by VARCHAR(16) NOT NULL,
-- Incremented with every update.
version INT NOT NULL DEFAULT 0,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- If this is removed by a mod.
-- It completely disappears from the system.
user_deleted_at TIMESTAMP NULL,
mod_deleted_at TIMESTAMP NULL,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (model_weight_token, media_file_token),
KEY index_model_weight_token (model_weight_token),
KEY index_media_file_token (media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -200,6 +200,11 @@ CREATE TABLE tts_models (
-- The last moderator that made changes.
maybe_mod_user_token VARCHAR(32) DEFAULT NULL,
-- ========== MIGRATION DETAILS ==========
-- If migrated to model_weights, this is the new token
maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
@@ -99,6 +99,11 @@ CREATE TABLE vocoder_models (
-- The last moderator that made changes.
maybe_mod_user_token VARCHAR(32) DEFAULT NULL,
-- ========== MIGRATION DETAILS ==========
-- If migrated to model_weights, this is the new token
maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
+11 -1
View File
@@ -53,6 +53,14 @@ CREATE TABLE users (
-- ========== DISPLAY / PROFILE ==========
-- The "avatar" image is a media file of type image that serves as a
-- small avatar or profile picture icon.
maybe_avatar_media_file_token VARCHAR(32) DEFAULT NULL,
-- The "cover" image is a media file of type image that covers the
-- top of the page.
maybe_cover_media_file_token VARCHAR(32) DEFAULT NULL,
-- Gravatar image hashes are precomputed.
email_gravatar_hash CHAR(32) NOT NULL,
@@ -162,7 +170,9 @@ CREATE TABLE users (
UNIQUE KEY (token),
UNIQUE KEY (username),
UNIQUE KEY (email_address),
KEY fk_user_role_slug (user_role_slug)
KEY fk_user_role_slug (user_role_slug),
KEY fk_maybe_avatar_media_file_token (maybe_avatar_media_file_token),
KEY fk_maybe_cover_media_file_token (maybe_cover_media_file_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -121,6 +121,11 @@ CREATE TABLE voice_conversion_models (
-- If a moderator has comments.
maybe_mod_comments VARCHAR(255) DEFAULT NULL,
-- ========== MIGRATION DETAILS ==========
-- If migrated to model_weights, this is the new token
maybe_migration_new_model_weights_token VARCHAR(32) DEFAULT NULL,
-- ========== VECTOR CLOCK ==========
-- Incremented with every update.
+1
View File
@@ -18,6 +18,7 @@ path = "src/lib.rs"
crockford = { path = "../../lib/crockford" }
errors = { path = "../../lib/errors" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
+1 -1
View File
@@ -10,7 +10,7 @@
// Okay to toggle
#![forbid(unreachable_patterns)]
#![forbid(unused_imports)]
// #![forbid(unused_imports)]
#![forbid(unused_mut)]
#![forbid(unused_variables)]
+2 -1
View File
@@ -2,4 +2,5 @@ pub mod media_files;
pub mod media_uploads;
pub mod public_path;
pub mod voice_conversion_results;
pub mod weight_uploads;
pub mod weight_uploads;
pub mod weight_files;
@@ -0,0 +1,75 @@
use crockford::crockford_entropy_lower;
use crate::public::public_path::PublicPath;
use crate::util::hashed_directory_path_long_string::hashed_directory_path_long_string;
// TODO: Generate these from a macro.
// TODO: Use a central path registry for quick reference
const WEIGHT_FILE_DIRECTORY: &str = "/weights";
/// Directory for user weight uploads.
/// Each uploaded file gets its own directory so that we can store the original
/// file alongside re-processed derivatives.
#[derive(Clone)]
pub struct WeightFileBucketDirectory {
object_hash: String,
directory: String,
}
impl PublicPath for WeightFileBucketDirectory {}
impl WeightFileBucketDirectory {
pub fn generate_new() -> Self {
let entropy = crockford_entropy_lower(32);
Self::from_object_hash(&entropy)
}
pub fn from_object_hash(object_hash: &str) -> Self {
// TODO: Path construction could be cleaner.
let middle = hashed_directory_path_long_string(object_hash);
let directory = format!("{}/{}{}", WEIGHT_FILE_DIRECTORY, middle, object_hash);
Self {
object_hash: object_hash.to_string(),
directory,
}
}
pub fn get_directory_path_str(&self) -> &str {
&self.directory
}
pub fn get_object_hash(&self) -> &str {
&self.object_hash
}
}
#[cfg(test)]
mod tests {
use crate::public::weight_files::bucket_directory::WeightFileBucketDirectory;
#[test]
pub fn generate_new_entropy() {
let directory = WeightFileBucketDirectory::generate_new();
assert_eq!(directory.get_object_hash().len(), 32);
}
#[test]
pub fn get_directory_path_str() {
let directory = WeightFileBucketDirectory::from_object_hash("abcdefghijk");
assert_eq!(directory.get_directory_path_str(), "/weights/a/b/c/d/e/abcdefghijk");
}
#[test]
pub fn get_directory_path_str_short_name() {
let directory = WeightFileBucketDirectory::from_object_hash("foo");
assert_eq!(directory.get_directory_path_str(), "/weights/f/o/foo");
}
#[test]
pub fn get_object_hash() {
let hash = "abcdefghijk";
let directory = WeightFileBucketDirectory::from_object_hash(hash);
assert_eq!(directory.get_object_hash(), hash);
}
}
@@ -0,0 +1,218 @@
use std::path::PathBuf;
use crockford::crockford_entropy_lower;
use crate::public::public_path::PublicPath;
const ORIGINAL_FILE_BASENAME : &str = "file.bin";
// TODO: Generate these from a macro.
use crate::public::weight_files::bucket_directory::WeightFileBucketDirectory;
/// The original user upload file.
/// It may have derivative files (down samples, crops, etc.) that live alongside it.
#[derive(Clone)]
pub struct WeightFileBucketPath {
directory: WeightFileBucketDirectory,
filename: String,
full_object_path: String,
optional_prefix: Option<String>,
/// NB: Extension contains the leading period, eg. ".mp4"
optional_extension: Option<String>,
}
impl PublicPath for WeightFileBucketPath {}
impl WeightFileBucketPath {
// TODO(bt,2023-12-19): This is temporary standardization. Clean this up.
pub fn generate_for_svc_model() -> Self {
Self::generate_new(Some("svc_"), Some(".pt"))
}
// TODO(bt,2023-12-19): This is temporary standardization. Clean this up.
pub fn generate_for_rvc_model() -> Self {
Self::generate_new(Some("rvc_"), Some(".pt"))
}
// TODO(bt,2023-12-19): This is temporary standardization. Clean this up.
pub fn svc_model_file_from_object_hash(hash: &str) -> Self {
Self::from_object_hash(hash, Some("svc_"), Some(".pt"))
}
// TODO(bt,2023-12-19): This is temporary standardization. Clean this up.
pub fn rvc_model_file_from_object_hash(hash: &str) -> Self {
Self::from_object_hash(hash, Some("rvc_"), Some(".pt"))
}
// TODO(bt,2023-12-19): This is temporary standardization. Clean this up.
pub fn rvc_index_file_from_object_hash(hash: &str) -> Self {
Self::from_object_hash(hash, Some("rvc_"), Some(".index"))
}
pub fn generate_new(optional_prefix: Option<&str>, optional_extension: Option<&str>) -> Self {
let entropy = crockford_entropy_lower(32);
Self::from_object_hash(&entropy, optional_prefix, optional_extension)
}
pub fn from_object_hash(hash: &str, optional_prefix: Option<&str>, optional_extension: Option<&str>) -> Self {
// TODO: Path construction could be cleaner.
let directory = WeightFileBucketDirectory::from_object_hash(hash);
let filename = match (optional_prefix, optional_extension) {
(None, None) => ORIGINAL_FILE_BASENAME.to_string(),
(None, Some(ext)) => format!("{}{}", hash, ext),
(Some(pre), None) => format!("{}{}", pre, hash),
(Some(pre), Some(ext)) => format!("{}{}{}", pre, hash, ext),
};
let full_object_path = format!("{}/{}", directory.get_directory_path_str(), filename);
Self {
directory,
filename,
full_object_path,
optional_prefix: optional_prefix.map(|p| p.to_string()),
optional_extension: optional_extension.map(|e| e.to_string()),
}
}
pub fn get_full_object_path_str(&self) -> &str {
&self.full_object_path
}
pub fn to_full_object_pathbuf(&self) -> PathBuf {
PathBuf::from(&self.full_object_path)
}
pub fn get_directory(&self) -> &WeightFileBucketDirectory {
&self.directory
}
pub fn get_object_hash(&self) -> &str {
&self.directory.get_object_hash()
}
pub fn get_basename(&self) -> &str {
&self.filename
}
pub fn get_optional_prefix(&self) -> Option<&str> {
self.optional_prefix.as_deref()
}
pub fn get_optional_extension(&self) -> Option<&str> {
self.optional_extension.as_deref()
}
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use crate::public::weight_files::bucket_file_path::WeightFileBucketPath;
mod with_prefix_and_extension {
use super::*;
#[test]
pub fn generate_new_entropy() {
let file = WeightFileBucketPath::generate_new(Some("pre_"), Some(".mp4"));
assert_eq!(file.get_object_hash().len(), 32);
assert_eq!(file.get_object_hash().len(), 32);
assert_eq!(file.get_directory().get_object_hash().len(), 32);
}
#[test]
pub fn get_full_object_path_str() {
let file = WeightFileBucketPath::from_object_hash("abcdefghijk", Some("pre_"), Some(".mp4"));
assert_eq!(file.get_full_object_path_str(), "/weights/a/b/c/d/e/abcdefghijk/pre_abcdefghijk.mp4");
assert_eq!(file.get_basename(), "pre_abcdefghijk.mp4");
}
#[test]
pub fn generate_for_rvc_model() {
let file = WeightFileBucketPath::generate_for_rvc_model();
assert_eq!(file.get_object_hash().len(), 32);
assert_eq!(file.get_directory().get_object_hash().len(), 32);
assert_eq!(file.get_optional_prefix(), Some("rvc_"));
assert_eq!(file.get_optional_extension(), Some(".pt"));
assert!(file.get_basename().starts_with("rvc_"));
assert!(file.get_basename().ends_with(".pt"));
}
#[test]
pub fn generate_for_svc_model() {
let file = WeightFileBucketPath::generate_for_svc_model();
assert_eq!(file.get_object_hash().len(), 32);
assert_eq!(file.get_directory().get_object_hash().len(), 32);
assert_eq!(file.get_optional_prefix(), Some("svc_"));
assert_eq!(file.get_optional_extension(), Some(".pt"));
assert!(file.get_basename().starts_with("svc_"));
assert!(file.get_basename().ends_with(".pt"));
}
#[test]
pub fn svc_model_file_from_object_hash() {
let file = WeightFileBucketPath::svc_model_file_from_object_hash("hashed");
assert_eq!(file.get_full_object_path_str(), "/weights/h/a/s/h/e/hashed/svc_hashed.pt");
assert_eq!(file.get_basename(), "svc_hashed.pt");
}
#[test]
pub fn rvc_model_file_from_object_hash() {
let file = WeightFileBucketPath::rvc_model_file_from_object_hash("hashed");
assert_eq!(file.get_full_object_path_str(), "/weights/h/a/s/h/e/hashed/rvc_hashed.pt");
assert_eq!(file.get_basename(), "rvc_hashed.pt");
}
#[test]
pub fn rvc_index_file_from_object_hash() {
let file = WeightFileBucketPath::rvc_index_file_from_object_hash("hashed");
assert_eq!(file.get_full_object_path_str(), "/weights/h/a/s/h/e/hashed/rvc_hashed.index");
assert_eq!(file.get_basename(), "rvc_hashed.index");
}
}
mod without_prefix_and_extension {
use super::*;
#[test]
pub fn generate_new_entropy() {
let file = WeightFileBucketPath::generate_new(None, None);
assert_eq!(file.get_object_hash().len(), 32);
assert_eq!(file.get_directory().get_object_hash().len(), 32);
}
#[test]
pub fn get_full_object_path_str() {
let file = WeightFileBucketPath::from_object_hash("abcdefghijk", None, None);
assert_eq!(file.get_full_object_path_str(), "/weights/a/b/c/d/e/abcdefghijk/file.bin");
}
#[test]
pub fn to_full_object_pathbuf() {
let file = WeightFileBucketPath::from_object_hash("abcdefghijk", None, None);
assert_eq!(file.to_full_object_pathbuf(), PathBuf::from("/weights/a/b/c/d/e/abcdefghijk/file.bin"));
}
#[test]
pub fn get_full_object_path_str_short_name() {
let file = WeightFileBucketPath::from_object_hash("foo", None, None);
assert_eq!(file.get_full_object_path_str(), "/weights/f/o/foo/file.bin");
}
#[test]
pub fn get_full_object_path_str_starts_with_directory() {
let file = WeightFileBucketPath::from_object_hash("abcdefghijk", None, None);
let full_path = file.get_full_object_path_str();
assert!(full_path.starts_with(file.get_directory().get_directory_path_str()))
}
#[test]
pub fn get_object_hash() {
let hash = "abcdefghijk";
let file = WeightFileBucketPath::from_object_hash(hash, None, None);
assert_eq!(file.get_object_hash(), hash);
}
}
}
@@ -0,0 +1,2 @@
pub mod bucket_directory;
pub mod bucket_file_path;
@@ -26,8 +26,8 @@ pub enum InferenceCategory {
#[serde(rename = "voice_conversion")]
VoiceConversion,
#[serde(rename = "rerender_a_video")]
RerenderAVideo,
#[serde(rename = "video_filter")]
VideoFilter,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -41,7 +41,7 @@ impl InferenceCategory {
Self::LipsyncAnimation => "lipsync_animation",
Self::TextToSpeech => "text_to_speech",
Self::VoiceConversion => "voice_conversion",
Self::RerenderAVideo => "rerender_a_video",
Self::VideoFilter => "video_filter",
}
}
@@ -50,7 +50,7 @@ impl InferenceCategory {
"lipsync_animation" => Ok(Self::LipsyncAnimation),
"text_to_speech" => Ok(Self::TextToSpeech),
"voice_conversion" => Ok(Self::VoiceConversion),
"rerender_a_video" => Ok(Self::RerenderAVideo),
"video_filter" => Ok(Self::VideoFilter),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -62,7 +62,7 @@ impl InferenceCategory {
Self::LipsyncAnimation,
Self::TextToSpeech,
Self::VoiceConversion,
Self::RerenderAVideo,
Self::VideoFilter,
])
}
}
@@ -77,7 +77,7 @@ mod tests {
assert_serialization(InferenceCategory::LipsyncAnimation, "lipsync_animation");
assert_serialization(InferenceCategory::TextToSpeech, "text_to_speech");
assert_serialization(InferenceCategory::VoiceConversion, "voice_conversion");
assert_serialization(InferenceCategory::RerenderAVideo, "rerender_a_video");
assert_serialization(InferenceCategory::VideoFilter, "video_filter");
}
#[test]
@@ -85,7 +85,7 @@ mod tests {
assert_eq!(InferenceCategory::LipsyncAnimation.to_str(), "lipsync_animation");
assert_eq!(InferenceCategory::TextToSpeech.to_str(), "text_to_speech");
assert_eq!(InferenceCategory::VoiceConversion.to_str(), "voice_conversion");
assert_eq!(InferenceCategory::RerenderAVideo.to_str(), "rerender_a_video");
assert_eq!(InferenceCategory::VideoFilter.to_str(), "video_filter");
}
#[test]
@@ -93,7 +93,7 @@ mod tests {
assert_eq!(InferenceCategory::from_str("lipsync_animation").unwrap(), InferenceCategory::LipsyncAnimation);
assert_eq!(InferenceCategory::from_str("text_to_speech").unwrap(), InferenceCategory::TextToSpeech);
assert_eq!(InferenceCategory::from_str("voice_conversion").unwrap(), InferenceCategory::VoiceConversion);
assert_eq!(InferenceCategory::from_str("rerender_a_video").unwrap(), InferenceCategory::RerenderAVideo);
assert_eq!(InferenceCategory::from_str("video_filter").unwrap(), InferenceCategory::VideoFilter);
}
#[test]
@@ -104,7 +104,7 @@ mod tests {
assert_eq!(variants.pop_first(), Some(InferenceCategory::LipsyncAnimation));
assert_eq!(variants.pop_first(), Some(InferenceCategory::TextToSpeech));
assert_eq!(variants.pop_first(), Some(InferenceCategory::VoiceConversion));
assert_eq!(variants.pop_first(), Some(InferenceCategory::RerenderAVideo));
assert_eq!(variants.pop_first(), Some(InferenceCategory::VideoFilter));
assert_eq!(variants.pop_first(), None);
// Generated check
@@ -21,9 +21,9 @@ pub enum IdCategory {
#[serde(rename = "lipsync_animation")]
LipsyncAnimationResult,
// Results from rerender a video
#[serde(rename = "rerender")]
RerenderResult,
// Results from video filters
#[serde(rename = "video_filter")]
VideoFilterResult,
/// Results from tacotron2
/// Applies for RVC and SVC
@@ -66,7 +66,7 @@ impl IdCategory {
Self::ZeroShotVoiceDataset => "zs_dataset",
Self::ZeroShotVoiceEmbedding => "zs_voice",
Self::ZeroShotTtsResult => "zs_tts_result",
Self::RerenderResult => "rerender",
Self::VideoFilterResult => "video_filter",
Self::ModelWeights => "model_weights",
}
}
@@ -80,7 +80,7 @@ impl IdCategory {
"zs_dataset" => Ok(Self::ZeroShotVoiceDataset),
"zs_voice" => Ok(Self::ZeroShotVoiceEmbedding),
"zs_tts_result" => Ok(Self::ZeroShotTtsResult),
"rerender" => Ok(Self::RerenderResult),
"video_filter" => Ok(Self::VideoFilterResult),
"model_weights" => Ok(Self::ModelWeights),
_ => Err(format!("invalid value: {:?}", value)),
}
@@ -92,7 +92,7 @@ impl IdCategory {
BTreeSet::from([
Self::MediaFile,
Self::LipsyncAnimationResult,
Self::RerenderResult,
Self::VideoFilterResult,
Self::TtsResult,
Self::VoiceConversionResult,
Self::ZeroShotTtsResult,
@@ -115,7 +115,7 @@ mod tests {
fn test_serialization() {
assert_serialization(IdCategory::MediaFile, "media_file");
assert_serialization(IdCategory::LipsyncAnimationResult, "lipsync_animation");
assert_serialization(IdCategory::RerenderResult, "rerender");
assert_serialization(IdCategory::VideoFilterResult, "video_filter");
assert_serialization(IdCategory::TtsResult, "tts_result");
assert_serialization(IdCategory::VoiceConversionResult, "voice_conversion");
assert_serialization(IdCategory::ZeroShotVoiceDataset, "zs_dataset");
@@ -128,7 +128,7 @@ mod tests {
fn to_str() {
assert_eq!(IdCategory::MediaFile.to_str(), "media_file");
assert_eq!(IdCategory::LipsyncAnimationResult.to_str(), "lipsync_animation");
assert_eq!(IdCategory::RerenderResult.to_str(), "rerender");
assert_eq!(IdCategory::VideoFilterResult.to_str(), "video_filter");
assert_eq!(IdCategory::TtsResult.to_str(), "tts_result");
assert_eq!(IdCategory::VoiceConversionResult.to_str(), "voice_conversion");
assert_eq!(IdCategory::ZeroShotVoiceDataset.to_str(), "zs_dataset");
@@ -141,7 +141,7 @@ mod tests {
fn from_str() {
assert_eq!(IdCategory::from_str("media_file").unwrap(), IdCategory::MediaFile);
assert_eq!(IdCategory::from_str("lipsync_animation").unwrap(), IdCategory::LipsyncAnimationResult);
assert_eq!(IdCategory::from_str("rerender").unwrap(), IdCategory::RerenderResult);
assert_eq!(IdCategory::from_str("video_filter").unwrap(), IdCategory::VideoFilterResult);
assert_eq!(IdCategory::from_str("tts_result").unwrap(), IdCategory::TtsResult);
assert_eq!(IdCategory::from_str("voice_conversion").unwrap(), IdCategory::VoiceConversionResult);
assert_eq!(IdCategory::from_str("zs_dataset").unwrap(), IdCategory::ZeroShotVoiceDataset);
@@ -157,7 +157,7 @@ mod tests {
assert_eq!(variants.len(), 9);
assert_eq!(variants.pop_first(), Some(IdCategory::MediaFile));
assert_eq!(variants.pop_first(), Some(IdCategory::LipsyncAnimationResult));
assert_eq!(variants.pop_first(), Some(IdCategory::RerenderResult));
assert_eq!(variants.pop_first(), Some(IdCategory::VideoFilterResult));
assert_eq!(variants.pop_first(), Some(IdCategory::TtsResult));
assert_eq!(variants.pop_first(), Some(IdCategory::VoiceConversionResult));
assert_eq!(variants.pop_first(), Some(IdCategory::ZeroShotTtsResult));
@@ -39,9 +39,9 @@ pub enum MediaFileOriginProductCategory {
#[serde(rename = "zs_voice")]
ZeroShotVoice,
// Media files for Rerender
#[serde(rename = "rerender")]
Rerender,
// Media files for video filters
#[serde(rename = "video_filter")]
VideoFilter,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -58,7 +58,7 @@ impl MediaFileOriginProductCategory {
Self::Unknown => "unknown",
Self::VoiceConversion => "voice_conversion",
Self::ZeroShotVoice => "zs_voice",
Self::Rerender => "rerender",
Self::VideoFilter => "video_filter",
}
}
@@ -69,7 +69,7 @@ impl MediaFileOriginProductCategory {
"unknown" => Ok(Self::Unknown),
"voice_conversion" => Ok(Self::VoiceConversion),
"zs_voice" => Ok(Self::ZeroShotVoice),
"rerender" => Ok(Self::Rerender),
"video_filter" => Ok(Self::VideoFilter),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -80,7 +80,7 @@ impl MediaFileOriginProductCategory {
BTreeSet::from([
Self::FaceAnimator,
Self::TextToSpeech,
Self::Rerender,
Self::VideoFilter,
Self::Unknown,
Self::VoiceConversion,
Self::ZeroShotVoice,
@@ -103,7 +103,7 @@ mod tests {
assert_serialization(MediaFileOriginProductCategory::Unknown, "unknown");
assert_serialization(MediaFileOriginProductCategory::VoiceConversion, "voice_conversion");
assert_serialization(MediaFileOriginProductCategory::ZeroShotVoice, "zs_voice");
assert_serialization(MediaFileOriginProductCategory::Rerender, "rerender")
assert_serialization(MediaFileOriginProductCategory::VideoFilter, "video_filter")
}
#[test]
@@ -113,7 +113,7 @@ mod tests {
assert_eq!(MediaFileOriginProductCategory::Unknown.to_str(), "unknown");
assert_eq!(MediaFileOriginProductCategory::VoiceConversion.to_str(), "voice_conversion");
assert_eq!(MediaFileOriginProductCategory::ZeroShotVoice.to_str(), "zs_voice");
assert_eq!(MediaFileOriginProductCategory::Rerender.to_str(), "rerender");
assert_eq!(MediaFileOriginProductCategory::VideoFilter.to_str(), "video_filter");
}
#[test]
@@ -123,7 +123,7 @@ mod tests {
assert_eq!(MediaFileOriginProductCategory::from_str("unknown").unwrap(), MediaFileOriginProductCategory::Unknown);
assert_eq!(MediaFileOriginProductCategory::from_str("voice_conversion").unwrap(), MediaFileOriginProductCategory::VoiceConversion);
assert_eq!(MediaFileOriginProductCategory::from_str("zs_voice").unwrap(), MediaFileOriginProductCategory::ZeroShotVoice);
assert_eq!(MediaFileOriginProductCategory::from_str("rerender").unwrap(), MediaFileOriginProductCategory::Rerender);
assert_eq!(MediaFileOriginProductCategory::from_str("video_filter").unwrap(), MediaFileOriginProductCategory::VideoFilter);
}
#[test]
@@ -135,7 +135,7 @@ mod tests {
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::Unknown));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::VoiceConversion));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::ZeroShotVoice));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::Rerender));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::VideoFilter));
assert_eq!(variants.pop_first(), None);
}
}
@@ -27,11 +27,11 @@ impl DeterministicRng {
}
/// Reset the deterministic RNG's seed.
pub fn reset_rng(&self) {
pub fn reset_rng(&self, state: u64) {
match self.rng.write() {
Err(err) => panic!(format!("test panic due to rng failure {err}")),
Ok(mut lock) => {
*lock = StdRng::seed_from_u64(0);
*lock = StdRng::seed_from_u64(state);
}
}
}
+2 -2
View File
@@ -63,9 +63,9 @@ macro_rules! impl_crockford_generator {
/// Constructor for a new token to be used **DETERMINISTICALLY** in tests and seeding.
/// This will not use a real RNG, so do not use in production code!
/// Once called, it will output the same random numbers in sequence.
pub fn reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously() {
pub fn reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(state: u64) {
let deterministic = crate::deterministic_rng::DeterministicRng::get_instance().expect("tests should not fail due to mutex");
deterministic.reset_rng();
deterministic.reset_rng(state);
}
/// Constructor for a new token to be used **DETERMINISTICALLY** in tests and seeding.
@@ -23,23 +23,18 @@ mod interface {
#[test]
fn generate_for_testing_and_dev_seeding_never_use_in_production_seriously_1() {
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously();
// NB: Using the same reset seed will produce the same results each time
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(0);
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_q8sz47gmfw2zx02snrbz88ns9m16ab");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_ma1xetxrwbh39vg639a9zrq8b9wk6h");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_4tswec8z27wnm01njypx4vmfhgj41e");
}
#[test]
fn generate_for_testing_and_dev_seeding_never_use_in_production_seriously_2() {
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously();
// NB: Same seed -> same tokens generated
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(0);
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_q8sz47gmfw2zx02snrbz88ns9m16ab");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_ma1xetxrwbh39vg639a9zrq8b9wk6h");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_4tswec8z27wnm01njypx4vmfhgj41e");
}
#[test]
fn generate_for_testing_and_dev_seeding_never_use_in_production_seriously_3() {
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously();
// Once more...
MediaFileToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(0);
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_q8sz47gmfw2zx02snrbz88ns9m16ab");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_ma1xetxrwbh39vg639a9zrq8b9wk6h");
assert_eq!(MediaFileToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously().as_str(), "m_4tswec8z27wnm01njypx4vmfhgj41e");
@@ -33,7 +33,7 @@ my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
log = "0.4.14"
clap = "2.34.0" # TODO: This is really out of date, but has conflicts when updated
clap = "4.4.8"
rand = "0.8.5"
# Runtime
# NB: We switched to Tokio from `async-std` for broader ecosystem support.
@@ -0,0 +1,17 @@
use clap::Parser;
use errors::AnyhowResult;
#[derive(Parser, Debug)]
#[command(name="dev-database-seed")]
pub struct CliArgs {
#[arg(name="seed_cloud_bucket", long="bucket", help="Seed the cloud bucket with files", required=false, default_value_t=false)]
pub seed_cloud_bucket: bool,
#[arg(name="seed_elasticsearch", long="elasticsearch", help="Seed the local elasticsearch", required=false, default_value_t=false)]
pub seed_elasticsearch: bool,
}
pub fn parse_cli_args() -> AnyhowResult<CliArgs> {
Ok(CliArgs::parse())
}
@@ -132,7 +132,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
- Gawr Gura MOS 4
"#;
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("Gawr Gura: {}", i);
description = format!("Description Number {} The special edition offers significantly better quality with fewer issues. It's the model as initially envisioned.", i);
description_rendered_html = rvc_markdown_description;
@@ -155,7 +155,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
},
21..=40 =>{
// TTS
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("dragonfruitGTv1: {}", i);
description = format!("Description Number {}:", i);
@@ -187,7 +187,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
},
41..=60 => {
// SD 1.5
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("dragonfruitGTv1: {}", i);
description = format!("Description Number {}:", i);
@@ -232,7 +232,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
"#;
let sdxl_image_token = "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/be706282-2978-42a0-aaa2-73881aad94e9/width=1024/00049-2287632957-1girl,face,curly%20hair,red%20hair,white%20background,.jpeg";
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("SDXL_Niji_Special Edition: {}", i);
description = format!("Description Number {}:", i);
@@ -263,7 +263,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
"#;
let lora_image_token = "https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/123645df-dee2-4239-863a-76a150b09c32/width=1024/00000-2171948503.jpeg";
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("Gawr Gura LoRA: {}", i);
description = format!("Description Number {}:", i);
@@ -295,7 +295,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
- Gawr Gura MOS 4
"#;
model_weight_token = ModelWeightToken(format!("{}", i));
model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
title = format!("Gawr Gura: {}", i);
description = format!("Description Number {} The special edition offers significantly better quality with fewer issues. It's the model as initially envisioned.", i);
description_rendered_html = rvc_markdown_description;
@@ -356,11 +356,13 @@ pub async fn seed_weights_for_user_token(
) -> AnyhowResult<()> {
info!("Seeding weights...");
let model_weight_token1 = ModelWeightToken("11".to_string());
let model_weight_token2 = ModelWeightToken("22".to_string());
let model_weight_token3 = ModelWeightToken("33".to_string());
let model_weight_token4 = ModelWeightToken("44".to_string());
let model_weight_token5 = ModelWeightToken("55".to_string());
ModelWeightToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(54321);
let model_weight_token1 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token2 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token3 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token4 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token5 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weights_args = vec![
CreateModelWeightsArgs {
@@ -503,20 +505,20 @@ pub async fn seed_weights_for_user_token(
pub async fn original_seed_weights(mysql_pool: &Pool<MySql>,user_token: UserToken) -> AnyhowResult<()> {
let model_weight_token1 = ModelWeightToken("1".to_string());
let creator_token1 = UserToken("creatorToken1".to_string());
let model_weight_token1 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let creator_token1 = UserToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token2 = ModelWeightToken("2".to_string());
let creator_token2 = UserToken("creatorToken2".to_string());
let model_weight_token2 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let creator_token2 = UserToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token3 = ModelWeightToken("3".to_string());
let creator_token3 = UserToken("creatorToken3".to_string());
let model_weight_token3 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let creator_token3 = UserToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token4 = ModelWeightToken("4".to_string());
let creator_token4 = UserToken("creatorToken4".to_string());
let model_weight_token4 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let creator_token4 = UserToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token5 = ModelWeightToken("5".to_string());
let creator_token5 = UserToken("creatorToken5".to_string());
let model_weight_token5 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let creator_token5 = UserToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weights_args = vec![
CreateModelWeightsArgs {
@@ -0,0 +1,33 @@
from types import Optional
class FileInfo:
size_in_bytes: int
mime_type: str
file_name: str
class BucketDetails:
bucket_hash: str
maybe_bucket_name: Optional[str]
maybe_bucket_extension: Optional[str]
class MediaFileBucketDirectory:
object_hash: str
directory: str
optional_prefix: Optional[str]
optional_prefix_extension: Optional[str]
original_file_base_name: str
class WeightsType:
directory: float
class FileOperationManager:
def __init__(self, bucket,bucket_info:BucketDetails):
self.bucket = bucket
self.bucket_info = bucket_info
def check_if_file_exists_in_db(self, file_token: str, callback) -> bool:
pass
@@ -5,8 +5,10 @@ use sqlx::{MySql, Pool};
use buckets::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::media_files::media_file_type::MediaFileType;
use enums::common::visibility::Visibility;
use errors::AnyhowResult;
use filesys::file_read_bytes::file_read_bytes;
use filesys::file_size::file_size;
use filesys::path_to_string::path_to_string;
@@ -106,7 +108,7 @@ async fn seed_model(
let mut bucket_hash = "NOT_UPLOADED_BY_SEED_TOOL".to_string();
let mut maybe_bucket_prefix = None;
let mut maybe_bucket_extension = None;
if media_file_exists(mysql_pool, media_file_token).await? {
info!("Media file already seeded: {:?}", media_file_token);
return Ok(())
@@ -181,16 +183,16 @@ async fn seed_file_to_bucket(
.extension()
.map(|extension| extension.to_str())
.flatten();
// get the new bucket path ...
let bucket_location = MediaFileBucketPath::generate_new(maybe_bucket_prefix, maybe_bucket_extension);
let bucket_path = path_to_string(bucket_location.to_full_object_pathbuf());
info!("Reading media file: {:?}", media_file_path);
// get meta data
let bytes = file_read_bytes(media_file_path)?;
let mimetype = get_mimetype_for_bytes(&bytes).unwrap_or("application/octet-stream");
info!("Uploading media file to bucket path: {:?}", bucket_path);
let _r = bucket_clients.public.upload_file_with_content_type(
@@ -1,42 +1,40 @@
use std::path::Path;
use log::{ info, warn };
use sqlx::{ MySql, Pool };
use buckets::{ public::{ media_files::bucket_file_path::MediaFileBucketPath, self }, private };
use log::info;
use rand::Rng;
use sqlx::{MySql, Pool};
use buckets::public::weight_files::bucket_file_path::WeightFileBucketPath;
use enums::{
by_table::model_weights::{weights_category::WeightsCategory, weights_types::WeightsType},
common::visibility::Visibility,
};
use errors::{anyhow, AnyhowResult};
use filesys::file_read_bytes::file_read_bytes;
use filesys::file_size::file_size;
use filesys::path_to_string::path_to_string;
use hashing::sha256::sha256_hash_file::sha256_hash_file;
use mimetypes::mimetype_for_bytes::get_mimetype_for_bytes;
use mimetypes::mimetype_for_file::get_mimetype_for_file;
use storyteller_root::get_seed_tool_data_root;
use tokens::tokens::users::UserToken;
use crate::bucket_clients::BucketClients;
use crate::seeding::users::HANASHI_USER_TOKEN;
use enums::{
by_table::model_weights::{ weights_category::WeightsCategory, weights_types::WeightsType },
common::visibility::Visibility,
};
use rand::Rng;
use errors::{ anyhow, AnyhowResult };
use mysql_queries::queries::model_weights::create_weight::{
create_weight,
CreateModelWeightsArgs,
self,
};
use storyteller_root::get_seed_tool_data_root;
use tokens::tokens::model_weights::ModelWeightToken;
use tokens::tokens::users::UserToken;
use crate::bucket_clients::BucketClients;
use crate::seeding::users::HANASHI_USER_TOKEN;
use std::result::Result::Ok;
pub async fn seed_weights_files(
mysql_pool: &Pool<MySql>,
maybe_bucket_clients: Option<&BucketClients>
) -> AnyhowResult<()> {
info!("Seeding weights files...");
// NB: Stable token generation.
ModelWeightToken::reset_rng_for_testing_and_dev_seeding_never_use_in_production_seriously(123);
let seeded_weights = [
(
HANASHI_USER_TOKEN,
@@ -87,9 +85,8 @@ pub async fn seed_weights_files(
let mut rng = rand::thread_rng();
let n: u32 = rng.gen();
let model_weight_token = ModelWeightToken(format!("{}", n)); // random token
let model_weight_token = model_weight_token;
let model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let title = model_name;
let description = "This is a description";
let description_rendered_html = "This is a description rendered html";
@@ -97,9 +94,9 @@ pub async fn seed_weights_files(
let original_download_url = "https://example.com/model.safetensors";
let thumbnail_token = format!("{}", n);
let public_bucket_hash: String = weights_file_token.to_string();
let public_bucket_prefix = weights_type.to_str();
let public_bucket_extension = weights_category.to_str();
// let public_bucket_hash: String = weights_file_token.to_string();
// let public_bucket_prefix = weights_type.to_string();
// let public_bucket_extension = weights_category.to_string();
let cached_user_ratings_total_count = n.clone();
let cached_user_ratings_positive_count = n.clone();
@@ -114,7 +111,7 @@ pub async fn seed_weights_files(
let file_size_bytes = file_size(weight_file_path.clone())?;
let sha256_checksum = sha256_hash_file(weight_file_path.clone())?;
let result = seed_model(
let bucket_details = seed_model(
&mysql_pool,
&model_weight_token,
&user_token,
@@ -122,11 +119,16 @@ pub async fn seed_weights_files(
&weight_file_path,
maybe_bucket_clients
).await;
let bucket_details_data = bucket_details.unwrap();
let bucket_hash = bucket_details_data.bucket_hash;
let maybe_bucket_prefix = bucket_details_data.maybe_bucket_prefix.as_deref().unwrap();
let maybe_bucket_extension = bucket_details_data.maybe_bucket_extension.as_deref().unwrap();
let create_model_weights_args = CreateModelWeightsArgs {
token: &model_weight_token,
weights_type: weights_type, // Assuming weights_type is defined elsewhere
weights_category: weights_category, // Assuming weights_category is defined elsewhere
weights_type, // Assuming weights_type is defined elsewhere
weights_category, // Assuming weights_category is defined elsewhere
title: title.to_string(),
maybe_thumbnail_token: Some(thumbnail_token),
description_markdown: description.to_string(),
@@ -139,37 +141,28 @@ pub async fn seed_weights_files(
original_filename: Some(original_filename.to_string()),
file_size_bytes: file_size_bytes as i32, // Assuming the file size is 0
file_checksum_sha2: sha256_checksum.to_string(), // Assuming the file checksum is an empty string
private_bucket_hash: public_bucket_hash,
maybe_private_bucket_prefix: Some(public_bucket_prefix.to_string()),
maybe_private_bucket_extension: Some(public_bucket_extension.to_string()),
cached_user_ratings_total_count: cached_user_ratings_total_count,
cached_user_ratings_positive_count: cached_user_ratings_positive_count,
cached_user_ratings_negative_count: cached_user_ratings_negative_count,
private_bucket_hash: bucket_hash,
maybe_private_bucket_prefix: Some(maybe_bucket_prefix.to_string()),
maybe_private_bucket_extension: Some(maybe_bucket_extension.to_string()),
cached_user_ratings_total_count,
cached_user_ratings_positive_count,
cached_user_ratings_negative_count,
maybe_cached_user_ratings_ratio: Some(cached_user_ratings_ratio),
version: version,
version,
mysql_pool: &mysql_pool, // Assuming mysql_pool is defined elsewhere
};
create_weight(create_model_weights_args).await?;
match result {
Ok(_) => info!("Seeded {:?}", weight_file_path),
Err(err) =>
warn!(
r#"
Could not seed media file {} , {:?} : {:?}
(No worries: if there's a duplicate key error, we probably already
seeded the media file on a previous invocation!)
"#,
model_weight_token,
subdirectory_path,
err
),
}
info!("Seeded {:?}", weight_file_path)
}
Ok(())
}
#[derive(Clone)]
struct BucketDetails {
bucket_hash: String,
maybe_bucket_prefix: Option<String>,
@@ -183,37 +176,33 @@ async fn seed_model(
weight_type: WeightsType,
weight_file_path: &Path,
maybe_bucket_clients: Option<&BucketClients>
) -> AnyhowResult<()> {
) -> AnyhowResult<BucketDetails> {
info!("Seeding Media file {:?} ...", weight_file_path);
// mutable variables
let mut bucket_hash = "NOT_UPLOADED_BY_SEED_TOOL".to_string();
let mut maybe_bucket_prefix = "";
let mut maybe_bucket_extension = "";
if let Some(bucket_clients) = maybe_bucket_clients {
let bucket_details = seed_file_to_bucket(weight_file_path, bucket_clients).await?;
bucket_hash = bucket_details.bucket_hash;
maybe_bucket_prefix = bucket_details.maybe_bucket_prefix.as_deref().unwrap();
maybe_bucket_extension = bucket_details.maybe_bucket_extension.as_deref().unwrap();
let bucket_details = seed_file_to_bucket(weight_file_path, bucket_clients,weight_type).await?;
return Ok(bucket_details);
}
Ok(())
Err(anyhow!("No bucket clients provided!"))
}
async fn seed_file_to_bucket(
weight_file_path: &Path,
bucket_clients: &BucketClients
bucket_clients: &BucketClients,
weight_type: WeightsType,
) -> AnyhowResult<BucketDetails> {
info!("Uploading weights file {:?} ...", weight_file_path);
let maybe_bucket_prefix = Some("fakeyou_");
let maybe_bucket_prefix = Some(format!("{}_",weight_type.to_str()));
let maybe_bucket_prefix = maybe_bucket_prefix.as_deref();
let maybe_bucket_extension = weight_file_path
.extension()
.map(|extension| extension.to_str())
.flatten();
// we should just have this be file bucket path and then we can use a file descriptor to turn it into a specific type of path
let bucket_location = MediaFileBucketPath::generate_new(
let bucket_location: WeightFileBucketPath = WeightFileBucketPath::generate_new(
maybe_bucket_prefix,
maybe_bucket_extension
);
@@ -225,7 +214,7 @@ async fn seed_file_to_bucket(
let bytes = file_read_bytes(weight_file_path)?;
let mimetype = get_mimetype_for_bytes(&bytes).unwrap_or("application/octet-stream");
info!("Uploading weights file to bucket path: {:?}", bucket_path);
info!("Copy this line here! Uploading weights file to bucket path: {:?}", bucket_path);
let _r = bucket_clients.public.upload_file_with_content_type(
&bucket_path,
@@ -44,6 +44,7 @@ async fn create_rvc_model(
insert_voice_conversion_model_from_download_job(InsertVoiceConversionModelArgs {
model_type: VoiceConversionModelType::RvcV2,
maybe_new_weights_token: None,
title,
original_download_url: "https://example.com",
original_filename: "unknown.zip",
@@ -29,7 +29,7 @@ tokens = { path = "../../_types/tokens" }
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
clap = "2.34.0" # TODO: This is really out of date, but has conflicts when updated
clap = "4.4.8"
log = "0.4.14"
# Runtime
@@ -0,0 +1,24 @@
use std::path::PathBuf;
use clap::Parser;
use errors::AnyhowResult;
#[derive(Parser, Debug)]
#[command(name="dev-upload-media-file")]
pub struct RawArgs {
#[arg(name="file", short='f', long="file", help="File to upload", required=true)]
pub file_path: String,
}
pub struct CliArgs {
pub file_path: PathBuf,
}
pub fn parse_cli_args() -> AnyhowResult<CliArgs> {
let args = RawArgs::parse();
Ok(CliArgs {
file_path: PathBuf::from(args.file_path),
})
}
@@ -1,28 +0,0 @@
use clap::{App, Arg};
use errors::AnyhowResult;
pub struct CliArgs {
pub seed_cloud_bucket: bool,
pub seed_elasticsearch: bool,
}
pub fn parse_cli_args() -> AnyhowResult<CliArgs> {
let matches = App::new("dev-database-seed")
.arg(Arg::with_name("seed_cloud_bucket")
.long("bucket")
.help("Seed the cloud bucket with files")
.takes_value(false)
.required(false))
.arg(Arg::with_name("seed_elasticsearch")
.long("elasticsearch")
.help("Seed the local elasticsearch")
.takes_value(false)
.required(false))
.get_matches();
Ok(CliArgs {
seed_cloud_bucket: matches.is_present("seed_cloud_bucket"),
seed_elasticsearch: matches.is_present("seed_elasticsearch"),
})
}
@@ -1,27 +0,0 @@
use std::path::PathBuf;
use clap::{App, Arg};
use errors::{anyhow, AnyhowResult};
pub struct CliArgs {
pub file_path: PathBuf,
}
pub fn parse_cli_args() -> AnyhowResult<CliArgs> {
let matches = App::new("dev_upload_media")
.arg(Arg::with_name("file")
.short("f")
.long("file")
.value_name("FILE")
.help("File to upload")
.takes_value(true)
.required(true))
.get_matches();
let file_path = matches.value_of("file")
.map(|val| val.trim().to_string())
.ok_or(anyhow!("no file path supplied"))?;
Ok(CliArgs {
file_path: PathBuf::from(file_path),
})
}
+1 -1
View File
@@ -29,7 +29,7 @@ my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
log = "0.4.14"
clap = "2.34.0" # TODO: This is really out of date, but has conflicts when updated
clap = "4.4.8"
strum = { version = "0.25", features = ["derive"] }
# Runtime
+24 -39
View File
@@ -1,12 +1,12 @@
use std::str::FromStr;
use clap::{App, Arg, ArgMatches};
use clap::Parser;
use strum::{EnumCount, EnumString, IntoEnumIterator};
use strum::EnumIter;
use errors::{anyhow, AnyhowResult, bail};
pub struct CliArgs {
pub struct ParsedArgs {
pub mysql_environment: Environment,
pub elasticsearch_environment: Environment,
pub action: Action,
@@ -25,53 +25,38 @@ pub enum Action {
SearchTts,
}
pub fn parse_cli_args() -> AnyhowResult<CliArgs> {
let matches = App::new("dev-database-seed")
.arg(Arg::with_name("action")
.long("action")
.help("action to take")
.takes_value(true)
.required(true))
.arg(Arg::with_name("mysql")
.long("mysql")
.help("Production or development")
.takes_value(true)
.required(false))
.arg(Arg::with_name("elasticsearch")
.long("elasticsearch")
.help("Production or development")
.takes_value(true)
.required(false))
.get_matches();
#[derive(Parser, Debug)]
#[command(name="elasticsearch-cli")]
pub struct Args {
#[arg(name="action", long="action", help="action to take", required=true)]
action: String,
Ok(CliArgs {
mysql_environment: to_environment(&matches, "mysql")?,
elasticsearch_environment: to_environment(&matches, "elasticsearch")?,
action: get_action(&matches)?,
#[arg(name="mysql", long="mysql", help="production or development")]
mysql: Option<String>,
#[arg(name="elasticsearch", long="elasticsearch", help="production or development")]
elasticsearch: Option<String>,
}
pub fn parse_cli_args() -> AnyhowResult<ParsedArgs> {
let args = Args::parse();
Ok(ParsedArgs {
mysql_environment: to_environment(args.mysql.as_deref())?,
elasticsearch_environment: to_environment(args.elasticsearch.as_deref())?,
action: action_from_str(&args.action)?,
})
}
fn to_environment(matches: &ArgMatches, key: &str) -> AnyhowResult<Environment> {
let value = matches.value_of(key)
.map(|s| s.to_lowercase());
Ok(match value.as_deref() {
fn to_environment(environment: Option<&str>) -> AnyhowResult<Environment> {
Ok(match environment {
None => Environment::Development,
Some("dev") | Some("development") => Environment::Development,
Some("prod") | Some("production") => Environment::Production,
_ => bail!("invalid environment: {:?}", value),
_ => bail!("invalid environment: {:?}", environment),
})
}
fn get_action(matches: &ArgMatches) -> AnyhowResult<Action> {
let action = matches.value_of("action")
.map(|s| action_from_str(s))
.transpose()?
.ok_or(anyhow!("no action provided"))?;
Ok(action)
}
fn action_from_str(value: &str) -> AnyhowResult<Action> {
let action = Action::from_str(value)
.map_err(|err| {
+1 -1
View File
@@ -21,7 +21,7 @@ logging = { path = "../../lib/logging" }
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
clap = { version = "4.4.7", features = ["derive"] }
clap = { version = "4.4.8", features = ["derive"] }
walkdir = "2.4.0"
[dev-dependencies]
+47
View File
@@ -0,0 +1,47 @@
[package]
name = "migration-tool"
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
publish = false
[[bin]]
name = "migration-tool"
path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../_types/buckets" }
cloud_storage = { path = "../../lib/api_clients/cloud_storage" }
config = { path = "../../lib/deprecated/config" }
easyenv = { path = "../../lib/easyenv" }
enums = { path = "../../_types/enums" }
errors = { path = "../../lib/errors" }
hashing = { path = "../../lib/files/hashing" }
mysql_queries = { path = "../../lib/mysql_queries" }
storyteller_root = { path = "../../lib/storyteller_root" }
tokens = { path = "../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
clap = "4.4.8"
log = "0.4.14"
strum = { version = "0.25", features = ["derive"] }
tempdir = "0.3.7"
# Async + clients
tokio = { version = "1.34.0", features = ["macros"] }
sqlx = { version = "0.7.2", features = [ "mysql", "runtime-tokio", "tls-rustls", "chrono" ] }
# Serialization
serde = "1.0.125"
serde_derive = "1.0.125"
serde_json = "1.0.108"
[dev-dependencies]
# None yet
+13
View File
@@ -0,0 +1,13 @@
use sqlx::{MySql, Pool};
use cloud_storage::bucket_client::BucketClient;
pub struct Deps {
pub mysql_development : Pool<MySql>,
pub mysql_production : Pool<MySql>,
pub bucket_development_public: BucketClient,
pub bucket_development_private: BucketClient,
pub bucket_production_public: BucketClient,
pub bucket_production_private: BucketClient,
}
+80
View File
@@ -0,0 +1,80 @@
//! migration-tool
//!
//! Migrate database records.
//!
use std::time::Duration;
use log::info;
use sqlx::{MySql, Pool};
use sqlx::mysql::MySqlPoolOptions;
use cloud_storage::bucket_client::BucketClient;
use config::shared_constants::DEFAULT_RUST_LOG;
use errors::AnyhowResult;
use crate::deps::Deps;
use crate::migrations::voice_conversion_to_weights::migrate::migrate_voice_conversion_to_weights;
pub mod deps;
pub mod migrations;
#[tokio::main]
pub async fn main() -> AnyhowResult<()> {
println!("migration-tool: migrate database records");
easyenv::init_all_with_default_logging(Some(DEFAULT_RUST_LOG));
// NB: This secrets file differs from the rest because we might actually want to cross
// development/production boundaries for migration. We don't want to pull in secrets
// from other sources. (Hopefully this isn't getting out of hand at this point.)
easyenv::from_filename(".env-migration-tool-secrets")?;
let deps = Deps {
mysql_development: get_mysql("MYSQL_DEVELOPMENT_URL").await?,
mysql_production: get_mysql("MYSQL_PRODUCTION_URL").await?,
bucket_development_public: get_bucket_client("DEVELOPMENT_PUBLIC")?,
bucket_development_private: get_bucket_client("DEVELOPMENT_PRIVATE")?,
bucket_production_public: get_bucket_client("PRODUCTION_PUBLIC")?,
bucket_production_private: get_bucket_client("PRODUCTION_PRIVATE")?,
};
migrate_voice_conversion_to_weights(&deps).await?;
Ok(())
}
async fn get_mysql(env_var_name: &str) -> AnyhowResult<Pool<MySql>> {
info!("Connecting to MySQL {env_var_name}...");
let pool = MySqlPoolOptions::new()
.max_connections(easyenv::get_env_num("MYSQL_MAX_CONNECTIONS", 3)?)
.connect(&easyenv::get_env_string_required(env_var_name)?)
.await?;
Ok(pool)
}
pub fn get_bucket_client(env_var_suffix: &str) -> AnyhowResult<BucketClient> {
let env_var_suffix = env_var_suffix.to_uppercase();
let access_key = easyenv::get_env_string_required(&format!("ACCESS_KEY_{env_var_suffix}"))?;
let secret_key = easyenv::get_env_string_required(&format!("SECRET_KEY_{env_var_suffix}"))?;
let region_name = easyenv::get_env_string_required(&format!("REGION_NAME_{env_var_suffix}"))?;
let bucket_name = easyenv::get_env_string_required(&format!("BUCKET_NAME_{env_var_suffix}"))?;
// NB: Long timeout for dev rust builds to upload to cloud buckets.
// Unoptimized binaries sometimes take a lot of time to upload, presumably due to unoptimized code.
let bucket_timeout = easyenv::get_env_duration_seconds_or_default(
"BUCKET_TIMEOUT_SECONDS", Duration::from_secs(60 * 10));
info!("Configuring GCS bucket {env_var_suffix} ...");
Ok(BucketClient::create(
&access_key,
&secret_key,
&region_name,
&bucket_name,
None,
Some(bucket_timeout),
)?)
}
@@ -0,0 +1 @@
pub mod voice_conversion_to_weights;
@@ -0,0 +1,77 @@
use tempdir::TempDir;
use buckets::public::weight_files::bucket_file_path::WeightFileBucketPath;
use cloud_storage::bucket_path_unifier::BucketPathUnifier;
use enums::by_table::voice_conversion_models::voice_conversion_model_type::VoiceConversionModelType;
use errors::{anyhow, AnyhowResult};
use hashing::sha256::sha256_hash_file::sha256_hash_file;
use mysql_queries::queries::model_weights::migration::upsert_model_weight_from_voice_conversion_model::CopiedFileData;
use mysql_queries::queries::voice_conversion::migration::list_whole_voice_conversion_models_using_cursor::WholeVoiceConversionModelRecord;
use crate::deps::Deps;
pub async fn copy_cloud_files(model: &WholeVoiceConversionModelRecord, deps: &Deps) -> AnyhowResult<CopiedFileData> {
let copied_file_data = copy_model(model, deps).await?;
if model.has_index_file {
copy_index_file(model, deps, &copied_file_data.bucket_path).await?;
}
Ok(copied_file_data)
}
async fn copy_model(model: &WholeVoiceConversionModelRecord, deps: &Deps) -> AnyhowResult<CopiedFileData> {
let bucket_path_unifier = BucketPathUnifier::default_paths();
let old_model_bucket_path = match model.model_type {
VoiceConversionModelType::RvcV2 => bucket_path_unifier.rvc_v2_model_path(&model.private_bucket_hash),
VoiceConversionModelType::SoVitsSvc => bucket_path_unifier.so_vits_svc_model_path(&model.private_bucket_hash),
VoiceConversionModelType::SoftVc => return Err(anyhow!("we never built softvc models")),
};
// TODO(bt,2023-12-19): Probably faster to stream between buckets, but whatever.
let temp_dir = TempDir::new("model_transfer")?;
let model_temp_fs_path = temp_dir.path().join("model.bin");
deps.bucket_production_private.download_file_to_disk(&old_model_bucket_path, &model_temp_fs_path).await?;
let file_checksum = sha256_hash_file(&model_temp_fs_path)?;
let new_model_bucket_path = match model.model_type {
VoiceConversionModelType::RvcV2 => WeightFileBucketPath::generate_for_rvc_model(),
VoiceConversionModelType::SoVitsSvc => WeightFileBucketPath::generate_for_svc_model(),
VoiceConversionModelType::SoftVc => return Err(anyhow!("we never built softvc models")),
};
deps.bucket_development_public.upload_filename_with_content_type(
&new_model_bucket_path.get_full_object_path_str(),
&model_temp_fs_path,
"application/octet-stream").await?;
Ok(CopiedFileData {
bucket_path: new_model_bucket_path,
file_sha_hash: file_checksum,
})
}
async fn copy_index_file(model: &WholeVoiceConversionModelRecord, deps: &Deps, bucket_path: &WeightFileBucketPath) -> AnyhowResult<()> {
let bucket_path_unifier = BucketPathUnifier::default_paths();
let old_model_index_bucket_path = bucket_path_unifier.rvc_v2_model_index_path(&model.private_bucket_hash);
// TODO(bt,2023-12-19): Probably faster to stream between buckets, but whatever.
let temp_dir = TempDir::new("model_transfer")?;
let model_temp_fs_path = temp_dir.path().join("model.bin");
deps.bucket_production_private.download_file_to_disk(&old_model_index_bucket_path, &model_temp_fs_path).await?;
let new_model_bucket_path =
WeightFileBucketPath::rvc_index_file_from_object_hash(bucket_path.get_object_hash());
deps.bucket_development_public.upload_filename_with_content_type(
&new_model_bucket_path.get_full_object_path_str(),
&model_temp_fs_path,
"application/octet-stream").await?;
Ok(()) // NB: We don't care about the path of the index file.
}

Some files were not shown because too many files have changed in this diff Show More