mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-10 00:48:37 -06:00
Compare commits
12 Commits
234fc8090b
...
9a9ce814fd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a9ce814fd | ||
|
|
28f4c64d30 | ||
|
|
579cfeb55f | ||
|
|
ee71c0d39c | ||
|
|
f889de8068 | ||
|
|
0542063e30 | ||
|
|
20b5c322ad | ||
|
|
37f2fed2d9 | ||
|
|
1ff1642052 | ||
|
|
613aa49532 | ||
|
|
04657469b0 | ||
|
|
000ee911e5 |
495
.idea/workspace.xml
generated
495
.idea/workspace.xml
generated
@ -4,12 +4,27 @@
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="chore: translate userTypes">
|
||||
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/pages/tools/number/generic-calc/data/temperature.ts - package.json - .idea/workspace.xml">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/index.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-number-generator/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-number-generator/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/meta.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/trim/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/trim/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/compress/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/compress/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/crop-video/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/crop-video/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/flip/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/flip/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/loop/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/loop/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/merge-video/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/merge-video/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/rotate/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/rotate/service.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/index.tsx" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@ -43,230 +58,313 @@
|
||||
<option name="PUSH_AUTO_UPDATE" value="true" />
|
||||
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||
<map>
|
||||
<entry key="$PROJECT_DIR$" value="fork/AshAnand34/tool/random-generators" />
|
||||
<entry key="$PROJECT_DIR$" value="fork/ssagar1999/feature/244" />
|
||||
</map>
|
||||
</option>
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
<option name="RESET_MODE" value="HARD" />
|
||||
</component>
|
||||
<component name="GitHubPullRequestSearchHistory">{
|
||||
"history": [
|
||||
<component name="GitHubPullRequestSearchHistory"><![CDATA[{
|
||||
"history": [
|
||||
{
|
||||
"assignee": "iib0011"
|
||||
"assignee": "iib0011"
|
||||
},
|
||||
{
|
||||
"state": "OPEN"
|
||||
"searchQuery": "filter",
|
||||
"state": "OPEN"
|
||||
},
|
||||
{
|
||||
"searchQuery": "filter",
|
||||
"state": "OPEN"
|
||||
"state": "OPEN"
|
||||
}
|
||||
],
|
||||
"lastFilter": {
|
||||
"searchQuery": "filter",
|
||||
"state": "OPEN"
|
||||
"lastFilter": {
|
||||
"state": "OPEN"
|
||||
}
|
||||
}</component>
|
||||
<component name="GitHubPullRequestState">{
|
||||
"prStates": [
|
||||
}]]></component>
|
||||
<component name="GitHubPullRequestState"><![CDATA[{
|
||||
"prStates": [
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts51PkS9",
|
||||
"number": 22
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts51PkS9",
|
||||
"number": 22
|
||||
},
|
||||
"lastSeen": 1741207144695
|
||||
"lastSeen": 1741207144695
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6NiNYl",
|
||||
"number": 32
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6NiNYl",
|
||||
"number": 32
|
||||
},
|
||||
"lastSeen": 1741209723869
|
||||
"lastSeen": 1741209723869
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Nheyd",
|
||||
"number": 31
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Nheyd",
|
||||
"number": 31
|
||||
},
|
||||
"lastSeen": 1741213371410
|
||||
"lastSeen": 1741213371410
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6NmRBs",
|
||||
"number": 33
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6NmRBs",
|
||||
"number": 33
|
||||
},
|
||||
"lastSeen": 1741282429036
|
||||
"lastSeen": 1741282429036
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts5zyFTs",
|
||||
"number": 15
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts5zyFTs",
|
||||
"number": 15
|
||||
},
|
||||
"lastSeen": 1741535540953
|
||||
"lastSeen": 1741535540953
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QQB3c",
|
||||
"number": 59
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QQB3c",
|
||||
"number": 59
|
||||
},
|
||||
"lastSeen": 1743018960900
|
||||
"lastSeen": 1743018960900
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QMPEg",
|
||||
"number": 58
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QMPEg",
|
||||
"number": 58
|
||||
},
|
||||
"lastSeen": 1743019452983
|
||||
"lastSeen": 1743019452983
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QZvRI",
|
||||
"number": 61
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QZvRI",
|
||||
"number": 61
|
||||
},
|
||||
"lastSeen": 1743103196866
|
||||
"lastSeen": 1743103196866
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QqPrQ",
|
||||
"number": 73
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QqPrQ",
|
||||
"number": 73
|
||||
},
|
||||
"lastSeen": 1743265865001
|
||||
"lastSeen": 1743265865001
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Qp5nI",
|
||||
"number": 72
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Qp5nI",
|
||||
"number": 72
|
||||
},
|
||||
"lastSeen": 1743338472110
|
||||
"lastSeen": 1743338472110
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QsjlS",
|
||||
"number": 76
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6QsjlS",
|
||||
"number": 76
|
||||
},
|
||||
"lastSeen": 1743352150953
|
||||
"lastSeen": 1743352150953
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Q0JBe",
|
||||
"number": 82
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Q0JBe",
|
||||
"number": 82
|
||||
},
|
||||
"lastSeen": 1743470267269
|
||||
"lastSeen": 1743470267269
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6UE9-x",
|
||||
"number": 102
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6UE9-x",
|
||||
"number": 102
|
||||
},
|
||||
"lastSeen": 1747171977348
|
||||
"lastSeen": 1747171977348
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6XPua_",
|
||||
"number": 117
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6XPua_",
|
||||
"number": 117
|
||||
},
|
||||
"lastSeen": 1747929835864
|
||||
"lastSeen": 1747929835864
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6XY-mZ",
|
||||
"number": 119
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6XY-mZ",
|
||||
"number": 119
|
||||
},
|
||||
"lastSeen": 1748028108508
|
||||
"lastSeen": 1748028108508
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Xdz4n",
|
||||
"number": 120
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Xdz4n",
|
||||
"number": 120
|
||||
},
|
||||
"lastSeen": 1748282672214
|
||||
"lastSeen": 1748282672214
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6X_zxl",
|
||||
"number": 131
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6X_zxl",
|
||||
"number": 131
|
||||
},
|
||||
"lastSeen": 1748881279494
|
||||
"lastSeen": 1748881279494
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6bhieT",
|
||||
"number": 152
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6bhieT",
|
||||
"number": 152
|
||||
},
|
||||
"lastSeen": 1751848489082
|
||||
"lastSeen": 1751848489082
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6dOyRk",
|
||||
"number": 154
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6dOyRk",
|
||||
"number": 154
|
||||
},
|
||||
"lastSeen": 1751849436454
|
||||
"lastSeen": 1751849436454
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6cHjNi",
|
||||
"number": 153
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6cHjNi",
|
||||
"number": 153
|
||||
},
|
||||
"lastSeen": 1751849501498
|
||||
"lastSeen": 1751849501498
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Zs1FN",
|
||||
"number": 145
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6Zs1FN",
|
||||
"number": 145
|
||||
},
|
||||
"lastSeen": 1751849770308
|
||||
"lastSeen": 1751849770308
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6bgKi9",
|
||||
"number": 150
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6bgKi9",
|
||||
"number": 150
|
||||
},
|
||||
"lastSeen": 1751850367300
|
||||
"lastSeen": 1751850367300
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6eUKC-",
|
||||
"number": 176
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6eUKC-",
|
||||
"number": 176
|
||||
},
|
||||
"lastSeen": 1752158748013
|
||||
"lastSeen": 1752158748013
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6eqzP7",
|
||||
"number": 190
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6et6vx",
|
||||
"number": 192
|
||||
},
|
||||
"lastSeen": 1752404173008
|
||||
"lastSeen": 1752585709582
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6et6vx",
|
||||
"number": 192
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6d36mi",
|
||||
"number": 168
|
||||
},
|
||||
"lastSeen": 1752585709582
|
||||
"lastSeen": 1752805763664
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6d36mi",
|
||||
"number": 168
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6fnXKf",
|
||||
"number": 208
|
||||
},
|
||||
"lastSeen": 1752805763664
|
||||
"lastSeen": 1752862212326
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6fnXKf",
|
||||
"number": 208
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6rjINx",
|
||||
"number": 259
|
||||
},
|
||||
"lastSeen": 1752862212326
|
||||
"lastSeen": 1759434090574
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6fo_ig",
|
||||
"number": 209
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6qcP13",
|
||||
"number": 256
|
||||
},
|
||||
"lastSeen": 1753201966322
|
||||
"lastSeen": 1759434257615
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6ow8QZ",
|
||||
"number": 252
|
||||
},
|
||||
"lastSeen": 1759434340504
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6myVeZ",
|
||||
"number": 247
|
||||
},
|
||||
"lastSeen": 1759434588110
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6i5ZAq",
|
||||
"number": 239
|
||||
},
|
||||
"lastSeen": 1759434599664
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6iiuGd",
|
||||
"number": 237
|
||||
},
|
||||
"lastSeen": 1759434652702
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6gwm8n",
|
||||
"number": 230
|
||||
},
|
||||
"lastSeen": 1759434669914
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6f5JeZ",
|
||||
"number": 220
|
||||
},
|
||||
"lastSeen": 1759434706785
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6ftgWI",
|
||||
"number": 217
|
||||
},
|
||||
"lastSeen": 1759434804548
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6XsHfL",
|
||||
"number": 128
|
||||
},
|
||||
"lastSeen": 1759434870000
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6ec-tz",
|
||||
"number": 180
|
||||
},
|
||||
"lastSeen": 1759434882113
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6fsi5n",
|
||||
"number": 216
|
||||
},
|
||||
"lastSeen": 1759434902813
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6ZkP3F",
|
||||
"number": 142
|
||||
},
|
||||
"lastSeen": 1759434918778
|
||||
},
|
||||
{
|
||||
"id": {
|
||||
"id": "PR_kwDOMJIfts6qcbuA",
|
||||
"number": 257
|
||||
},
|
||||
"lastSeen": 1759438234107
|
||||
}
|
||||
]
|
||||
}</component>
|
||||
}]]></component>
|
||||
<component name="GithubPullRequestsUISettings">{
|
||||
"selectedUrlAndAccountId": {
|
||||
"url": "https://github.com/iib0011/omni-tools.git",
|
||||
@ -279,9 +377,9 @@
|
||||
<component name="HighlightingSettingsPerFile">
|
||||
<setting file="file://$PROJECT_DIR$/node_modules/react-image-crop/dist/index.d.ts" root0="SKIP_INSPECTION" />
|
||||
</component>
|
||||
<component name="KubernetesApiProvider">{
|
||||
"isMigrated": true
|
||||
}</component>
|
||||
<component name="KubernetesApiProvider"><![CDATA[{
|
||||
"isMigrated": true
|
||||
}]]></component>
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
</component>
|
||||
@ -326,7 +424,7 @@
|
||||
"Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp.executor": "Run",
|
||||
"Vitest.replaceText function.executor": "Run",
|
||||
"Vitest.timeBetweenDates.executor": "Run",
|
||||
"git-widget-placeholder": "#218 on fork/AshAnand34/tool/random-generators",
|
||||
"git-widget-placeholder": "main",
|
||||
"ignore.virus.scanning.warn.message": "true",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools",
|
||||
@ -347,6 +445,7 @@
|
||||
"npm.test.executor": "Run",
|
||||
"npm.test:e2e.executor": "Run",
|
||||
"npm.test:e2e:run.executor": "Run",
|
||||
"npm.typecheck.executor": "Run",
|
||||
"prettierjs.PrettierConfiguration.Package": "C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\prettier",
|
||||
"project.structure.last.edited": "Problems",
|
||||
"project.structure.proportion": "0.0",
|
||||
@ -383,19 +482,6 @@
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager" selected="npm.dev">
|
||||
<configuration name="generatePassword" type="JavaScriptTestRunnerVitest" temporary="true" nameIsGenerated="true">
|
||||
<node-interpreter value="project" />
|
||||
<vitest-package value="$PROJECT_DIR$/node_modules/vitest" />
|
||||
<working-dir value="$PROJECT_DIR$" />
|
||||
<vitest-options value="--run" />
|
||||
<envs />
|
||||
<scope-kind value="SUITE" />
|
||||
<test-file value="$PROJECT_DIR$/src/pages/tools/string/password-generator/password-generator.service.test.ts" />
|
||||
<test-names>
|
||||
<test-name value="generatePassword" />
|
||||
</test-names>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
|
||||
<deployment type="dockerfile">
|
||||
<settings />
|
||||
@ -415,26 +501,6 @@
|
||||
</envs>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:extract" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="i18n:extract" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:pull" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="i18n:pull" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="i18n:sync" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
@ -447,20 +513,50 @@
|
||||
</envs>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="test" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="test" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="test:e2e" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="test:e2e" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="typecheck" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="typecheck" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="npm.i18n:extract" />
|
||||
<item itemvalue="npm.i18n:pull" />
|
||||
<item itemvalue="npm.test" />
|
||||
<item itemvalue="npm.test:e2e" />
|
||||
<item itemvalue="npm.typecheck" />
|
||||
<item itemvalue="npm.i18n:sync" />
|
||||
<item itemvalue="npm.dev" />
|
||||
<item itemvalue="Vitest.generatePassword" />
|
||||
</list>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="npm.dev" />
|
||||
<item itemvalue="npm.test:e2e" />
|
||||
<item itemvalue="npm.test" />
|
||||
<item itemvalue="npm.typecheck" />
|
||||
<item itemvalue="npm.i18n:sync" />
|
||||
<item itemvalue="Vitest.generatePassword" />
|
||||
<item itemvalue="npm.i18n:pull" />
|
||||
<item itemvalue="npm.i18n:extract" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
@ -581,14 +677,6 @@
|
||||
<workItem from="1753206561770" duration="119000" />
|
||||
<workItem from="1753206717510" duration="3599000" />
|
||||
</task>
|
||||
<task id="LOCAL-00201" summary="chore: rename from Omni Tools to OmniTools">
|
||||
<option name="closed" value="true" />
|
||||
<created>1751630993003</created>
|
||||
<option name="number" value="00201" />
|
||||
<option name="presentableId" value="LOCAL-00201" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1751630993003</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00202" summary="fix: tools by category page title">
|
||||
<option name="closed" value="true" />
|
||||
<created>1751846877842</created>
|
||||
@ -973,7 +1061,15 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1753210033390</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="250" />
|
||||
<task id="LOCAL-00250" summary="feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/pages/tools/number/generic-calc/data/temperature.ts - package.json - .idea/workspace.xml">
|
||||
<option name="closed" value="true" />
|
||||
<created>1759439927012</created>
|
||||
<option name="number" value="00250" />
|
||||
<option name="presentableId" value="LOCAL-00250" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1759439927012</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="251" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@ -996,6 +1092,11 @@
|
||||
<entry key="Branch">
|
||||
<value>
|
||||
<list>
|
||||
<RecentGroup>
|
||||
<option name="FILTER_VALUES">
|
||||
<option value="origin/main" />
|
||||
</option>
|
||||
</RecentGroup>
|
||||
<RecentGroup>
|
||||
<option name="FILTER_VALUES">
|
||||
<option value="origin/examples" />
|
||||
@ -1010,7 +1111,19 @@
|
||||
<map>
|
||||
<entry key="MAIN">
|
||||
<value>
|
||||
<State />
|
||||
<State>
|
||||
<option name="FILTERS">
|
||||
<map>
|
||||
<entry key="branch">
|
||||
<value>
|
||||
<list>
|
||||
<option value="origin/main" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</State>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
@ -1020,12 +1133,6 @@
|
||||
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
|
||||
<option name="CHECK_NEW_TODO" value="false" />
|
||||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
|
||||
<MESSAGE value="chore: i18n in meta" />
|
||||
<MESSAGE value="chore: add i18n to meta script" />
|
||||
<MESSAGE value="chore: bundle translations at build time" />
|
||||
<MESSAGE value="fix: tsc" />
|
||||
<MESSAGE value="chore: remove unnecessary" />
|
||||
<MESSAGE value="chore: saveMissing" />
|
||||
<MESSAGE value="fix: translation related behaviors" />
|
||||
<MESSAGE value="feat: password generator to test translation" />
|
||||
<MESSAGE value="docs: translation docs" />
|
||||
@ -1045,7 +1152,13 @@
|
||||
<MESSAGE value="chore: show only necessary tags on a category" />
|
||||
<MESSAGE value="chore: CATEGORIES_USER_TYPES_MAPPINGS" />
|
||||
<MESSAGE value="chore: translate userTypes" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="chore: translate userTypes" />
|
||||
<MESSAGE value="```" />
|
||||
<MESSAGE value="``` feat: remove temperature conversion from generic-calc This commit removes the temperature conversion" />
|
||||
<MESSAGE value="``` feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing" />
|
||||
<MESSAGE value="``` feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/" />
|
||||
<MESSAGE value="``` feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/pages/tools/number/generic-calc/data/temperature.ts - package.json - .idea/workspace.xml ```" />
|
||||
<MESSAGE value="feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/pages/tools/number/generic-calc/data/temperature.ts - package.json - .idea/workspace.xml" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="feat: remove temperature conversion from generic-calc This commit removes the temperature conversion tool from the generic-calc tool. This is because the tool was causing issues. The following files were modified: - src/pages/tools/number/generic-calc/data/index.ts - src/pages/tools/number/generic-calc/data/temperature.ts - package.json - .idea/workspace.xml" />
|
||||
</component>
|
||||
<component name="VgoProject">
|
||||
<integration-enabled>false</integration-enabled>
|
||||
|
||||
6479
package-lock.json
generated
6479
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -68,6 +68,7 @@
|
||||
"nerdamer-prime": "^1.2.4",
|
||||
"notistack": "^3.0.1",
|
||||
"omggif": "^1.0.10",
|
||||
"onnxruntime-web": "^1.23.0",
|
||||
"pdf-lib": "^1.17.1",
|
||||
"pdfjs-dist": "^5.2.133",
|
||||
"playwright": "^1.45.0",
|
||||
@ -81,6 +82,7 @@
|
||||
"react-image-crop": "^11.0.7",
|
||||
"react-konva": "^18.2.10",
|
||||
"react-router-dom": "^6.23.1",
|
||||
"styled-components": "^6.1.19",
|
||||
"tesseract.js": "^6.0.0",
|
||||
"type-fest": "^4.35.0",
|
||||
"use-deep-compare-effect": "^1.8.1",
|
||||
|
||||
@ -41,7 +41,7 @@ export async function changeAudioSpeed(
|
||||
const outputName = `output.${outputFormat}`;
|
||||
await ffmpeg.writeFile(fileName, await fetchFile(input));
|
||||
const audioFilter = computeAudioFilter(newSpeed);
|
||||
let args = ['-i', fileName, '-filter:a', audioFilter];
|
||||
const args = ['-i', fileName, '-filter:a', audioFilter];
|
||||
if (outputFormat === 'mp3') {
|
||||
args.push('-b:a', '192k', '-f', 'mp3', outputName);
|
||||
} else if (outputFormat === 'aac') {
|
||||
@ -64,7 +64,7 @@ export async function changeAudioSpeed(
|
||||
let mimeType = 'audio/mp3';
|
||||
if (outputFormat === 'aac') mimeType = 'audio/aac';
|
||||
if (outputFormat === 'wav') mimeType = 'audio/wav';
|
||||
const blob = new Blob([data], { type: mimeType });
|
||||
const blob = new Blob([data as any], { type: mimeType });
|
||||
const newFile = new File(
|
||||
[blob],
|
||||
fileName.replace(/\.[^/.]+$/, `-${newSpeed}x.${outputFormat}`),
|
||||
|
||||
@ -57,7 +57,7 @@ export async function extractAudioFromVideo(
|
||||
|
||||
return new File(
|
||||
[
|
||||
new Blob([extractedAudio], {
|
||||
new Blob([extractedAudio as any], {
|
||||
type: `audio/${configuredOutputAudioFormat}`
|
||||
})
|
||||
],
|
||||
|
||||
@ -105,7 +105,7 @@ export async function mergeAudioFiles(
|
||||
|
||||
return new File(
|
||||
[
|
||||
new Blob([mergedAudio], {
|
||||
new Blob([mergedAudio as any], {
|
||||
type: mimeType
|
||||
})
|
||||
],
|
||||
|
||||
@ -98,7 +98,7 @@ export async function trimAudio(
|
||||
|
||||
return new File(
|
||||
[
|
||||
new Blob([trimmedAudio], {
|
||||
new Blob([trimmedAudio as any], {
|
||||
type: mimeType
|
||||
})
|
||||
],
|
||||
|
||||
@ -40,7 +40,7 @@ const initialValues: InitialValuesType = {
|
||||
// WiFi
|
||||
wifiSsid: '',
|
||||
wifiPassword: '',
|
||||
wifiEncryption: 'WPA/WPA2',
|
||||
wifiEncryption: 'WPA',
|
||||
|
||||
// vCard
|
||||
vCardName: '',
|
||||
@ -353,7 +353,7 @@ export default function QRCodeGenerator({ title }: ToolComponentProps) {
|
||||
label="Encryption Type"
|
||||
margin="normal"
|
||||
>
|
||||
<MenuItem value="WPA/WPA2">WPA/WPA2</MenuItem>
|
||||
<MenuItem value="WPA">WPA</MenuItem>
|
||||
<MenuItem value="WEP">WEP</MenuItem>
|
||||
<MenuItem value="None">None</MenuItem>
|
||||
</TextField>
|
||||
|
||||
@ -7,7 +7,7 @@ export type QRCodeType =
|
||||
| 'WiFi'
|
||||
| 'vCard';
|
||||
|
||||
export type WifiEncryptionType = 'WPA/WPA2' | 'WEP' | 'None';
|
||||
export type WifiEncryptionType = 'WPA' | 'WEP' | 'None';
|
||||
|
||||
export interface InitialValuesType {
|
||||
qrCodeType: QRCodeType;
|
||||
|
||||
@ -148,7 +148,7 @@ export const processImage = async (
|
||||
const data = await ffmpeg.readFile('output.gif');
|
||||
|
||||
// Create a new File object
|
||||
return new File([data], file.name, { type: 'image/gif' });
|
||||
return new File([data as any], file.name, { type: 'image/gif' });
|
||||
} catch (error) {
|
||||
console.error('Error processing GIF with FFmpeg:', error);
|
||||
// Fall back to canvas method if FFmpeg processing fails
|
||||
|
||||
@ -66,7 +66,7 @@ export const processImage = async (
|
||||
|
||||
// Read the output file
|
||||
const data = await ffmpeg.readFile('output.' + file.name.split('.').pop());
|
||||
return new File([data], file.name, { type: file.type });
|
||||
return new File([data as any], file.name, { type: file.type });
|
||||
} catch (error) {
|
||||
console.error('Error processing image:', error);
|
||||
return null;
|
||||
|
||||
@ -3,6 +3,7 @@ import voltageDropInWire from './voltageDropInWire';
|
||||
import sphereArea from './sphereArea';
|
||||
import sphereVolume from './sphereVolume';
|
||||
import slackline from './slackline';
|
||||
|
||||
export default [
|
||||
ohmslaw,
|
||||
voltageDropInWire,
|
||||
|
||||
@ -70,7 +70,9 @@ export async function splitPdf(
|
||||
|
||||
const newPdfBytes = await newPdf.save();
|
||||
const newFileName = pdfFile.name.replace('.pdf', '-extracted.pdf');
|
||||
return new File([newPdfBytes], newFileName, { type: 'application/pdf' });
|
||||
return new File([newPdfBytes as any], newFileName, {
|
||||
type: 'application/pdf'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -89,7 +91,7 @@ export async function mergePdf(pdfFiles: File[]): Promise<File> {
|
||||
|
||||
const mergedPdfBytes = await mergedPdf.save();
|
||||
const mergedFileName = 'merged.pdf';
|
||||
return new File([mergedPdfBytes], mergedFileName, {
|
||||
return new File([mergedPdfBytes as any], mergedFileName, {
|
||||
type: 'application/pdf'
|
||||
});
|
||||
}
|
||||
|
||||
@ -28,7 +28,7 @@ export async function convertPdfToPngImages(pdfFile: File): Promise<{
|
||||
canvas.width = viewport.width;
|
||||
canvas.height = viewport.height;
|
||||
|
||||
await page.render({ canvasContext: context, viewport }).promise;
|
||||
await page.render({ canvas, canvasContext: context, viewport }).promise;
|
||||
|
||||
const blob = await new Promise<Blob>((resolve) =>
|
||||
canvas.toBlob((b) => b && resolve(b), 'image/png')
|
||||
|
||||
@ -78,5 +78,7 @@ export async function rotatePdf(
|
||||
const modifiedPdfBytes = await pdfDoc.save();
|
||||
const newFileName = pdfFile.name.replace('.pdf', '-rotated.pdf');
|
||||
|
||||
return new File([modifiedPdfBytes], newFileName, { type: 'application/pdf' });
|
||||
return new File([modifiedPdfBytes as any], newFileName, {
|
||||
type: 'application/pdf'
|
||||
});
|
||||
}
|
||||
|
||||
@ -70,5 +70,7 @@ export async function splitPdf(
|
||||
|
||||
const newPdfBytes = await newPdf.save();
|
||||
const newFileName = pdfFile.name.replace('.pdf', '-extracted.pdf');
|
||||
return new File([newPdfBytes], newFileName, { type: 'application/pdf' });
|
||||
return new File([newPdfBytes as any], newFileName, {
|
||||
type: 'application/pdf'
|
||||
});
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ export default function ChangeSpeed({
|
||||
const data = await ffmpeg.readFile(outputName);
|
||||
|
||||
// Create new file from processed data
|
||||
const blob = new Blob([data], { type: 'video/mp4' });
|
||||
const blob = new Blob([data as any], { type: 'video/mp4' });
|
||||
const newFile = new File(
|
||||
[blob],
|
||||
file.name.replace('.mp4', `-${newSpeed}x.mp4`),
|
||||
|
||||
@ -53,7 +53,7 @@ export async function compressVideo(
|
||||
}
|
||||
const compressedData = await ffmpeg.readFile(outputName);
|
||||
return new File(
|
||||
[new Blob([compressedData], { type: 'video/mp4' })],
|
||||
[new Blob([compressedData as any], { type: 'video/mp4' })],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_compressed_${options.width}p.mp4`,
|
||||
{ type: 'video/mp4' }
|
||||
);
|
||||
|
||||
@ -60,7 +60,7 @@ export async function cropVideo(
|
||||
|
||||
const croppedData = await ffmpeg.readFile(outputName);
|
||||
return await new File(
|
||||
[new Blob([croppedData], { type: 'video/mp4' })],
|
||||
[new Blob([croppedData as any], { type: 'video/mp4' })],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_cropped.mp4`,
|
||||
{ type: 'video/mp4' }
|
||||
);
|
||||
|
||||
@ -36,7 +36,7 @@ export async function flipVideo(
|
||||
|
||||
const flippedData = await ffmpeg.readFile(outputName);
|
||||
return new File(
|
||||
[new Blob([flippedData], { type: 'video/mp4' })],
|
||||
[new Blob([flippedData as any], { type: 'video/mp4' })],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_flipped.mp4`,
|
||||
{ type: 'video/mp4' }
|
||||
);
|
||||
|
||||
@ -71,7 +71,7 @@ export default function ChangeSpeed({ title }: ToolComponentProps) {
|
||||
const data = await ffmpeg.readFile('output.gif');
|
||||
|
||||
// Create a new file from the processed data
|
||||
const blob = new Blob([data], { type: 'image/gif' });
|
||||
const blob = new Blob([data as any], { type: 'image/gif' });
|
||||
const newFile = new File(
|
||||
[blob],
|
||||
file.name.replace('.gif', `-${newSpeed}x.gif`),
|
||||
|
||||
@ -3,7 +3,7 @@ import { lazy } from 'react';
|
||||
|
||||
export const tool = defineTool('video', {
|
||||
path: 'loop',
|
||||
icon: 'material-symbols:loop',
|
||||
icon: 'ic:outline-loop',
|
||||
|
||||
keywords: ['video', 'loop', 'repeat', 'continuous'],
|
||||
component: lazy(() => import('./index')),
|
||||
|
||||
@ -34,7 +34,7 @@ export async function loopVideo(
|
||||
|
||||
const loopedData = await ffmpeg.readFile(outputName);
|
||||
return await new File(
|
||||
[new Blob([loopedData], { type: 'video/mp4' })],
|
||||
[new Blob([loopedData as any], { type: 'video/mp4' })],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_looped.mp4`,
|
||||
{ type: 'video/mp4' }
|
||||
);
|
||||
|
||||
@ -112,7 +112,7 @@ export async function mergeVideos(
|
||||
throw new Error('Output file is empty or corrupted');
|
||||
}
|
||||
|
||||
return new Blob([mergedData], { type: 'video/mp4' });
|
||||
return new Blob([mergedData as any], { type: 'video/mp4' });
|
||||
} catch (error) {
|
||||
console.error('Error merging videos:', error);
|
||||
throw error instanceof Error
|
||||
|
||||
@ -37,7 +37,7 @@ export async function rotateVideo(
|
||||
|
||||
const rotatedData = await ffmpeg.readFile(outputName);
|
||||
return new File(
|
||||
[new Blob([rotatedData], { type: 'video/mp4' })],
|
||||
[new Blob([rotatedData as any], { type: 'video/mp4' })],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_rotated.mp4`,
|
||||
{ type: 'video/mp4' }
|
||||
);
|
||||
|
||||
@ -67,7 +67,7 @@ export default function TrimVideo({ title }: ToolComponentProps) {
|
||||
]);
|
||||
// Retrieve the processed file
|
||||
const trimmedData = await ffmpeg.readFile(outputName);
|
||||
const trimmedBlob = new Blob([trimmedData], { type: 'video/mp4' });
|
||||
const trimmedBlob = new Blob([trimmedData as any], { type: 'video/mp4' });
|
||||
const trimmedFile = new File(
|
||||
[trimmedBlob],
|
||||
`${input.name.replace(/\.[^/.]+$/, '')}_trimmed.mp4`,
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
import { Box } from '@mui/material';
|
||||
import React, { useState } from 'react';
|
||||
import * as Yup from 'yup';
|
||||
import ToolContent from '@components/ToolContent';
|
||||
import { ToolComponentProps } from '@tools/defineTool';
|
||||
import { GetGroupsType } from '@components/options/ToolOptions';
|
||||
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
|
||||
import { updateNumberField } from '@utils/string';
|
||||
import { InitialValuesType } from './types';
|
||||
import ToolVideoInput from '@components/input/ToolVideoInput';
|
||||
import ToolFileResult from '@components/result/ToolFileResult';
|
||||
@ -13,9 +16,19 @@ import { fetchFile } from '@ffmpeg/util';
|
||||
const initialValues: InitialValuesType = {
|
||||
quality: 'mid',
|
||||
fps: '10',
|
||||
scale: '320:-1:flags=bicubic'
|
||||
scale: '320:-1:flags=bicubic',
|
||||
start: 0,
|
||||
end: 100
|
||||
};
|
||||
|
||||
const validationSchema = Yup.object({
|
||||
start: Yup.number().min(0, 'Start time must be positive'),
|
||||
end: Yup.number().min(
|
||||
Yup.ref('start'),
|
||||
'End time must be greater than start time'
|
||||
)
|
||||
});
|
||||
|
||||
export default function VideoToGif({
|
||||
title,
|
||||
longDescription
|
||||
@ -26,14 +39,16 @@ export default function VideoToGif({
|
||||
|
||||
const compute = (values: InitialValuesType, input: File | null) => {
|
||||
if (!input) return;
|
||||
const { fps, scale } = values;
|
||||
const { fps, scale, start, end } = values;
|
||||
let ffmpeg: FFmpeg | null = null;
|
||||
let ffmpegLoaded = false;
|
||||
|
||||
const convertVideoToGif = async (
|
||||
file: File,
|
||||
fps: string,
|
||||
scale: string
|
||||
scale: string,
|
||||
start: number,
|
||||
end: number
|
||||
): Promise<void> => {
|
||||
setLoading(true);
|
||||
|
||||
@ -58,6 +73,10 @@ export default function VideoToGif({
|
||||
await ffmpeg.exec([
|
||||
'-i',
|
||||
fileName,
|
||||
'-ss',
|
||||
start.toString(),
|
||||
'-to',
|
||||
end.toString(),
|
||||
'-vf',
|
||||
`fps=${fps},scale=${scale},palettegen`,
|
||||
'palette.png'
|
||||
@ -68,6 +87,10 @@ export default function VideoToGif({
|
||||
fileName,
|
||||
'-i',
|
||||
'palette.png',
|
||||
'-ss',
|
||||
start.toString(),
|
||||
'-to',
|
||||
end.toString(),
|
||||
'-filter_complex',
|
||||
`fps=${fps},scale=${scale}[x];[x][1:v]paletteuse`,
|
||||
outputName
|
||||
@ -75,7 +98,7 @@ export default function VideoToGif({
|
||||
|
||||
const data = await ffmpeg.readFile(outputName);
|
||||
|
||||
const blob = new Blob([data], { type: 'image/gif' });
|
||||
const blob = new Blob([data as any], { type: 'image/gif' });
|
||||
const convertedFile = new File([blob], outputName, {
|
||||
type: 'image/gif'
|
||||
});
|
||||
@ -92,7 +115,7 @@ export default function VideoToGif({
|
||||
}
|
||||
};
|
||||
|
||||
convertVideoToGif(input, fps, scale);
|
||||
convertVideoToGif(input, fps, scale, start, end);
|
||||
};
|
||||
|
||||
const getGroups: GetGroupsType<InitialValuesType> | null = ({
|
||||
@ -141,6 +164,28 @@ export default function VideoToGif({
|
||||
/>
|
||||
</Box>
|
||||
)
|
||||
},
|
||||
{
|
||||
title: 'Timestamps',
|
||||
component: (
|
||||
<Box>
|
||||
<TextFieldWithDesc
|
||||
onOwnChange={(value) =>
|
||||
updateNumberField(value, 'start', updateField)
|
||||
}
|
||||
value={values.start}
|
||||
label="Start Time"
|
||||
sx={{ mb: 2, backgroundColor: 'background.paper' }}
|
||||
/>
|
||||
<TextFieldWithDesc
|
||||
onOwnChange={(value) =>
|
||||
updateNumberField(value, 'end', updateField)
|
||||
}
|
||||
value={values.end}
|
||||
label="End Time"
|
||||
/>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
];
|
||||
|
||||
@ -148,9 +193,22 @@ export default function VideoToGif({
|
||||
<ToolContent
|
||||
title={title}
|
||||
input={input}
|
||||
inputComponent={
|
||||
<ToolVideoInput value={input} onChange={setInput} title="Input Video" />
|
||||
}
|
||||
renderCustomInput={({ start, end }, setFieldValue) => {
|
||||
return (
|
||||
<ToolVideoInput
|
||||
value={input}
|
||||
onChange={setInput}
|
||||
title={'Input Video'}
|
||||
showTrimControls={true}
|
||||
onTrimChange={(start, end) => {
|
||||
setFieldValue('start', start);
|
||||
setFieldValue('end', end);
|
||||
}}
|
||||
trimStart={start}
|
||||
trimEnd={end}
|
||||
/>
|
||||
);
|
||||
}}
|
||||
resultComponent={
|
||||
loading ? (
|
||||
<ToolFileResult
|
||||
|
||||
@ -2,4 +2,6 @@ export type InitialValuesType = {
|
||||
quality: 'mid' | 'high' | 'low' | 'ultra';
|
||||
fps: string;
|
||||
scale: string;
|
||||
start: number;
|
||||
end: number;
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user