Media metadata extraction & Thumbnailer rework (#2285)
* initial ffprobe commit
* Working slim down version ffprobe
* Auto format ffprobe and deps source
* Remove show_pixel_formats logic
- Fix do_bitexact incorrect check in main after last changes
- Fix some clangd warning
* Remove show_* and print_format options and their respective logic
* Rework ffprobe into simple_ffprobe
- Simplify ffprobe logic into a simple program that gather and print a media file metadata
* Reduce the amount of ffmpeg log messages while generating thumbnails
* Fix completly wrong comments
* mend
* Start modeling ffmpeg extracted metadata on schema
- Start porting ffprobe code to rust
- Rename some references to media_data to exif_data
* Finish modeling media info data
- Add MediaProgram, MediaStream, MediaCodec, MediaVideoProps, MediaAudioProps, MediaSubtitleProps to Schema
- Fix simple_ffproble to use its custom print_codec, instead of ffmpeg's impl
* Add relation between MediaInfo and FilePath
- Remove shared properties from MediaInfo and related structs
- Implement Iterator for FFmpegDict
* Fix and update schema
* Data models and start populating MediaInfo in rust
* Finish populating media info, chapters and program
* Improve FFmpegFormatContext data raw pointer access
- Implement stream data gathering
* Impl FFmpegCodecContext, retrieve codec information
- Improve some unsafe pointer uses
- Impl from FFmpegFormatContext to MediaInfo conversion
* Fix FFmpegDict Drop
* Fix some crago warnings
* Impl retrieval of video props
- Fix C char* to Rust String convertion
* Impl retrieval of audio and subtitle props
- Fill props for MediaCodec
* Remove simple_ffprobe now that the Rust impl is done
* Fix schema to match actually retrieved media info
- Fix import some FFmpeg constants instead of directly using values
* Rework movie_decoder
- Re-implement create_scale_string and add support anamorphic video
- Improve C pointer access for FFmpegFormatContext and FFmpegCodecContext
- Use newer FFmpeg abstractions in movie_decoder
* Fix incorrect props when initializing MovieDecoder
* Remove unecessary lifetimes
* Added more native wrappers for some FFmpeg native objects used in movie_decoder
* Remove FFmpegPacket
- Some more improvements to movie_decoder
* WIP
* Some small fixes
* More fixes
Rename movie_decoder to frame_decoder
Remove more references to film_strips
* fmt
* Fix duplicate migration for job error changes
* fix rebase
* Solving segfaults, fuck C lang
Co-authored-by: Vítor Vasconcellos <HeavenVolkoff@users.noreply.github.com>
* Update rust to version 1.77
- Pin rust version with rust-toolchain.toml
- Change from dtolnay/rust-toolchain to IronCoreLabs/rust-toolchain for rust-toolchain support
- Remove unused function and imports
- Replace most CString uses with new c literal string
* More segfault solving and other minor fixes
Co-authored-by: Vítor Vasconcellos <HeavenVolkoff@users.noreply.github.com>
* Fix ffmpeg rotation filter breaking portrait video thumbnails #2150
- Plus some other misc fixes
* Auto format
* Retrieve video/audio metadata on frontend
* Auto format
* First draft on ffmpeg data save on db
Co-authored-by: Vítor Vasconcellos <HeavenVolkoff@users.noreply.github.com>
* Fix some incorrect changes to prisma schema
* Some fixes for the FFmpegData schema
- Expand logic to save FFmpegData to db
* A ton of things
Co-authored-by: Vítor Vasconcellos <HeavenVolkoff@users.noreply.github.com>
* Integrating ffmpeg media data in jobs and API
* Rspc can't BigInt
* 🙄
* Add initial ffmpeg metadata entries to Inspector
- Fix ephemeral metadata api to match the files metadata api call
* Fix Inspector not showing ffmpeg metadata
* Add bitrate, start time and chapters video metadata to Inspector
- Fix backend BigInt conversion incorrectly using i32 instead of u32
- Change FFmpegFormatContext/FFmpegMetaData bit_rate to i64
- Rename byteSize to humanizeSize
- Expand humanizeSize logic to allow handling bits and Binary units
- Move capitalize to @sd/client utils
* Solving some issues
* Fix ffmpeg probe getting incorrect stream id and breaking database unique constraint
- Fix humanizeSize breaking when receiving floating numbers
- Fix incorrect equality in StatCard
- Fix unhandled error in Dialog when trying to remove an unknown dialog
* fmt
* small improvements
- Remove some unecessary recursion_limit directive
- Remove unused app_image releated functions
- Fix metadata query enabled flag
* Add migration for ffmpeg media data
* Fix cypress test
* Requested changes
* Implement feedback
- Update locale keys for all languages
- Add pnpm command to update all language keys
* Fix thumb reactivity in non indexed locations
---------
Co-authored-by: Ericson Soares <ericson.ds999@gmail.com>
Co-authored-by: Vítor Vasconcellos <HeavenVolkoff@users.noreply.github.com>
2024-05-09 02:20:28 +00:00
|
|
|
import { capitalize } from '@sd/client';
|
2023-09-11 15:26:44 +00:00
|
|
|
import { keySymbols, ModifierKeys, modifierSymbols } from '@sd/ui';
|
|
|
|
|
2023-06-22 07:03:17 +00:00
|
|
|
import { OperatingSystem } from '../util/Platform';
|
|
|
|
|
|
|
|
export function keybind<T extends string>(
|
|
|
|
modifers: ModifierKeys[],
|
|
|
|
keys: T[],
|
|
|
|
tauriOs: OperatingSystem
|
|
|
|
) {
|
|
|
|
if (keys.length === 0) return '';
|
|
|
|
|
|
|
|
const os = tauriOs === 'macOS' ? 'macOS' : tauriOs === 'windows' ? 'Windows' : 'Other';
|
|
|
|
|
|
|
|
const keySymbol = keys.map(capitalize).map((key) => {
|
|
|
|
const symbol = keySymbols[key];
|
|
|
|
return symbol ? symbol[os] ?? symbol.Other : key;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (os === 'macOS' && !modifers.includes(ModifierKeys.Meta)) {
|
|
|
|
const index = modifers.findIndex((modifier) => modifier === ModifierKeys.Control);
|
|
|
|
if (index !== -1) modifers[index] = ModifierKeys.Meta;
|
|
|
|
}
|
|
|
|
|
|
|
|
const modifierSymbol = modifers.map((modifier) => {
|
|
|
|
const symbol = modifierSymbols[modifier];
|
|
|
|
return symbol[os] ?? symbol.Other;
|
|
|
|
});
|
|
|
|
|
2023-10-13 14:41:18 +00:00
|
|
|
const value = [...modifierSymbol, ...keySymbol].join(os === 'macOS' ? '' : '+');
|
|
|
|
|
|
|
|
//we don't want modifer symbols and key symbols to be duplicated if they are the same value
|
|
|
|
const noDuplicates = [...new Set(value.split('+'))].join('+');
|
|
|
|
|
|
|
|
return noDuplicates;
|
2023-06-22 07:03:17 +00:00
|
|
|
}
|
|
|
|
|
2023-10-14 04:27:09 +00:00
|
|
|
// Required to export keybind without importing @sd/ui
|
|
|
|
export type { ModifierKeys } from '@sd/ui';
|
|
|
|
|
2023-06-22 23:41:29 +00:00
|
|
|
export function keybindForOs(
|
|
|
|
os: OperatingSystem
|
|
|
|
): (modifers: ModifierKeys[], keys: string[]) => string {
|
2023-06-22 07:03:17 +00:00
|
|
|
return (modifers: ModifierKeys[], keys: string[]) => keybind(modifers, keys, os);
|
|
|
|
}
|