@sigmaott/base-next 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (714) hide show
  1. package/hyrd-ui.preset.ts +463 -463
  2. package/i18n.config.ts +3 -3
  3. package/locales/en.yaml +719 -719
  4. package/locales/vi.yaml +726 -726
  5. package/nuxt-config.ts +23 -23
  6. package/nuxt.config.ts +281 -281
  7. package/package.json +130 -130
  8. package/public/routes.json +33 -33
  9. package/src/api/api.ts +15 -15
  10. package/src/api/axios.ts +133 -133
  11. package/src/api/service-loading.ts +50 -50
  12. package/src/api-client-auth/.openapi-generator/FILES +83 -83
  13. package/src/api-client-auth/.openapi-generator-ignore +23 -23
  14. package/src/api-client-auth/api/admin-groups-api.ts +612 -612
  15. package/src/api-client-auth/api/admin-members-api.ts +708 -708
  16. package/src/api-client-auth/api/administration-api-groups-api.ts +547 -547
  17. package/src/api-client-auth/api/administration-apps-api.ts +709 -709
  18. package/src/api-client-auth/api/administration-packages-api.ts +547 -547
  19. package/src/api-client-auth/api/api-groups-api.ts +296 -296
  20. package/src/api-client-auth/api/apps-api.ts +1613 -1613
  21. package/src/api-client-auth/api/basic-credential-api.ts +950 -950
  22. package/src/api-client-auth/api/groups-api.ts +702 -702
  23. package/src/api-client-auth/api/members-api.ts +708 -708
  24. package/src/api-client-auth/api/members-on-premise-api.ts +351 -351
  25. package/src/api-client-auth/api/packages-api.ts +296 -296
  26. package/src/api-client-auth/api/users-api.ts +1387 -1387
  27. package/src/api-client-auth/api.ts +30 -30
  28. package/src/api-client-auth/base.ts +72 -72
  29. package/src/api-client-auth/common.ts +150 -150
  30. package/src/api-client-auth/configuration.ts +101 -101
  31. package/src/api-client-auth/git_push.sh +57 -57
  32. package/src/api-client-auth/index.ts +18 -18
  33. package/src/api-client-auth/models/add-member-dto.ts +42 -42
  34. package/src/api-client-auth/models/admin-permission.ts +44 -44
  35. package/src/api-client-auth/models/api-group-collection.ts +57 -57
  36. package/src/api-client-auth/models/api-group.ts +80 -80
  37. package/src/api-client-auth/models/api.ts +44 -44
  38. package/src/api-client-auth/models/app-collection.ts +57 -57
  39. package/src/api-client-auth/models/app.ts +147 -147
  40. package/src/api-client-auth/models/backdoor-cred.ts +39 -39
  41. package/src/api-client-auth/models/basic-cred-collection.ts +57 -57
  42. package/src/api-client-auth/models/basic-cred.ts +83 -83
  43. package/src/api-client-auth/models/change-password-dto.ts +42 -42
  44. package/src/api-client-auth/models/create-admin-group-dto.ts +39 -39
  45. package/src/api-client-auth/models/create-api-group-dto.ts +42 -42
  46. package/src/api-client-auth/models/create-app-by-user-dto.ts +36 -36
  47. package/src/api-client-auth/models/create-app-dto.ts +65 -65
  48. package/src/api-client-auth/models/create-basic-cred-dto.ts +39 -39
  49. package/src/api-client-auth/models/create-group-dto.ts +39 -39
  50. package/src/api-client-auth/models/create-package-dto.ts +48 -48
  51. package/src/api-client-auth/models/create-user-dto.ts +60 -60
  52. package/src/api-client-auth/models/free-trial.ts +54 -54
  53. package/src/api-client-auth/models/general-app.ts +48 -48
  54. package/src/api-client-auth/models/generate-app-id.ts +30 -30
  55. package/src/api-client-auth/models/group-collection.ts +57 -57
  56. package/src/api-client-auth/models/group.ts +75 -75
  57. package/src/api-client-auth/models/index.ts +60 -60
  58. package/src/api-client-auth/models/invite-email-dto.ts +30 -30
  59. package/src/api-client-auth/models/invite-member-dto.ts +36 -36
  60. package/src/api-client-auth/models/live-stream-quota.ts +42 -42
  61. package/src/api-client-auth/models/login-dto.ts +36 -36
  62. package/src/api-client-auth/models/login-result.ts +39 -39
  63. package/src/api-client-auth/models/member-collection.ts +57 -57
  64. package/src/api-client-auth/models/member.ts +92 -92
  65. package/src/api-client-auth/models/package-collection.ts +57 -57
  66. package/src/api-client-auth/models/package-permission.ts +44 -44
  67. package/src/api-client-auth/models/package.ts +66 -66
  68. package/src/api-client-auth/models/permission.ts +44 -44
  69. package/src/api-client-auth/models/quota.ts +45 -45
  70. package/src/api-client-auth/models/re-get-password-dto.ts +30 -30
  71. package/src/api-client-auth/models/register-dto.ts +54 -54
  72. package/src/api-client-auth/models/register-through-email-dto.ts +36 -36
  73. package/src/api-client-auth/models/rename-app-dto.ts +30 -30
  74. package/src/api-client-auth/models/resend-confirmation-dto.ts +30 -30
  75. package/src/api-client-auth/models/resend-invitation-dto.ts +30 -30
  76. package/src/api-client-auth/models/resend-result.ts +36 -36
  77. package/src/api-client-auth/models/reset-password-dto.ts +36 -36
  78. package/src/api-client-auth/models/revoke-basic-dto.ts +38 -38
  79. package/src/api-client-auth/models/signup-result.ts +45 -45
  80. package/src/api-client-auth/models/token-check-result.ts +36 -36
  81. package/src/api-client-auth/models/trial-remaining-days.ts +42 -42
  82. package/src/api-client-auth/models/update-admin-group-dto.ts +39 -39
  83. package/src/api-client-auth/models/update-api-group-dto.ts +30 -30
  84. package/src/api-client-auth/models/update-app-by-admin-dto.ts +48 -48
  85. package/src/api-client-auth/models/update-app-by-user-dto.ts +36 -36
  86. package/src/api-client-auth/models/update-basic-cred-dto.ts +30 -30
  87. package/src/api-client-auth/models/update-group-dto.ts +39 -39
  88. package/src/api-client-auth/models/update-member-dto.ts +30 -30
  89. package/src/api-client-auth/models/update-package-dto.ts +42 -42
  90. package/src/api-client-auth/models/update-password-member-dto.ts +30 -30
  91. package/src/api-client-auth/models/update-user-by-user-dto.ts +48 -48
  92. package/src/api-client-auth/models/user.ts +120 -120
  93. package/src/api-client-auth/models/validate-app-id.ts +36 -36
  94. package/src/api-client-billing/.openapi-generator/FILES +38 -38
  95. package/src/api-client-billing/.openapi-generator-ignore +23 -23
  96. package/src/api-client-billing/api/invoice-api.ts +363 -363
  97. package/src/api-client-billing/api/payment-methods-api.ts +414 -414
  98. package/src/api-client-billing/api/payment-plan-api.ts +121 -121
  99. package/src/api-client-billing/api/subscriptions-api.ts +121 -121
  100. package/src/api-client-billing/api/usages-api.ts +121 -121
  101. package/src/api-client-billing/api/vnpay-provider-api.ts +327 -327
  102. package/src/api-client-billing/api.ts +23 -23
  103. package/src/api-client-billing/base.ts +72 -72
  104. package/src/api-client-billing/common.ts +150 -150
  105. package/src/api-client-billing/configuration.ts +101 -101
  106. package/src/api-client-billing/git_push.sh +57 -57
  107. package/src/api-client-billing/index.ts +18 -18
  108. package/src/api-client-billing/models/common-paginate-response.ts +48 -48
  109. package/src/api-client-billing/models/dto-billing-item-info.ts +60 -60
  110. package/src/api-client-billing/models/dto-billing-item.ts +36 -36
  111. package/src/api-client-billing/models/dto-create-draft-invoice-request.ts +33 -33
  112. package/src/api-client-billing/models/dto-create-draft-invoice-response.ts +57 -57
  113. package/src/api-client-billing/models/dto-create-vnpay-card-form.ts +48 -48
  114. package/src/api-client-billing/models/dto-return-uri-response.ts +30 -30
  115. package/src/api-client-billing/models/index.ts +22 -22
  116. package/src/api-client-billing/models/invoices-get200-response.ts +42 -42
  117. package/src/api-client-billing/models/model-charge.ts +47 -47
  118. package/src/api-client-billing/models/model-charges-usage.ts +57 -57
  119. package/src/api-client-billing/models/model-graduated-range.ts +48 -48
  120. package/src/api-client-billing/models/model-info.ts +42 -42
  121. package/src/api-client-billing/models/model-invoice.ts +105 -105
  122. package/src/api-client-billing/models/model-item-usage.ts +54 -54
  123. package/src/api-client-billing/models/model-payment-method.ts +135 -135
  124. package/src/api-client-billing/models/model-product.ts +51 -51
  125. package/src/api-client-billing/models/model-properties.ts +39 -39
  126. package/src/api-client-billing/models/model-quota.ts +48 -48
  127. package/src/api-client-billing/models/model-subscription.ts +51 -51
  128. package/src/api-client-billing/models/model-usage-payment.ts +87 -87
  129. package/src/api-client-billing/models/payment-methods-get200-response.ts +42 -42
  130. package/src/api-client-billing/models/subscriptions-get200-response.ts +42 -42
  131. package/src/api-client-machine/.openapi-generator/FILES +90 -90
  132. package/src/api-client-machine/.openapi-generator-ignore +23 -23
  133. package/src/api-client-machine/api/apps-config-api.ts +523 -523
  134. package/src/api-client-machine/api/component-clusters-api.ts +741 -741
  135. package/src/api-client-machine/api/expose-api.ts +141 -141
  136. package/src/api-client-machine/api/machine-actions-api.ts +850 -850
  137. package/src/api-client-machine/api/machines-api.ts +524 -524
  138. package/src/api-client-machine/api/networks-api.ts +375 -375
  139. package/src/api-client-machine/api/sigma-clusters-api.ts +741 -741
  140. package/src/api-client-machine/api/sigma-machine-actions-api.ts +292 -292
  141. package/src/api-client-machine/api/sigma-machine-apps-configuration-api.ts +523 -523
  142. package/src/api-client-machine/api/sigma-machines-api.ts +557 -557
  143. package/src/api-client-machine/api/sigma-vod-server-api.ts +478 -478
  144. package/src/api-client-machine/api/sigma-vod-server-app-config-api.ts +980 -980
  145. package/src/api-client-machine/api/transcoder-configuration-api.ts +359 -359
  146. package/src/api-client-machine/api.ts +30 -30
  147. package/src/api-client-machine/base.ts +72 -72
  148. package/src/api-client-machine/common.ts +150 -150
  149. package/src/api-client-machine/configuration.ts +101 -101
  150. package/src/api-client-machine/git_push.sh +57 -57
  151. package/src/api-client-machine/index.ts +18 -18
  152. package/src/api-client-machine/models/actions-to-app-dto.ts +38 -38
  153. package/src/api-client-machine/models/add-license-machine-dto.ts +30 -30
  154. package/src/api-client-machine/models/app-status.ts +47 -47
  155. package/src/api-client-machine/models/check-quota-limit-result.ts +36 -36
  156. package/src/api-client-machine/models/cluster-log.ts +54 -54
  157. package/src/api-client-machine/models/component-cluster-collection.ts +57 -57
  158. package/src/api-client-machine/models/component-cluster.ts +116 -116
  159. package/src/api-client-machine/models/create-component-machine-cluster-dto.ts +86 -86
  160. package/src/api-client-machine/models/create-sigma-machine-cluster-dto.ts +77 -77
  161. package/src/api-client-machine/models/create-vodroute-dto.ts +42 -42
  162. package/src/api-client-machine/models/decklink-collection.ts +57 -57
  163. package/src/api-client-machine/models/decklink.ts +42 -42
  164. package/src/api-client-machine/models/http-app.ts +45 -45
  165. package/src/api-client-machine/models/https-config.ts +42 -42
  166. package/src/api-client-machine/models/index.ts +67 -67
  167. package/src/api-client-machine/models/info-channel.ts +42 -42
  168. package/src/api-client-machine/models/ingest-app.ts +60 -60
  169. package/src/api-client-machine/models/ingest-config.ts +74 -74
  170. package/src/api-client-machine/models/ingest-update-config-dto.ts +68 -68
  171. package/src/api-client-machine/models/machine-cluster-collection.ts +57 -57
  172. package/src/api-client-machine/models/machine-cluster.ts +120 -120
  173. package/src/api-client-machine/models/machine-details-license.ts +42 -42
  174. package/src/api-client-machine/models/machine-details.ts +127 -127
  175. package/src/api-client-machine/models/machine-dto.ts +42 -42
  176. package/src/api-client-machine/models/machine-dump.ts +108 -108
  177. package/src/api-client-machine/models/machine.ts +42 -42
  178. package/src/api-client-machine/models/network-collection.ts +57 -57
  179. package/src/api-client-machine/models/network-interface.ts +36 -36
  180. package/src/api-client-machine/models/network.ts +66 -66
  181. package/src/api-client-machine/models/origin-config.ts +50 -50
  182. package/src/api-client-machine/models/origin-update-config-dto.ts +59 -59
  183. package/src/api-client-machine/models/packager-component-cluster.ts +42 -42
  184. package/src/api-client-machine/models/packager-live-cluster.ts +42 -42
  185. package/src/api-client-machine/models/packager-to-component-cluster.ts +51 -51
  186. package/src/api-client-machine/models/quotas-result.ts +30 -30
  187. package/src/api-client-machine/models/registration-config.ts +48 -48
  188. package/src/api-client-machine/models/sigma-cluster-ingest-config.ts +42 -42
  189. package/src/api-client-machine/models/sigma-cluster-origin-config.ts +30 -30
  190. package/src/api-client-machine/models/sigma-ingest-config-entity.ts +42 -42
  191. package/src/api-client-machine/models/sigma-ingest-config.ts +42 -42
  192. package/src/api-client-machine/models/sigma-origin-config-entity.ts +30 -30
  193. package/src/api-client-machine/models/sigma-origin-config.ts +30 -30
  194. package/src/api-client-machine/models/stats.ts +57 -57
  195. package/src/api-client-machine/models/status.ts +36 -36
  196. package/src/api-client-machine/models/stop-channel.ts +48 -48
  197. package/src/api-client-machine/models/transcoder-apps.ts +42 -42
  198. package/src/api-client-machine/models/transcoder-collection.ts +57 -57
  199. package/src/api-client-machine/models/transcoder-component-cluster.ts +42 -42
  200. package/src/api-client-machine/models/transcoder-license.ts +42 -42
  201. package/src/api-client-machine/models/transcoder-live-cluster.ts +42 -42
  202. package/src/api-client-machine/models/transcoder-live-to-component-cluster.ts +45 -45
  203. package/src/api-client-machine/models/transcoder-network.ts +42 -42
  204. package/src/api-client-machine/models/transcoder.ts +276 -276
  205. package/src/api-client-machine/models/update-app-config-dto-config-data.ts +33 -33
  206. package/src/api-client-machine/models/update-app-config-dto.ts +33 -33
  207. package/src/api-client-machine/models/update-app-config-of-sigma-vod-server-dto-config-data.ts +30 -30
  208. package/src/api-client-machine/models/update-app-config-of-sigma-vod-server-dto.ts +33 -33
  209. package/src/api-client-machine/models/update-component-cluster-dto.ts +72 -72
  210. package/src/api-client-machine/models/update-machine-cluster-dto.ts +63 -63
  211. package/src/api-client-machine/models/update-machine-dto.ts +42 -42
  212. package/src/api-client-machine/models/update-packager-live-cluster.ts +42 -42
  213. package/src/api-client-machine/models/update-packager-to-component-cluster.ts +51 -51
  214. package/src/api-client-machine/models/update-route-config-of-sigma-vod-server.ts +33 -33
  215. package/src/api-client-machine/models/update-route-config-sigma-machine.ts +42 -42
  216. package/src/api-client-machine/models/update-transcoder-live-cluster.ts +42 -42
  217. package/src/api-client-machine/models/update-transcoder-to-component-cluster.ts +45 -45
  218. package/src/api-client-machine/models/video-encoder.ts +56 -56
  219. package/src/api-client-machine/models/vodroute.ts +60 -60
  220. package/src/api-client-noti/.openapi-generator/FILES +13 -13
  221. package/src/api-client-noti/.openapi-generator-ignore +23 -23
  222. package/src/api-client-noti/api/notification-api.ts +386 -386
  223. package/src/api-client-noti/api.ts +18 -18
  224. package/src/api-client-noti/base.ts +72 -72
  225. package/src/api-client-noti/common.ts +150 -150
  226. package/src/api-client-noti/configuration.ts +101 -101
  227. package/src/api-client-noti/git_push.sh +57 -57
  228. package/src/api-client-noti/index.ts +18 -18
  229. package/src/api-client-noti/models/index.ts +2 -2
  230. package/src/api-client-noti/models/notification-collection.ts +57 -57
  231. package/src/api-client-noti/models/notification.ts +101 -101
  232. package/src/api-client-transcode/.openapi-generator/FILES +129 -129
  233. package/src/api-client-transcode/.openapi-generator-ignore +23 -23
  234. package/src/api-client-transcode/api/alert-logs-apiapi.ts +281 -281
  235. package/src/api-client-transcode/api/channel-package-inputs-apiapi.ts +650 -650
  236. package/src/api-client-transcode/api/channel-transcode-inputs-apiapi.ts +650 -650
  237. package/src/api-client-transcode/api/channels-crudapiapi.ts +869 -869
  238. package/src/api-client-transcode/api/channels-job-action-apiapi.ts +434 -434
  239. package/src/api-client-transcode/api/drm-credentials-api.ts +525 -525
  240. package/src/api-client-transcode/api/event-channel-action-apiapi.ts +363 -363
  241. package/src/api-client-transcode/api/event-channel-crudapiapi.ts +545 -545
  242. package/src/api-client-transcode/api/fast-channel-action-apiapi.ts +301 -301
  243. package/src/api-client-transcode/api/fast-channel-apiapi.ts +525 -525
  244. package/src/api-client-transcode/api/fast-channel-programs-api-api.ts +525 -525
  245. package/src/api-client-transcode/api/multi-channel-action-apiapi.ts +387 -387
  246. package/src/api-client-transcode/api/sigma-transcode-live-interactive-action-api.ts +152 -152
  247. package/src/api-client-transcode/api/single-channel-action-apiapi.ts +1155 -1155
  248. package/src/api-client-transcode/api/transcode-templates-apiapi.ts +541 -541
  249. package/src/api-client-transcode/api.ts +32 -32
  250. package/src/api-client-transcode/base.ts +71 -71
  251. package/src/api-client-transcode/common.ts +138 -138
  252. package/src/api-client-transcode/configuration.ts +101 -101
  253. package/src/api-client-transcode/git_push.sh +57 -57
  254. package/src/api-client-transcode/index.ts +18 -18
  255. package/src/api-client-transcode/models/ads-dto.ts +137 -137
  256. package/src/api-client-transcode/models/alert-log-collection.ts +55 -55
  257. package/src/api-client-transcode/models/audio-watermark-dto.ts +59 -59
  258. package/src/api-client-transcode/models/blackout-slate-dto.ts +36 -36
  259. package/src/api-client-transcode/models/catchup-dto.ts +43 -43
  260. package/src/api-client-transcode/models/channel-collection.ts +55 -55
  261. package/src/api-client-transcode/models/channel-config-advance-dto-info.ts +25 -25
  262. package/src/api-client-transcode/models/channel-config-advance-dto.ts +121 -121
  263. package/src/api-client-transcode/models/channel-config-advance-info-dto.ts +78 -78
  264. package/src/api-client-transcode/models/channel-config-base.ts +69 -69
  265. package/src/api-client-transcode/models/channel-config-blackout-entity.ts +36 -36
  266. package/src/api-client-transcode/models/channel-config-dto.ts +72 -72
  267. package/src/api-client-transcode/models/channel-config-interactive-entity.ts +30 -30
  268. package/src/api-client-transcode/models/channel-config-template-dto.ts +66 -66
  269. package/src/api-client-transcode/models/channel-detail-catchup-dto.ts +37 -37
  270. package/src/api-client-transcode/models/channel-detail-dto.ts +69 -69
  271. package/src/api-client-transcode/models/channel-detail-input.ts +43 -43
  272. package/src/api-client-transcode/models/channel-detail-package.ts +50 -50
  273. package/src/api-client-transcode/models/channel-detail-transcode.ts +37 -37
  274. package/src/api-client-transcode/models/channel-job-detail.ts +84 -84
  275. package/src/api-client-transcode/models/channel-stats.ts +36 -36
  276. package/src/api-client-transcode/models/channel-template-data-dto.ts +59 -59
  277. package/src/api-client-transcode/models/channel-template-dto-data.ts +28 -28
  278. package/src/api-client-transcode/models/channel-template-dto.ts +63 -63
  279. package/src/api-client-transcode/models/channel.ts +168 -168
  280. package/src/api-client-transcode/models/create-alert-log-dto.ts +138 -138
  281. package/src/api-client-transcode/models/create-channel-dto.ts +84 -84
  282. package/src/api-client-transcode/models/create-drm-credential-dto.ts +63 -63
  283. package/src/api-client-transcode/models/create-event-channel-dto-targets.ts +26 -26
  284. package/src/api-client-transcode/models/create-event-channel-dto.ts +76 -76
  285. package/src/api-client-transcode/models/create-fast-channel-dto.ts +42 -42
  286. package/src/api-client-transcode/models/create-fast-program-dto.ts +72 -72
  287. package/src/api-client-transcode/models/drm-credential-collection.ts +55 -55
  288. package/src/api-client-transcode/models/drm-credential-entity.ts +87 -87
  289. package/src/api-client-transcode/models/drm-data-dto.ts +54 -54
  290. package/src/api-client-transcode/models/drm-data-entity.ts +54 -54
  291. package/src/api-client-transcode/models/drm-dto.ts +103 -103
  292. package/src/api-client-transcode/models/event-channel-collection.ts +55 -55
  293. package/src/api-client-transcode/models/event-channel-config-dto.ts +78 -78
  294. package/src/api-client-transcode/models/event-channel-config-entity.ts +75 -75
  295. package/src/api-client-transcode/models/event-channel-input-dto.ts +45 -45
  296. package/src/api-client-transcode/models/event-channel-input-entity.ts +45 -45
  297. package/src/api-client-transcode/models/event-channel-transcoder-dto.ts +56 -56
  298. package/src/api-client-transcode/models/event-channel.ts +147 -147
  299. package/src/api-client-transcode/models/event-profile-dto.ts +62 -62
  300. package/src/api-client-transcode/models/event-target-data-dto.ts +95 -95
  301. package/src/api-client-transcode/models/event-target-dto.ts +49 -49
  302. package/src/api-client-transcode/models/fast-channel-collection.ts +55 -55
  303. package/src/api-client-transcode/models/fast-channel.ts +75 -75
  304. package/src/api-client-transcode/models/fast-program-collection.ts +55 -55
  305. package/src/api-client-transcode/models/fast-program.ts +84 -84
  306. package/src/api-client-transcode/models/fingerprint-dto.ts +42 -42
  307. package/src/api-client-transcode/models/index.ts +104 -104
  308. package/src/api-client-transcode/models/input-collection.ts +55 -55
  309. package/src/api-client-transcode/models/input-data-dto.ts +104 -104
  310. package/src/api-client-transcode/models/input-data-item-dto.ts +42 -42
  311. package/src/api-client-transcode/models/input-dto.ts +30 -30
  312. package/src/api-client-transcode/models/input-entity.ts +30 -30
  313. package/src/api-client-transcode/models/input-info-response.ts +31 -31
  314. package/src/api-client-transcode/models/input-info.ts +123 -123
  315. package/src/api-client-transcode/models/input-machine-config.ts +45 -45
  316. package/src/api-client-transcode/models/input-program.ts +66 -66
  317. package/src/api-client-transcode/models/interactive-dto.ts +30 -30
  318. package/src/api-client-transcode/models/interactive-publish-dto.ts +30 -30
  319. package/src/api-client-transcode/models/job-entity.ts +102 -102
  320. package/src/api-client-transcode/models/low-latency-dto.ts +68 -68
  321. package/src/api-client-transcode/models/machine-config-dto.ts +75 -75
  322. package/src/api-client-transcode/models/main-input-dto.ts +62 -62
  323. package/src/api-client-transcode/models/main-input-entity.ts +54 -54
  324. package/src/api-client-transcode/models/maintenance-dto.ts +30 -30
  325. package/src/api-client-transcode/models/manifest-dto.ts +62 -62
  326. package/src/api-client-transcode/models/package-input-collection.ts +55 -55
  327. package/src/api-client-transcode/models/package-input-data-dto.ts +99 -99
  328. package/src/api-client-transcode/models/package-input-list.ts +36 -36
  329. package/src/api-client-transcode/models/package-input.ts +115 -115
  330. package/src/api-client-transcode/models/post-input-dto.ts +48 -48
  331. package/src/api-client-transcode/models/post-input-entity.ts +48 -48
  332. package/src/api-client-transcode/models/pre-input-dto.ts +54 -54
  333. package/src/api-client-transcode/models/pre-input-entity.ts +54 -54
  334. package/src/api-client-transcode/models/preset-dto.ts +247 -247
  335. package/src/api-client-transcode/models/profile-default-response-dto.ts +30 -30
  336. package/src/api-client-transcode/models/profile-dto.ts +62 -62
  337. package/src/api-client-transcode/models/profile-entity.ts +60 -60
  338. package/src/api-client-transcode/models/scte35-dto.ts +36 -36
  339. package/src/api-client-transcode/models/start-over-dto.ts +30 -30
  340. package/src/api-client-transcode/models/switch-input-dto.ts +56 -56
  341. package/src/api-client-transcode/models/switch-input-entity.ts +44 -44
  342. package/src/api-client-transcode/models/target-data-dto.ts +101 -101
  343. package/src/api-client-transcode/models/target-dto.ts +44 -44
  344. package/src/api-client-transcode/models/target-entity.ts +55 -55
  345. package/src/api-client-transcode/models/target-profile-dto.ts +71 -71
  346. package/src/api-client-transcode/models/target-profile.ts +71 -71
  347. package/src/api-client-transcode/models/target-template-dto.ts +44 -44
  348. package/src/api-client-transcode/models/target-update-dto.ts +50 -50
  349. package/src/api-client-transcode/models/transcode-input.ts +144 -144
  350. package/src/api-client-transcode/models/transcoder.ts +36 -36
  351. package/src/api-client-transcode/models/trick-play-dto.ts +54 -54
  352. package/src/api-client-transcode/models/update-channel-dto-targets.ts +27 -27
  353. package/src/api-client-transcode/models/update-channel-dto.ts +84 -84
  354. package/src/api-client-transcode/models/update-drm-management-dto.ts +63 -63
  355. package/src/api-client-transcode/models/update-event-channel-dto.ts +76 -76
  356. package/src/api-client-transcode/models/update-fast-channel-dto.ts +42 -42
  357. package/src/api-client-transcode/models/update-fast-program-dto.ts +30 -30
  358. package/src/api-client-transcode/models/watermark-dto.ts +66 -66
  359. package/src/api-client-transcode/models/watermark-entity.ts +102 -102
  360. package/src/app/spa-loading-template.html +127 -127
  361. package/src/app.config.ts +2 -2
  362. package/src/assets/global.css.ts +3 -3
  363. package/src/assets/scss/element/dark.scss +13 -13
  364. package/src/assets/scss/element/index.scss +26 -26
  365. package/src/assets/scss/index.scss +180 -180
  366. package/src/components/AdvancedFilter/SSAdvancedFilterItem.vue +180 -180
  367. package/src/components/AdvancedFilter/SSAdvancedFilterItemCustom.vue +165 -165
  368. package/src/components/AdvancedFilter/SSAdvancedFilterItemDefined.vue +298 -298
  369. package/src/components/AdvancedFilter/SSAdvancedFilterItemSchedule.vue +293 -293
  370. package/src/components/AdvancedFilter/SSAdvancedFilterMain.vue +196 -196
  371. package/src/components/AdvancedFilter/types.ts +37 -37
  372. package/src/components/AdvancedFilterReport/SSAdvancedFilterReportItem.vue +110 -110
  373. package/src/components/AdvancedFilterReport/SSAdvancedFilterReportItemDefined.vue +159 -159
  374. package/src/components/AdvancedFilterReport/SSAdvancedFilterReportMain.vue +197 -197
  375. package/src/components/AdvancedFilterReport/types.ts +19 -19
  376. package/src/components/AdvancedFilterSsai/SSAdvancedFilterSsaiItem.vue +102 -102
  377. package/src/components/AdvancedFilterSsai/SSAdvancedFilterSsaiItemDefined.vue +119 -119
  378. package/src/components/AdvancedFilterSsai/SSAdvancedFilterSsaiMain.vue +194 -194
  379. package/src/components/AdvancedFilterSsai/types.ts +19 -19
  380. package/src/components/Asset/AssetAddPlaylist.vue +169 -169
  381. package/src/components/Asset/AssetExtra.vue +46 -46
  382. package/src/components/Asset/AssetImportLinks.vue +281 -281
  383. package/src/components/Asset/AssetInfiniteSelect.vue +62 -62
  384. package/src/components/Asset/AssetItem.vue +194 -194
  385. package/src/components/Asset/AssetItemPreview.vue +117 -117
  386. package/src/components/Asset/AssetList.vue +869 -869
  387. package/src/components/Asset/AssetMeta.vue +97 -97
  388. package/src/components/Asset/AssetPicker.vue +204 -204
  389. package/src/components/Asset/AssetPlaylist.vue +414 -414
  390. package/src/components/Asset/AssetPlaylistInfiniteSelect.vue +136 -136
  391. package/src/components/Asset/AssetPlaylistModalAdd.vue +138 -138
  392. package/src/components/Asset/AssetPreview.vue +89 -89
  393. package/src/components/Asset/AssetShareModal.vue +131 -131
  394. package/src/components/Asset/AssetTable.vue +365 -365
  395. package/src/components/Asset/FormUploadAsset.vue +647 -647
  396. package/src/components/Asset/FormUploadAssetItem.vue +115 -115
  397. package/src/components/Asset/FormUploadAssetProgress.vue +161 -161
  398. package/src/components/Asset/Scrubber.vue +57 -57
  399. package/src/components/Asset/VideoPlayer.vue +226 -226
  400. package/src/components/Asset/VideoPreview.vue +102 -102
  401. package/src/components/Asset/VideoPreviewConfig.vue +329 -329
  402. package/src/components/Asset/VideoPreviewConfigMessage.vue +120 -120
  403. package/src/components/Asset/VideoPreviewConfigVod.vue +287 -287
  404. package/src/components/Asset/VideoPreviewNew.vue +66 -66
  405. package/src/components/Asset/VideoPreviewNewLoader.vue +144 -144
  406. package/src/components/Asset/VideoPreviewWrapper.vue +208 -208
  407. package/src/components/Asset/asset-context.ts +24 -24
  408. package/src/components/Asset/usePickerStore.ts +55 -55
  409. package/src/components/AuthLayout/AuthLayoutSimple.vue +150 -150
  410. package/src/components/AuthLayout/index.vue +151 -151
  411. package/src/components/AutoRefresh/AutoRefresh.vue +91 -91
  412. package/src/components/AutoRefresh/AutoRefreshOld.vue +87 -87
  413. package/src/components/AutoRefresh/useRefresh.ts +93 -93
  414. package/src/components/BackButton.vue +13 -13
  415. package/src/components/Card/CardInfo.vue +21 -21
  416. package/src/components/Channel/AIConfig.vue +101 -101
  417. package/src/components/Channel/AdvancedForm.vue +542 -542
  418. package/src/components/Channel/ChannelListGrid.vue +154 -154
  419. package/src/components/Channel/ConfigBlackout.vue +98 -98
  420. package/src/components/Channel/ConfigCensorship.vue +387 -387
  421. package/src/components/Channel/ConfigForensicWatermark.vue +152 -152
  422. package/src/components/Channel/ConfigForm.vue +102 -102
  423. package/src/components/Channel/ConfigInformation.vue +191 -191
  424. package/src/components/Channel/ConfigInteraction.vue +11 -11
  425. package/src/components/Channel/ConfigNameModifier.vue +15 -15
  426. package/src/components/Channel/ConfigOptionItem.vue +114 -114
  427. package/src/components/Channel/ConfigOptions.vue +181 -181
  428. package/src/components/Channel/ConfigPte.vue +368 -368
  429. package/src/components/Channel/ConfigScte.vue +442 -442
  430. package/src/components/Channel/ConfigTranscoder.vue +353 -353
  431. package/src/components/Channel/ConfigWaterMarkAudio.vue +52 -52
  432. package/src/components/Channel/ConfigWatermark.vue +76 -76
  433. package/src/components/Channel/ConfigWatermarkEventChannel.vue +86 -86
  434. package/src/components/Channel/ConfigWatermarkItem.vue +239 -239
  435. package/src/components/Channel/HeaderItem.vue +75 -75
  436. package/src/components/Channel/InputDetail.vue +68 -68
  437. package/src/components/Channel/InputForm.vue +175 -175
  438. package/src/components/Channel/InputList.vue +38 -38
  439. package/src/components/Channel/InputPackageDetail.vue +125 -125
  440. package/src/components/Channel/MediaProfileFormModal.vue +79 -79
  441. package/src/components/Channel/MediaProfileModify.vue +229 -229
  442. package/src/components/Channel/MessageButtonGetHelp.vue +30 -30
  443. package/src/components/Channel/MessageTooltipAi.vue +29 -29
  444. package/src/components/Channel/MultipleSelectProfile.vue +312 -312
  445. package/src/components/Channel/PackageInputItem.vue +13 -13
  446. package/src/components/Channel/PresetConfigItem.vue +1957 -1957
  447. package/src/components/Channel/PresetConfigItemExtra.vue +59 -59
  448. package/src/components/Channel/PresetConfigItemPId.vue +145 -145
  449. package/src/components/Channel/ProfileConfigItem.vue +829 -829
  450. package/src/components/Channel/ProfileDetailsList.vue +160 -160
  451. package/src/components/Channel/ProfileForm.vue +134 -134
  452. package/src/components/Channel/ProfileList.vue +228 -228
  453. package/src/components/Channel/SelectServer.vue +134 -134
  454. package/src/components/Channel/SignalLoss.vue +92 -92
  455. package/src/components/Channel/SwitchInputButton.vue +38 -38
  456. package/src/components/Channel/TargetCatchup.vue +75 -75
  457. package/src/components/Channel/TargetDataInfo.vue +100 -100
  458. package/src/components/Channel/TargetDestination.vue +375 -375
  459. package/src/components/Channel/TargetDrm.vue +518 -518
  460. package/src/components/Channel/TargetForm.vue +136 -136
  461. package/src/components/Channel/TargetList.vue +159 -159
  462. package/src/components/Channel/TargetLowLatency.vue +107 -107
  463. package/src/components/Channel/TargetMabrOutput.vue +58 -58
  464. package/src/components/Channel/TargetMabrOutputItem.vue +91 -91
  465. package/src/components/Channel/TargetManifest.vue +94 -94
  466. package/src/components/Channel/TargetNetworkInterface.vue +95 -95
  467. package/src/components/Channel/TargetOutputMultiplex.vue +237 -237
  468. package/src/components/Channel/TargetOutputType.vue +201 -201
  469. package/src/components/Channel/TargetOutputUdp.vue +200 -200
  470. package/src/components/Channel/TargetPreset.vue +541 -541
  471. package/src/components/Channel/TargetProfileAudioGroup.vue +27 -27
  472. package/src/components/Channel/TargetProfileProgram.vue +43 -43
  473. package/src/components/Channel/TargetProfileURI.vue +68 -68
  474. package/src/components/Channel/TargetSrtOutput.vue +35 -35
  475. package/src/components/Channel/TargetSrtOutputItem.vue +83 -83
  476. package/src/components/Channel/TargetStartover.vue +40 -40
  477. package/src/components/Channel/WarningName.vue +39 -39
  478. package/src/components/Channel/WarningOutput.vue +40 -40
  479. package/src/components/CollapseTagsTooltip/CollapseTagsTooltip.vue +87 -87
  480. package/src/components/CollapseTagsTooltip/index.ts +1 -1
  481. package/src/components/CopyButton.vue +46 -46
  482. package/src/components/CopyText.vue +40 -40
  483. package/src/components/CopyTextButton.vue +40 -40
  484. package/src/components/DefaultLayout/DefaultLayout.vue +134 -134
  485. package/src/components/DefaultLayout/GlobalASide.vue +75 -75
  486. package/src/components/DefaultLayout/GlobalFooter.vue +15 -15
  487. package/src/components/DefaultLayout/GlobalHeader.vue +43 -43
  488. package/src/components/DefaultLayout/Logo.vue +35 -35
  489. package/src/components/DefaultLayout/Menu.vue +464 -464
  490. package/src/components/DefaultLayout/RightMenu.vue +93 -93
  491. package/src/components/DialogWarningAddLicense.vue +37 -37
  492. package/src/components/Epg/Epg.vue +24 -24
  493. package/src/components/Epg/components/Channel.vue +28 -28
  494. package/src/components/Epg/components/Channels.vue +33 -33
  495. package/src/components/Epg/components/Layout.vue +121 -121
  496. package/src/components/Epg/components/Line.vue +41 -41
  497. package/src/components/Epg/components/Loader.vue +23 -23
  498. package/src/components/Epg/components/Program.vue +101 -101
  499. package/src/components/Epg/components/SideBar.vue +18 -18
  500. package/src/components/Epg/components/Timeline.vue +72 -72
  501. package/src/components/Epg/helpers/common.ts +68 -68
  502. package/src/components/Epg/helpers/epg.ts +192 -192
  503. package/src/components/Epg/helpers/index.ts +5 -5
  504. package/src/components/Epg/helpers/interfaces.ts +54 -54
  505. package/src/components/Epg/helpers/time.ts +51 -51
  506. package/src/components/Epg/helpers/types.ts +26 -26
  507. package/src/components/Epg/helpers/variables.ts +33 -33
  508. package/src/components/Epg/hooks/index.ts +2 -2
  509. package/src/components/Epg/hooks/useEpg.ts +160 -160
  510. package/src/components/Epg/hooks/useLayout.ts +187 -187
  511. package/src/components/Epg/hooks/useProgram.ts +63 -63
  512. package/src/components/Epg/hooks/useTimeline.ts +35 -35
  513. package/src/components/Epg/index.ts +4 -4
  514. package/src/components/Epg/store.ts +85 -85
  515. package/src/components/Epg/theme.ts +44 -44
  516. package/src/components/Exception/403.vue +58 -58
  517. package/src/components/Exception/404.vue +59 -59
  518. package/src/components/Exception/500.vue +39 -39
  519. package/src/components/Exception/index.scss +30 -30
  520. package/src/components/Field.vue +193 -193
  521. package/src/components/FilterQuerySchema/FilterQuerySchemaForm.vue +200 -200
  522. package/src/components/FilterQuerySchema/QueryTag.vue +109 -109
  523. package/src/components/FilterQuerySchema/Tag.vue +68 -68
  524. package/src/components/FilterTimeDimensions.vue +265 -265
  525. package/src/components/FilterTimeDimensionsSingle.vue +214 -214
  526. package/src/components/HelpPanel.vue +87 -87
  527. package/src/components/HexagonPro.vue +7 -7
  528. package/src/components/IconCopyButton.vue +43 -43
  529. package/src/components/InformationLabel.vue +67 -67
  530. package/src/components/Input/InputTags.vue +136 -136
  531. package/src/components/Input/index.ts +1 -1
  532. package/src/components/MainDefaultLayout/index.vue +120 -120
  533. package/src/components/NoticeAddLicense.vue +20 -20
  534. package/src/components/NoticeRunningOutResources.vue +20 -20
  535. package/src/components/Pagination.vue +61 -61
  536. package/src/components/QueryBuilder/components/inputs/DateInputField.vue +105 -105
  537. package/src/components/QueryBuilder/components/inputs/FieldSelect.vue +44 -44
  538. package/src/components/QueryBuilder/components/inputs/InputMultiSelect.vue +60 -60
  539. package/src/components/QueryBuilder/components/inputs/InputSelect.vue +39 -39
  540. package/src/components/QueryBuilder/components/inputs/NumberInputField.vue +91 -91
  541. package/src/components/QueryBuilder/components/inputs/OperatorSelect.vue +59 -59
  542. package/src/components/QueryBuilder/components/inputs/TextInput.vue +40 -40
  543. package/src/components/QueryBuilder/components/inputs/TimeInputField.vue +114 -114
  544. package/src/components/QueryBuilder/components/inputs/logics.ts +27 -27
  545. package/src/components/QueryBuilder/components/item/InputMultiOptions.vue +56 -56
  546. package/src/components/QueryBuilder/components/item/QueryRule.vue +233 -233
  547. package/src/components/QueryBuilder/useConfigStore.ts +27 -27
  548. package/src/components/QueryBuilder/utils/config.ts +194 -194
  549. package/src/components/QueryBuilder/utils/rules.ts +213 -213
  550. package/src/components/RecommendedConfigurationPTE.vue +238 -238
  551. package/src/components/Server/MachineConfig.vue +333 -333
  552. package/src/components/Server/ServerConfig.vue +599 -599
  553. package/src/components/Server/useQueryMachine.ts +380 -380
  554. package/src/components/Server/validator.ts +13 -13
  555. package/src/components/SwitchDark.vue +19 -19
  556. package/src/components/SwitchLang.vue +31 -31
  557. package/src/components/TableEmpty.vue +50 -50
  558. package/src/components/Toast/ToastNoti.vue +52 -52
  559. package/src/components/Tool/ForensicWatermarkingDialog.vue +39 -39
  560. package/src/components/Tool/FormRecord.vue +162 -162
  561. package/src/components/Tool/FormUpload.vue +118 -118
  562. package/src/components/Tool/ResultChecking.vue +103 -103
  563. package/src/components/Tool/Watermarking.vue +159 -159
  564. package/src/components/Tool/record.js +92 -92
  565. package/src/components/Tooltip/Ellipsis.vue +52 -52
  566. package/src/components/Tooltip/index.vue +47 -47
  567. package/src/components/app/AppList.vue +50 -50
  568. package/src/components/button/Button.vue +27 -27
  569. package/src/components/button/index.ts +37 -37
  570. package/src/components/context-menu/ContextMenu.vue +15 -15
  571. package/src/components/context-menu/ContextMenuCheckboxItem.vue +39 -39
  572. package/src/components/context-menu/ContextMenuContent.vue +35 -35
  573. package/src/components/context-menu/ContextMenuGroup.vue +11 -11
  574. package/src/components/context-menu/ContextMenuItem.vue +33 -33
  575. package/src/components/context-menu/ContextMenuLabel.vue +24 -24
  576. package/src/components/context-menu/ContextMenuPortal.vue +11 -11
  577. package/src/components/context-menu/ContextMenuRadioGroup.vue +19 -19
  578. package/src/components/context-menu/ContextMenuRadioItem.vue +39 -39
  579. package/src/components/context-menu/ContextMenuSeparator.vue +19 -19
  580. package/src/components/context-menu/ContextMenuShortcut.vue +13 -13
  581. package/src/components/context-menu/ContextMenuSub.vue +19 -19
  582. package/src/components/context-menu/ContextMenuSubContent.vue +34 -34
  583. package/src/components/context-menu/ContextMenuSubTrigger.vue +33 -33
  584. package/src/components/context-menu/ContextMenuTrigger.vue +13 -13
  585. package/src/components/context-menu/index.ts +14 -14
  586. package/src/components/dashboard/SSDashboard.vue +82 -0
  587. package/src/components/dashboard/SSDashboardChartRoot.vue +18 -18
  588. package/src/components/dashboard/SSDashboardDocument.vue +45 -45
  589. package/src/components/dashboard/SSDashboardEmpty.vue +16 -16
  590. package/src/components/dashboard/SSDashboardGuideline.vue +45 -45
  591. package/src/components/dashboard/SSDashboardInfo.vue +36 -36
  592. package/src/components/dashboard/SSDashboardInfoRoot.vue +9 -9
  593. package/src/components/dashboard/SSDashboardInfoTime.vue +38 -38
  594. package/src/components/markdown/Markdown.vue +295 -295
  595. package/src/components/tabs/Tabs.vue +15 -15
  596. package/src/components/tabs/TabsContent.vue +22 -22
  597. package/src/components/tabs/TabsList.vue +22 -22
  598. package/src/components/tabs/TabsTrigger.vue +26 -26
  599. package/src/composables/asset.ts +13 -13
  600. package/src/composables/channel.ts +333 -333
  601. package/src/composables/country.ts +788 -788
  602. package/src/composables/error.ts +24 -24
  603. package/src/composables/form.ts +351 -351
  604. package/src/composables/getBuildTime.ts +7 -7
  605. package/src/composables/micro.ts +113 -113
  606. package/src/composables/microState.ts +22 -22
  607. package/src/composables/notiGlobal.ts +18 -18
  608. package/src/composables/plan.ts +162 -162
  609. package/src/composables/refReset.ts +12 -12
  610. package/src/composables/resetInfiniteQueryPagination.ts +18 -18
  611. package/src/composables/route.ts +19 -19
  612. package/src/composables/toast.ts +21 -21
  613. package/src/composables/useApp.ts +6 -6
  614. package/src/composables/useAsyncSchema.ts +58 -58
  615. package/src/composables/useChannelActions.ts +151 -151
  616. package/src/composables/useComplexSearchParam.ts +293 -293
  617. package/src/composables/useFilterSchema.ts +105 -105
  618. package/src/composables/useGetInputDetail.ts +36 -36
  619. package/src/composables/useGetServerAddLicense.ts +21 -21
  620. package/src/composables/useJobPreview.ts +438 -438
  621. package/src/composables/useLayoutStore.ts +106 -106
  622. package/src/composables/usePermission.ts +5 -5
  623. package/src/composables/usePickerStore.ts +53 -53
  624. package/src/composables/useQueryAssets.ts +56 -56
  625. package/src/composables/useQueryParams.ts +20 -20
  626. package/src/composables/useRouteParams.ts +36 -36
  627. package/src/composables/useRouteQueries.ts +54 -54
  628. package/src/composables/useRouterHistory.ts +76 -76
  629. package/src/composables/useSearchQuery.ts +27 -27
  630. package/src/composables/useTooltipEllipsis.ts +12 -12
  631. package/src/constants/env.ts +12 -12
  632. package/src/constants/filterable.ts +32 -32
  633. package/src/constants/languageCode.ts +185 -185
  634. package/src/constants/micro.ts +1 -1
  635. package/src/constants/queryKeys.ts +11 -11
  636. package/src/constants/regex.ts +8 -8
  637. package/src/constants/storage.ts +42 -42
  638. package/src/enums/index.ts +24 -24
  639. package/src/layouts/empty.vue +7 -7
  640. package/src/modules/api-party/kit.ts +30 -30
  641. package/src/modules/api-party/module.ts +259 -259
  642. package/src/modules/api-party/openapi.ts +74 -74
  643. package/src/modules/api-party/runtime/composables/$api.ts +157 -157
  644. package/src/modules/api-party/runtime/composables/useApiData.ts +229 -229
  645. package/src/modules/api-party/runtime/constants.ts +1 -1
  646. package/src/modules/api-party/runtime/formData.ts +85 -85
  647. package/src/modules/api-party/runtime/server/$api.ts +29 -29
  648. package/src/modules/api-party/runtime/server/handler.ts +92 -92
  649. package/src/modules/api-party/runtime/types.ts +97 -97
  650. package/src/modules/api-party/runtime/utils.ts +43 -43
  651. package/src/pages/403.vue +11 -11
  652. package/src/pages/500.vue +11 -11
  653. package/src/pages/[...all].vue +11 -11
  654. package/src/pages/login.vue +67 -67
  655. package/src/plugins/auth.ts +10 -10
  656. package/src/plugins/build-time.ts +5 -5
  657. package/src/plugins/dayjs.ts +13 -13
  658. package/src/plugins/i18n.ts +6 -6
  659. package/src/plugins/router.ts +6 -6
  660. package/src/plugins/vue-json-pretty.ts +5 -5
  661. package/src/plugins/vue-query.ts +41 -41
  662. package/src/plugins/wujie.ts +19 -19
  663. package/src/public/audio-recorder.js +30 -30
  664. package/src/public/nuxt.svg +3 -3
  665. package/src/public/robots.txt +2 -2
  666. package/src/pwa/config.ts +61 -61
  667. package/src/pwa/index.ts +194 -194
  668. package/src/pwa/runtime/VitePwaManifest.ts +33 -33
  669. package/src/pwa/types.ts +56 -56
  670. package/src/pwa/utils.ts +16 -16
  671. package/src/schemas/authServiceApi.json +6708 -6708
  672. package/src/schemas/billingApi.json +1082 -1082
  673. package/src/schemas/chatApi.json +496 -496
  674. package/src/schemas/libraryApi.json +2008 -2008
  675. package/src/schemas/licenseApi.json +771 -771
  676. package/src/schemas/livestreamApi.json +3353 -3353
  677. package/src/schemas/lrmApi.json +2847 -2847
  678. package/src/schemas/machineApi.json +4603 -4603
  679. package/src/schemas/metricApi.json +140 -140
  680. package/src/schemas/playoutApi.json +8314 -8314
  681. package/src/schemas/ssaiApi.json +1107 -1107
  682. package/src/schemas/transcodeApi.json +9669 -9669
  683. package/src/schemas/vastControlApi.json +960 -960
  684. package/src/schemas/vodApi.json +3973 -3973
  685. package/src/server/plugins/loading.css +111 -111
  686. package/src/server/plugins/loading.html +12 -12
  687. package/src/server/plugins/loading.ts +134 -134
  688. package/src/templates/pwa.client.ts +135 -135
  689. package/src/utils/$apiOptions.ts +80 -80
  690. package/src/utils/app.ts +23 -23
  691. package/src/utils/cn.ts +3 -3
  692. package/src/utils/env.ts +11 -11
  693. package/src/utils/filterable.ts +32 -32
  694. package/src/utils/format.ts +88 -88
  695. package/src/utils/gen-routes.ts +100 -100
  696. package/src/utils/helper.ts +56 -56
  697. package/src/utils/languageCode.ts +185 -185
  698. package/src/utils/micro.ts +208 -208
  699. package/src/utils/popoverSelectAttrs.ts +24 -24
  700. package/src/utils/popup.ts +96 -96
  701. package/src/utils/pwa.ts +86 -86
  702. package/src/utils/query-filter.ts +111 -111
  703. package/src/utils/queryKeys.ts +11 -11
  704. package/src/utils/regex.ts +8 -8
  705. package/src/utils/storage.ts +42 -42
  706. package/src/utils/table.ts +35 -35
  707. package/src/utils/tryCatch.ts +25 -25
  708. package/src/utils/utils.ts +58 -58
  709. package/src/utils/validator.ts +185 -185
  710. package/src/utils/videojs.ts +490 -490
  711. package/src/utils/wujie.ts +1 -1
  712. package/tsconfig.json +3 -3
  713. package/uno.config.ts +375 -375
  714. package/src/public/build-time.json +0 -1
@@ -1,1957 +1,1957 @@
1
- <script lang="ts" setup>
2
- import { langOptions } from '../../constants/languageCode'
3
-
4
- const { schemaObj } = useAsyncSchema('/api/transcode/api-docs-json', 'CreatePresetDto')
5
- const { schemaObj: schemaSCTE35 } = useAsyncSchema('/api/transcode/api-docs-json', 'PresetScte35OverwriteDto')
6
-
7
- const { defaultMediaType, isPackage, prop, encoderOptions, videoCodecs, mode, isConfigEncoder, isShowType, scte35 } = definePropsRefs<{
8
- defaultMediaType?: 'video' | 'audio' | 'data'
9
- isPackage?: boolean
10
- prop?: string
11
- videoCodecs?: Record<string, string>
12
- encoderOptions?: any
13
- mode?: 'create' | 'edit' | 'clone'
14
- isConfigEncoder?: boolean
15
- isShowType?: boolean
16
- scte35?: boolean
17
- }>()
18
-
19
- const { t } = useI18n()
20
- const { formRef } = useElFormContext()
21
-
22
- function getProp(key: string) {
23
- return () => prop.value ? `${prop.value}.${key}` : key
24
- }
25
-
26
- const encoderIdValue = ref(inject('encoderIdValue'))
27
- const mappingEncoder = {
28
- open_h264: 'OpenH264',
29
- open_hevc: 'OpenHEVC',
30
- nvenc: 'NVENC',
31
- passthrough: 'Passthrough',
32
- }
33
-
34
- const triggerAction = ref(inject('triggerAction'))
35
- const optionsEncoder = computed(() => {
36
- if (encoderOptions.value) {
37
- return encoderOptions.value
38
- }
39
- const value = encoderIdValue.value
40
-
41
- // TH1: encoderIdValue === -1
42
- if ((value === -1 || value === 'cpu') && triggerAction.value !== 'edit') {
43
- return [
44
- { label: 'OpenH264', value: 'open_h264' },
45
- { label: 'OpenHEVC', value: 'open_hevc' },
46
- { label: 'Passthrough', value: 'passthrough' },
47
- ]
48
- }
49
-
50
- // TH2: encoderIdValue là null, undefined, '' hoặc bất kỳ giá trị nào khác
51
- if (value === null || value === undefined || value === '' || triggerAction.value === 'edit') {
52
- return [
53
- { label: 'OpenH264', value: 'open_h264' },
54
- { label: 'OpenHEVC', value: 'open_hevc' },
55
- { label: 'NVENC', value: 'nvenc' },
56
- // { label: 'Aurora4', value: 'aurora4' },
57
- { label: 'Passthrough', value: 'passthrough' },
58
- ]
59
- }
60
-
61
- // Mặc định cho các giá trị khác (ví dụ: 0, 1, 2, 3,...)
62
- return [
63
- { label: 'NVENC', value: 'nvenc' },
64
- { label: 'Passthrough', value: 'passthrough' },
65
- ]
66
- })
67
-
68
- function findFirstMatchingEncoder(options) {
69
- return options?.find(item =>
70
- optionsEncoder.value?.some(option => option.value === item),
71
- )
72
- }
73
-
74
- const profilesValue = ref(inject('profilesValue'))
75
- function areAllEncoderTypesSame(profiles, newEncoderType?: string) {
76
- const encoderTypes = newEncoderType ? [newEncoderType] : []
77
-
78
- for (const profile of profiles) {
79
- for (const preset of profile.presets || []) {
80
- if (preset.encoderType)
81
- encoderTypes.push(preset.encoderType)
82
- }
83
- }
84
-
85
- if (encoderTypes.length === 0)
86
- return true
87
-
88
- return encoderTypes?.filter(Boolean)?.every(type => type === encoderTypes[0])
89
- }
90
-
91
- const isVisibleRecommend = ref(false)
92
- const [typeValue, typeAttrs] = useElField<string>(getProp('type'), [
93
- {
94
- required: true,
95
- message: t('library_preset.type_is_required'),
96
- },
97
- ])
98
- const [encoderValue, encoderAttrs] = useElField<string | undefined>(getProp('encoderType'), [
99
- {
100
- required: true,
101
- trigger: ['blur', 'change'],
102
- validator: (_rule, value: string, callback: any) => {
103
- const encoderTypes = profilesValue.value?.flatMap(profile =>
104
- (profile.presets || []).map(preset => preset.encoderType),
105
- )
106
- const commonEncoder = findFirstMatchingEncoder(encoderTypes)
107
-
108
- if (!value || value.trim().length === 0) {
109
- callback(new Error(t('library_preset.preset_encoder_is_required')))
110
- }
111
- else if (!optionsEncoder.value.some(option => option.value === value)) {
112
- callback(new Error(t('base_library.encoder_not_supported_please_select_encoder_again')))
113
- }
114
- else if (profilesValue.value && triggerAction.value !== 'edit' && value !== commonEncoder && !areAllEncoderTypesSame(profilesValue.value, value)) {
115
- if (commonEncoder && encoderTypes.length > 0)
116
- callback(new Error(t('base_libray.all_profiles_must_have_the_same_video_encoder_data_please_proceed_with_data_sync', [mappingEncoder[commonEncoder] ? `, ${$t('base_library.currently_is')} ${mappingEncoder[commonEncoder]}` : ''])))
117
- else
118
- callback(new Error($t('base_library.the_encoder_of_the_profile_that_was_previously_created_or_taken_from_the_template_is_not_supported_please_re-select_a_valid_encoder_outside_the_channel_configuration')))
119
- }
120
- else {
121
- callback()
122
- }
123
- callback()
124
- },
125
- },
126
- ])
127
- const [presetValue, presetAttrs] = useElField<string | undefined>(getProp('videoPreset'), [
128
- {
129
- required: true,
130
- message: t('library_preset.preset_is_required'),
131
- },
132
- ])
133
- const [nameValue, nameAttrs] = useElField<string>(getProp('name'), [
134
- {
135
- required: true,
136
- validator: nameValidatorLow(t('library_preset.name')),
137
- trigger: ['blur', 'change'],
138
- },
139
- ])
140
- const [groupIdValue, groupIdAttrs] = useElField<string>(getProp('audioGroup'), [
141
- {
142
- validator: (rule, value, callback) => {
143
- if (!/^[\w-\s]*$/.test(value))
144
- callback(new Error(t('library_preset.group_id')))
145
- else
146
- callback()
147
- },
148
- trigger: ['blur', 'change'],
149
- },
150
- ])
151
- const [defaultPTEValue, defaultPTEAttrs] = useElField(getProp('pteEnabled'), [])
152
- const [vmafMaxValue, vmafMaxAttrs] = useElField(getProp('vmafMax'), [
153
- {
154
- trigger: ['blur', 'change'],
155
- required: true,
156
- validator: (rule, value, callback) => {
157
- if (!value)
158
- callback(new Error(t('base_libarry.please_input_vmafmax')))
159
- else if (value < 89 || value > 96)
160
- callback(new Error(t('base_library.vmafmax_must_not_be_less_than_89_and_greater_than_96')))
161
- else
162
- callback()
163
- },
164
- },
165
- ], { enabled: defaultPTEValue })
166
- const [vmafMinValue, vmafMinAttrs] = useElField(getProp('vmafMin'), [
167
- {
168
- trigger: ['blur', 'change'],
169
- required: true,
170
- validator: (rule, value, callback) => {
171
- if (!value)
172
- callback(new Error(t('base_libarry.please_input_vmafmin')))
173
- else if (value < 89 || value > 96)
174
- callback(new Error(t('base_library.vmafmin_must_not_be_less_than_89_and_greater_than_96')))
175
- else
176
- callback()
177
- },
178
- },
179
- ], { enabled: defaultPTEValue })
180
- const [vmafThresValue, vmafThresAttrs] = useElField(getProp('vmafThres'), [
181
- {
182
- required: true,
183
- validator: (rule, value, callback) => {
184
- if (!value)
185
- callback(new Error(t('base_libarry.please_input_vmafthres')))
186
- else
187
- callback()
188
- },
189
- trigger: ['blur', 'change'],
190
- },
191
- ], { enabled: defaultPTEValue })
192
-
193
- const [videoCodecValue, videoCodecAttrs] = useElField<string | undefined>(getProp('videoCodec'), [
194
- {
195
- validator: (rule, value, callback) => {
196
- if (!value)
197
- callback(new Error(t('please_select_codec')))
198
- else
199
- callback()
200
- },
201
- trigger: ['blur', 'change'],
202
- required: true,
203
- },
204
- ])
205
- const [audioCodecValue, audioCodecAttrs] = useElField<string | undefined>(getProp('audioCodec'), [
206
- {
207
- validator: (rule, value, callback) => {
208
- if (!value)
209
- callback(new Error(t('please_select_codec')))
210
- else
211
- callback()
212
- },
213
- trigger: ['blur', 'change'],
214
- required: true,
215
- },
216
- ])
217
- const [dataCodecValue, dataCodecAttrs] = useElField<string | undefined>(getProp('dataCodec'), [
218
- {
219
- validator: (rule, value, callback) => {
220
- if (!value)
221
- callback(new Error(t('please_select_codec')))
222
- else
223
- callback()
224
- },
225
- trigger: ['blur', 'change'],
226
- required: true,
227
- },
228
- ])
229
-
230
- const enableValid = computed(() => {
231
- return !!(audioCodecValue.value !== 'copy') as boolean
232
- })
233
- const [descriptionValue, descriptionAttrs] = useElField<string>(getProp('description'), [
234
- {
235
- validator: (rule, value, callback) => {
236
- if (!/^[\w-\s]*$/.test(value))
237
- callback(new Error(t('description.format_description')))
238
- else
239
- callback()
240
- },
241
- trigger: ['blur', 'change'],
242
- },
243
- ])
244
-
245
- const [minrateValue, minrateAttrs] = useElField<number | undefined>(getProp('minrate'), [
246
- {
247
- trigger: ['blur', 'change'],
248
- validator: (rule, value, callback) => {
249
- if (typeValue.value === 'video' && (convertStringToNumber(value || 0) < 64000))
250
- callback(new Error($t('minrate_khong_duoc_lon_hon_bitrate')))
251
- else if (typeValue.value === 'video' && (convertStringToNumber(value) < 64000))
252
- callback(new Error($t('minrate_khong_duoc_lon_hon_bitrate')))
253
- else
254
- callback()
255
- },
256
- },
257
- ])
258
-
259
- const [videoRateValue, videoRateAttrs] = useElField<number | undefined>(getProp('videoBitrate'), [
260
- {
261
- required: true,
262
- trigger: ['blur', 'change'],
263
- validator: (rule, value, callback) => {
264
- if (!value)
265
- callback(new Error(t('library_preset.video_is_required')))
266
- else if (convertStringToNumber(minrateValue.value || 0) >= convertStringToNumber(value))
267
- callback(new Error($t('bitrate_khong_duoc_be_hon_minrate')))
268
- else if (convertStringToNumber(value) > 60000000)
269
- callback(new Error($t('bitrate_khong_duoc_lon_hon_60m')))
270
- else
271
- callback()
272
- },
273
- },
274
- ])
275
- const [audioRateValue, audioRateAttrs] = useElField<number>(getProp('audioBitrate'), [
276
- {
277
- required: true,
278
- trigger: ['blur', 'change'],
279
- validator: (rule, value, callback) => {
280
- if (!value)
281
- callback(new Error(t('library_preset.bitrate_is_required')))
282
-
283
- else if (convertStringToNumber(value) < 32000 || convertStringToNumber(value) > 2000000)
284
- callback(new Error($t('SSConfig.audiorate_khong_duoc_be_hon_minrate')))
285
- else
286
- callback()
287
- },
288
- },
289
- ])
290
- const [maxrateValue, maxrateAttrs] = useElField<number | undefined>(getProp('maxrate'), [
291
- {
292
- trigger: ['blur', 'change'],
293
- validator: (rule, value, callback) => {
294
- if (convertStringToNumber(value || 0) < 64000)
295
- callback(new Error(t('base_library.maxrate_cannot_be_less_than_64000')))
296
- else if (convertStringToNumber(videoRateValue.value || 0) > convertStringToNumber(value || 0))
297
- callback(new Error($t('SSConfig.maxrate_khong_duoc_lon_hon_bitrate')))
298
- else if (convertStringToNumber(value) > 60000000)
299
- callback(new Error($t('SSConfig.maxrate_khong_duoc_lon_hon_60m')))
300
- else
301
- callback()
302
- },
303
- },
304
- ])
305
- const [fpsValue, fpsAttrs] = useElField<number | undefined>(getProp('fps'), [
306
- {
307
- required: true,
308
- trigger: ['blur', 'change'],
309
- validator: (rule, value, callback) => {
310
- if (!value) {
311
- callback(new Error($t('SSConfig.fps_is_required')))
312
- }
313
- else if (convertStringToNumber(value) < 10 || convertStringToNumber(value) > 60) {
314
- callback(new Error($t('SSConfig.fps_less_10_greater_60')))
315
- }
316
- else {
317
- callback()
318
- }
319
- },
320
- },
321
- ])
322
- const [widthValue, widthAttrs] = useElField<number | undefined>(getProp('width'), [
323
- {
324
- required: true,
325
- trigger: ['blur', 'change'],
326
- validator: (rule, value, callback) => {
327
- if (!value && value !== 0) {
328
- callback(new Error($t('SSConfig.width_is_required')))
329
- }
330
- else if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 7680) {
331
- callback(new Error($t('SSConfig.width_less_0_greater_7680')))
332
- }
333
- else {
334
- callback()
335
- }
336
- },
337
- },
338
- ])
339
- const [heightValue, heightAttrs] = useElField<number | undefined>(getProp('height'), [
340
- {
341
- required: true,
342
- trigger: ['blur', 'change'],
343
- validator: (rule, value, callback) => {
344
- if (!value && value !== 0) {
345
- callback(new Error($t('SSConfig.height_is_required')))
346
- }
347
- else if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 4320) {
348
- callback(new Error($t('SSConfig.height_less_0_greater_7680')))
349
- }
350
- else {
351
- callback()
352
- }
353
- },
354
- },
355
- ])
356
-
357
- const [aspectRatioModeValue, aspectRatioModeAttrs] = useElField<string>(getProp('aspectRatioMode'), [])
358
- const isRequiredAspect = computed(() => {
359
- return aspectRatioModeValue.value === 'custom'
360
- })
361
- const [aspectRatioWidthValue, aspectRatioWidthAttrs] = useElField<number | undefined>(getProp('aspectRatioWidth'), [
362
- {
363
- required: true,
364
- trigger: ['blur', 'change'],
365
- validator: (rule, value, callback) => {
366
- if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 1000) {
367
- callback(new Error($t('ratio_width_less_0_greater_1000')))
368
- }
369
- else {
370
- callback()
371
- }
372
- },
373
- },
374
- ], { enabled: isRequiredAspect })
375
- const [aspectRatioHeightValue, aspectRatioHeightAttrs] = useElField<number | undefined>(getProp('aspectRatioHeight'), [
376
- {
377
- required: true,
378
- trigger: ['blur', 'change'],
379
- validator: (rule, value, callback) => {
380
- if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 1000) {
381
- callback(new Error($t('ratio_height_less_0_greater_1000')))
382
- }
383
- else {
384
- callback()
385
- }
386
- },
387
- },
388
- ], { enabled: isRequiredAspect })
389
- const [bframeValue, bframeAttrs] = useElField<number | undefined>(getProp('bframe'), [])
390
- const [pixelFormatValue, pixelFormatAttrs] = useElField<string | undefined>(getProp('pixelFormat'), [])
391
- const [scaleTypeValue, scaleTypeAttrs] = useElField<string | undefined>(getProp('scaleType'), [])
392
- const [scanTypeValue, scanTypeAttrs] = useElField<string | undefined>(getProp('scanType'), [])
393
- const [rateControlModeValue, rateControlModeAttrs] = useElField<string | undefined>(getProp('rateControlMode'), [])
394
- const [rcValue, rcAttrs] = useElField<string | undefined>(getProp('rc'), [])
395
- const [gopModeValue, gopModeAttrs] = useElField<string | undefined>(getProp('gopMode'), [])
396
- const [fixedGOPValue, fixedGOPAttrs] = useElField<boolean | undefined>(getProp('fixedGOP'), [])
397
- const isRequiredGopSize = computed(() => {
398
- return gopModeValue.value === 'fixed_frame' || gopModeValue.value === 'fixed_second'
399
- })
400
- const [gopValue, gopAttrs] = useElField<string | undefined>(getProp('gopValue'), [
401
- {
402
- required: true,
403
- trigger: ['blur', 'change'],
404
- validator: (rule, value, callback) => {
405
- if (!value && (gopModeValue.value === 'fixed_frame' || gopModeValue.value === 'fixed_second')) {
406
- callback(new Error($t('SSConfig.gop_value_required')))
407
- }
408
- else if (gopModeValue.value === 'fixed_frame' && (convertStringToNumber(value) < 17 || convertStringToNumber(value) > 300)) {
409
- callback(new Error($t('SSConfig.gopsize_cannot_be_less_than_17_and_greater_than_300')))
410
- }
411
- else if (gopModeValue.value === 'fixed_second' && (convertStringToNumber(value) < 1 || convertStringToNumber(value) > 16)) {
412
- callback(new Error($t('SSConfig.second_cannot_be_less_than_17_and_greater_than_300')))
413
- }
414
- else {
415
- callback()
416
- }
417
- },
418
- },
419
- ], {
420
- enabled: isRequiredGopSize,
421
- })
422
- const [bufsizeValue, bufsizeAttrs] = useElField<number | undefined>(getProp('bufsize'), [
423
- {
424
- trigger: ['blur', 'change'],
425
- validator: (rule, value, callback) => {
426
- if (convertStringToNumber(value) < 10000 || convertStringToNumber(value) > 60000000) {
427
- callback(new Error($t('SSConfig.buffsize_cannot_be_less_than_64000_and_greater_than_60000000')))
428
- }
429
- else {
430
- callback()
431
- }
432
- },
433
- },
434
- ])
435
- const [hdrValue, hdrAttrs] = useElField<string | undefined>(getProp('hdr'), [])
436
- const [cqValue, cqAttrs] = useElField<number | undefined>(getProp('cq'), [
437
- {
438
- trigger: ['blur', 'change'],
439
- validator: (rule, value, callback) => {
440
- if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 51) {
441
- callback(new Error($t('SSConfig.cbr_less_0_greater_51')))
442
- }
443
- else {
444
- callback()
445
- }
446
- },
447
- },
448
- ])
449
-
450
- // Audio
451
- const [sampleRateValue, sampleRateAttrs] = useElField<number | undefined>(getProp('sampleRate'), [])
452
- const [channelValue, channelAttrs] = useElField<number | undefined>(getProp('channel'), [
453
- {
454
- required: true,
455
- message: t('library_preset.preset_channel'),
456
- trigger: ['blur', 'change'],
457
- },
458
- ], {
459
- enabled: enableValid,
460
- })
461
- const [profileValue, profileAttrs] = useElField<string | undefined>(getProp('videoProfile'), [])
462
- const [audioProfileValue, audioProfileAttrs] = useElField<string | undefined>(getProp('audioProfile'), [])
463
- const [levelValue, levelAttrs] = useElField<string | undefined>(getProp('videoLevel'), [])
464
- const [volumeValue, volumeAttrs] = useElField<string | undefined>(getProp('volume'), [])
465
- const [languageValue, languageAttrs] = useElField<string | undefined>(getProp('language'), [])
466
- const [labelValue, labelAttrs] = useElField<string | undefined>(getProp('label'), [])
467
- const [defaultValue, defaultAttrs] = useElField<boolean | undefined>(getProp('audioDefault'), [])
468
- const [scte35OverwriteConfigValue] = useElField(getProp('scte35OverwriteConfig'), [])
469
- const isCopiedVideoCodec = computed(() => {
470
- return videoCodecValue.value === 'copy'
471
- })
472
-
473
- const isCopiedAudioCodec = computed(() => {
474
- return audioCodecValue.value === 'copy'
475
- })
476
- const isCreateChannel = ref(inject('isCreateChannel'))
477
-
478
- function fillAudio() {
479
- typeValue.value = 'audio'
480
- nameValue.value = nameValue.value ?? ''
481
- descriptionValue.value = descriptionValue.value ?? ''
482
-
483
- audioCodecValue.value = 'aac'
484
- videoCodecValue.value = undefined
485
- dataCodecValue.value = undefined
486
- audioProfileValue.value = undefined
487
- profileValue.value = undefined
488
- levelValue.value = undefined
489
- rcValue.value = undefined
490
- audioRateValue.value = 32000
491
- videoRateValue.value = undefined
492
- sampleRateValue.value = 44100
493
- groupIdValue.value = undefined
494
- defaultValue.value = undefined
495
- minrateValue.value = undefined
496
- maxrateValue.value = undefined
497
- presetValue.value = undefined
498
- fpsValue.value = undefined
499
- widthValue.value = undefined
500
- heightValue.value = undefined
501
- pixelFormatValue.value = undefined
502
- bframeValue.value = undefined
503
- scaleTypeValue.value = undefined
504
- scanTypeValue.value = undefined
505
- gopModeValue.value = undefined
506
- fixedGOPValue.value = undefined
507
- rateControlModeValue.value = undefined
508
- cqValue.value = undefined
509
- channelValue.value = 2
510
- volumeValue.value = undefined
511
- languageValue.value = undefined
512
- labelValue.value = undefined
513
- defaultPTEValue.value = undefined
514
- vmafMaxValue.value = undefined
515
- vmafMinValue.value = undefined
516
- vmafThresValue.value = undefined
517
- }
518
-
519
- function fillVideo() {
520
- typeValue.value = 'video'
521
- nameValue.value = nameValue.value ?? ''
522
- descriptionValue.value = descriptionValue.value ?? ''
523
- audioCodecValue.value = undefined
524
- videoCodecValue.value = 'h264'
525
- dataCodecValue.value = undefined
526
- encoderValue.value = (encoderIdValue.value !== -1 && encoderIdValue.value !== null && encoderIdValue.value !== undefined && encoderIdValue.value !== '') ? 'nvenc' : 'open_h264'
527
- presetValue.value = (encoderIdValue.value !== -1 && encoderIdValue.value !== null && encoderIdValue.value !== undefined && encoderIdValue.value !== '') ? 'llhp' : 'veryfast'
528
- videoRateValue.value = 4000000
529
- rateControlModeValue.value = 'vbr'
530
- minrateValue.value = undefined
531
- maxrateValue.value = undefined
532
- sampleRateValue.value = undefined
533
- fpsValue.value = 25
534
- widthValue.value = 1920
535
- heightValue.value = 1080
536
- pixelFormatValue.value = undefined
537
- bframeValue.value = undefined
538
- scaleTypeValue.value = undefined
539
- scanTypeValue.value = 'progressive'
540
- cqValue.value = undefined
541
- gopModeValue.value = 'auto'
542
- gopValue.value = undefined
543
- fixedGOPValue.value = undefined
544
- hdrValue.value = undefined
545
- rcValue.value = undefined
546
- channelValue.value = undefined
547
- profileValue.value = undefined
548
- levelValue.value = undefined
549
- volumeValue.value = undefined
550
- defaultPTEValue.value = undefined
551
- vmafMaxValue.value = undefined
552
- vmafMinValue.value = undefined
553
- vmafThresValue.value = undefined
554
- }
555
-
556
- function fillData() {
557
- typeValue.value = 'data'
558
- nameValue.value = nameValue.value ?? ''
559
- descriptionValue.value = descriptionValue.value ?? ''
560
- dataCodecValue.value = 'copy'
561
- audioCodecValue.value = undefined
562
- videoCodecValue.value = undefined
563
- minrateValue.value = undefined
564
- maxrateValue.value = undefined
565
- sampleRateValue.value = undefined
566
- fpsValue.value = undefined
567
- widthValue.value = undefined
568
- heightValue.value = undefined
569
- rcValue.value = undefined
570
- pixelFormatValue.value = undefined
571
- bframeValue.value = undefined
572
- scaleTypeValue.value = undefined
573
- cqValue.value = undefined
574
- channelValue.value = undefined
575
- profileValue.value = undefined
576
- levelValue.value = undefined
577
- volumeValue.value = undefined
578
- fixedGOPValue.value = undefined
579
- defaultPTEValue.value = undefined
580
- vmafMaxValue.value = undefined
581
- vmafMinValue.value = undefined
582
- vmafThresValue.value = undefined
583
- }
584
-
585
- const configPte = ref(inject('configPte'))
586
- // disabled with PTE config
587
- const disabledWithPTEConfig = computed(() => {
588
- return isCreateChannel.value && defaultPTEValue.value && encoderValue.value === 'nvenc' && configPte.value?.pte?.enable
589
- })
590
-
591
- async function handleChangeType(type: string) {
592
- if (type === 'data')
593
- fillData()
594
-
595
- else if (type === 'audio')
596
- fillAudio()
597
-
598
- else if (type === 'video')
599
- fillVideo()
600
-
601
- if (type === 'video')
602
- await formRef.value?.validateField('videoBitrate')
603
- else if (type === 'audio')
604
- await formRef.value?.validateField('audioBitrate')
605
- }
606
-
607
- function setUndefined(type: string, value: any) {
608
- switch (type) {
609
- case 'volume':
610
- !value ? volumeValue.value = undefined : volumeValue.value = value
611
- break
612
- case 'hdr':
613
- !value ? hdrValue.value = undefined : hdrValue.value = value
614
- break
615
- case 'pixel':
616
- !value ? pixelFormatValue.value = undefined : pixelFormatValue.value = value
617
- break
618
- case 'scale':
619
- !value ? scaleTypeValue.value = undefined : scaleTypeValue.value = value
620
- break
621
- case 'scan':
622
- !value ? scanTypeValue.value = undefined : scanTypeValue.value = value
623
- break
624
- case 'profile':
625
- !value ? profileValue.value = undefined : profileValue.value = value
626
- break
627
- case 'audioProfile':
628
- !value ? audioProfileValue.value = undefined : audioProfileValue.value = value
629
- break
630
- case 'level':
631
- !value ? levelValue.value = undefined : levelValue.value = value
632
- break
633
- case 'label':
634
- !value ? labelValue.value = undefined : labelValue.value = value
635
- break
636
- case 'rateControlMode':
637
- !value ? rateControlModeValue.value = undefined : rateControlModeValue.value = value
638
- rcValue.value = undefined
639
- break
640
- case 'rc':
641
- !value ? rcValue.value = undefined : rcValue.value = value
642
- break
643
- }
644
- }
645
-
646
- const optionsPreset = computed(() => {
647
- return encoderValue.value === 'nvenc'
648
- ? [
649
- {
650
- label: 'SLOW',
651
- value: 'slow',
652
- },
653
- {
654
- label: 'MEDIUM',
655
- value: 'medium',
656
- },
657
- {
658
- label: 'FAST',
659
- value: 'fast',
660
- },
661
- {
662
- label: 'HP',
663
- value: 'hp',
664
- },
665
- {
666
- label: 'HQ',
667
- value: 'hq',
668
- },
669
- {
670
- label: 'BD',
671
- value: 'bd',
672
- },
673
- {
674
- label: 'LL',
675
- value: 'll',
676
- },
677
- {
678
- label: 'LLHQ',
679
- value: 'llhq',
680
- },
681
- {
682
- label: 'LLHP',
683
- value: 'llhp',
684
- },
685
- ]
686
- : [
687
- {
688
- label: 'MEDIUM',
689
- value: 'medium',
690
- },
691
- {
692
- label: 'FAST',
693
- value: 'fast',
694
- },
695
- {
696
- label: 'FASTER',
697
- value: 'faster',
698
- },
699
- {
700
- label: 'VERYFAST',
701
- value: 'veryfast',
702
- },
703
- {
704
- label: 'SUPERFAST',
705
- value: 'superfast',
706
- },
707
- {
708
- label: 'ULTRAFAST',
709
- value: 'ultrafast',
710
- },
711
- ]
712
- })
713
-
714
- const codecSelection = computed(() => {
715
- return {
716
- video: (encoderValue.value === 'open_h264' || encoderValue.value === 'aurora4')
717
- ? { H264: 'h264' }
718
- : encoderValue.value === 'open_hevc'
719
- ? { HEVC: 'hevc' }
720
- : encoderValue.value === 'nvenc'
721
- ? { H264: 'h264', HEVC: 'hevc' }
722
- : { COPY: 'copy' },
723
- audio: AUDIO_CODECS,
724
- data: DATA_CODECS,
725
- }[typeValue.value]
726
- })
727
-
728
- function defaultPTEConfig(_newValue) {
729
- videoCodecValue.value = 'h264'
730
- fixedGOPValue.value = false
731
- if (_newValue) {
732
- vmafMaxValue.value = 95
733
- vmafMinValue.value = 91
734
- vmafThresValue.value = 0.85
735
- }
736
- }
737
-
738
- function getEncoderConfig(newEncoderType: string) {
739
- const config = {
740
- videoCodec: '',
741
- videoPreset: '',
742
- videoProfile: '',
743
- videoLevel: '',
744
- vmafMaxValue: undefined,
745
- vmafMinValue: undefined,
746
- vmafThresValue: undefined,
747
- }
748
-
749
- if (isPackage.value)
750
- return config
751
-
752
- switch (newEncoderType) {
753
- case 'open_h264':
754
- config.videoCodec = 'h264'
755
- config.videoPreset = 'veryfast'
756
- break
757
- case 'open_hevc':
758
- config.videoCodec = 'hevc'
759
- config.videoPreset = 'veryfast'
760
- break
761
- case 'nvenc':
762
- config.videoCodec = 'h264'
763
- config.videoPreset = 'llhp'
764
- if (isCreateChannel.value) {
765
- config.vmafMaxValue = 95
766
- config.vmafMinValue = 91
767
- config.vmafThresValue = 0.85
768
- }
769
- break
770
- case 'aurora4':
771
- config.videoCodec = 'h264'
772
- config.videoPreset = 'veryfast'
773
- break
774
- case 'passthrough':
775
- config.videoCodec = 'copy'
776
- break
777
- }
778
-
779
- return config
780
- }
781
-
782
- function updateAllEncoderTypes(newEncoderType: string) {
783
- const config = getEncoderConfig(newEncoderType)
784
-
785
- return profilesValue.value?.map((_profile) => {
786
- const updatedPresets = _profile?.presets?.map(preset => ({
787
- ...preset,
788
- encoderType: newEncoderType,
789
- videoPreset: config.videoPreset,
790
- videoProfile: config.videoProfile,
791
- videoLevel: config.videoLevel,
792
- videoCodec: config.videoCodec,
793
- }))
794
- return {
795
- ..._profile,
796
- presets: updatedPresets,
797
- }
798
- })
799
- }
800
-
801
- const isVod = ref(inject('isVod'))
802
- function handleChangeEncoder(newValue: string) {
803
- const config = getEncoderConfig(newValue)
804
- const isCheck = isVod.value ? !areAllEncoderTypesSame(profilesValue.value, newValue) : !areAllEncoderTypesSame(profilesValue.value)
805
- if (profilesValue.value?.length > 0 && isCheck) {
806
- ElMessageBox.alert(
807
- $t('base_libray.less_than_strong_greater_than_all_profiles', [`<strong>${$t('base_libray.all_profiles_must_have_the_same_video_encoder_data')}</strong>`]),
808
- $t('base_libray.encoder_sync'),
809
- {
810
- confirmButtonText: t('Actions.confirm'),
811
- dangerouslyUseHTMLString: true,
812
- showClose: false,
813
- callback: () => {
814
- profilesValue.value = updateAllEncoderTypes(newValue)
815
- formRef.value.validate()
816
- },
817
- },
818
- )
819
- }
820
- else {
821
- formRef.value.validate()
822
- }
823
-
824
- defaultPTEValue.value = false
825
-
826
- videoCodecValue.value = config.videoCodec
827
- presetValue.value = config.videoPreset
828
- profileValue.value = config.videoProfile
829
- levelValue.value = config.videoLevel
830
-
831
- vmafMaxValue.value = config.vmafMaxValue
832
- vmafMinValue.value = config.vmafMinValue
833
- vmafThresValue.value = config.vmafThresValue
834
- }
835
-
836
- function formatter(value: string) {
837
- return value.replace(/\D/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, '.')
838
- }
839
-
840
- function parser(value: string) {
841
- return Number.parseInt(value.replace(/\D/g, '').replace(/\$\s?|(\.*)/g, ''))
842
- }
843
-
844
- const activeNames = ref(['general', 'aspect', 'frame', 'control', 'color', 'gop', 'codec', 'other', 'scte35', 'output_aspect', 'pte'])
845
-
846
- const optionsProfile = computed(() => {
847
- return videoCodecValue.value === 'h264' ? ['baseline', 'main', 'high'] : videoCodecValue.value === 'hevc' ? ['main'] : []
848
- })
849
- const optionsLevel = computed(() => {
850
- return videoCodecValue.value === 'h264' ? ['H264_LEVEL_5_2', 'H264_LEVEL_5_1', 'H264_LEVEL_5', 'H264_LEVEL_4_2', 'H264_LEVEL_4_1', 'H264_LEVEL_4', 'H264_LEVEL_3_2', 'H264_LEVEL_3_1', 'H264_LEVEL_3', 'H264_LEVEL_2_2', 'H264_LEVEL_2_1', 'H264_LEVEL_2', 'H264_LEVEL_1_3', 'H264_LEVEL_1_2', 'H264_LEVEL_1_1', 'H264_LEVEL_1'] : videoCodecValue.value === 'hevc' ? ['H265_LEVEL_6_2', 'H265_LEVEL_6_1', 'H265_LEVEL_6', 'H265_LEVEL_5_2', 'H265_LEVEL_5_1', 'H265_LEVEL_5', 'H265_LEVEL_4_1', 'H265_LEVEL_4', 'H265_LEVEL_3_1', 'H265_LEVEL_3', 'H265_LEVEL_2_1', 'H265_LEVEL_2', 'H265_LEVEL_1'] : []
851
- })
852
- const isDisabledGopSize = computed(() => {
853
- return !!(gopModeValue.value === 'auto' || gopModeValue.value === 'from_source')
854
- })
855
- const isDisabledRc = computed(() => {
856
- return !!(encoderValue.value !== 'nvenc') as boolean
857
- })
858
-
859
- const optionRc = computed(() => {
860
- return rateControlModeValue.value === 'cbr' ? ['cbr_hq', 'cbr_hp'] : rateControlModeValue.value === 'vbr' ? ['vbr_hq', 'vbr_hp'] : []
861
- })
862
-
863
- const optionGopMode = [
864
- { label: 'Auto', value: 'auto' },
865
- { label: 'Source', value: 'from_source' },
866
- { label: 'Seconds', value: 'fixed_second' },
867
- { label: 'Frames', value: 'fixed_frame' },
868
- ]
869
-
870
- function handleChangeVideoCodec() {
871
- profileValue.value = ''
872
- levelValue.value = ''
873
- }
874
-
875
- const optionScanType = [
876
- { label: 'Progressive mode', value: 'progressive' },
877
- { label: 'Interlaced mode', value: 'interlaced' },
878
- ]
879
-
880
- const optionsLang = computed(() => {
881
- return langOptions.value?.map(item => ({
882
- label: `${item[0]} (${item[1]})`,
883
- value: item[1],
884
- }))
885
- })
886
-
887
- async function handleApplyConfig(_value) {
888
- defaultPTEValue.value = true
889
- nameValue.value = _value?.name
890
- bframeValue.value = _value?.bframe
891
- // encoderValue.value = _value?.encoder
892
- pixelFormatValue.value = _value?.format
893
- fpsValue.value = _value?.fps
894
- maxrateValue.value = _value?.maxrate
895
- profileValue.value = _value?.profile
896
- presetValue.value = _value?.preset
897
- videoCodecValue.value = 'h264'
898
- fixedGOPValue.value = false
899
-
900
- await formRef.value?.validate()
901
- }
902
- </script>
903
-
904
- <template>
905
- <template v-if="typeValue === 'data'">
906
- <el-collapse
907
- v-model="activeNames"
908
- class="[&_.el-collapse-item\_\_content]:pb-0 [&_.el-collapse-item\_\_header]:(text-16px) ![&_.el-collapse-item\_\_header]:font-600"
909
- >
910
- <el-collapse-item name="general">
911
- <template #title>
912
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
913
- {{ $t('channel_input.general_information') }}
914
- </label>
915
- </template>
916
- <div class="flex gap-2">
917
- <el-form-item class="w-full" v-bind="nameAttrs">
918
- <template #label>
919
- <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
920
- </template>
921
- <el-input
922
- v-model="nameValue"
923
- :placeholder="$t('library_preset.enter_name')"
924
- autocomplete="off"
925
- clearable
926
- :minlength="1"
927
- :maxlength="50"
928
- show-word-limit
929
- />
930
- </el-form-item>
931
- <el-form-item v-if="isShowType" class="w-full" v-bind="typeAttrs">
932
- <template #label>
933
- <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
934
- </template>
935
- <el-select
936
- v-model="typeValue"
937
- class="w-full"
938
- :disabled="!!defaultMediaType || mode === 'edit'"
939
- @change="handleChangeType"
940
- >
941
- <el-option
942
- v-for="(type, idx) in ['video', 'audio', 'data']"
943
- :key="type + idx"
944
- :value="type"
945
- :label="type"
946
- />
947
- </el-select>
948
- </el-form-item>
949
- <el-form-item class="w-full" label="Codec" v-bind="dataCodecAttrs">
950
- <template #label>
951
- <SSInformationLabel label="Codec" :info="schemaObj.dataCodec" />
952
- </template>
953
- <el-select
954
- v-model="dataCodecValue"
955
- class="w-full"
956
- default-first-option
957
- :disabled="isPackage && typeValue !== 'data'"
958
- >
959
- <el-option
960
- v-for="(type, idx) in codecSelection"
961
- :key="type + idx"
962
- :value="type"
963
- :label="type"
964
- />
965
- </el-select>
966
- </el-form-item>
967
- </div>
968
- </el-collapse-item>
969
- <el-collapse-item v-if="scte35 && dataCodecValue === 'copy'" name="scte35">
970
- <template #title>
971
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
972
- Overwrite SCTE35
973
- </label>
974
- </template>
975
-
976
- <div class="w-1/2 flex justify-between gap-2">
977
- <el-form-item class="w-full">
978
- <template #label>
979
- <SSInformationLabel :label="$t('EventChannel.form.label.enable')" :info="schemaSCTE35.enabled" />
980
- </template>
981
- <el-switch
982
- v-model="scte35OverwriteConfigValue.enabled"
983
- />
984
- </el-form-item>
985
- <el-form-item class="w-full">
986
- <template #label>
987
- <SSInformationLabel :label="$t('fast_channel.duration')" :info="schemaSCTE35.overwriteDuration" />
988
- </template>
989
- <el-input-number
990
- v-model="scte35OverwriteConfigValue.overwriteDuration"
991
- :disabled="!scte35OverwriteConfigValue.enabled"
992
- :min="1"
993
- :max="180"
994
- :precision="0"
995
- class="w-full"
996
- />
997
- </el-form-item>
998
-
999
- <el-form-item class="w-full" label="Delay">
1000
- <template #label>
1001
- <SSInformationLabel :label="$t('EventChannel.form.label.delay')" :info="schemaSCTE35.overwriteDelayTime" />
1002
- </template>
1003
- <el-input-number
1004
- v-model="scte35OverwriteConfigValue.overwriteDelayTime"
1005
- :disabled="!scte35OverwriteConfigValue.enabled"
1006
- :min="0"
1007
- :max="60"
1008
- :precision="0"
1009
- class="w-full"
1010
- />
1011
- </el-form-item>
1012
- </div>
1013
- </el-collapse-item>
1014
- </el-collapse>
1015
- </template>
1016
- <template v-else>
1017
- <div v-if="!typeValue && isShowType" class="flex gap-2">
1018
- <el-form-item class="flex-1" v-bind="nameAttrs">
1019
- <template #label>
1020
- <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
1021
- </template>
1022
- <el-input
1023
- v-model="nameValue"
1024
- :placeholder="$t('library_preset.enter_name')"
1025
- autocomplete="off"
1026
- clearable
1027
- :minlength="1"
1028
- :maxlength="50"
1029
- show-word-limit
1030
- />
1031
- </el-form-item>
1032
- <el-form-item v-if="isShowType" class="flex-1" v-bind="typeAttrs">
1033
- <template #label>
1034
- <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
1035
- </template>
1036
- <el-select
1037
- v-model="typeValue"
1038
- class="w-full"
1039
- :disabled="!!defaultMediaType || mode === 'edit'"
1040
- @change="handleChangeType"
1041
- >
1042
- <el-option
1043
- v-for="(type, idx) in ['video', 'audio', 'data']"
1044
- :key="type + idx"
1045
- :value="type"
1046
- :label="type"
1047
- />
1048
- </el-select>
1049
- </el-form-item>
1050
- </div>
1051
-
1052
- <el-collapse
1053
- v-model="activeNames"
1054
- class="[&_.el-collapse-item\_\_content]:pb-0 [&_.el-collapse-item\_\_header]:(text-16px) ![&_.el-collapse-item\_\_header]:font-600"
1055
- >
1056
- <el-collapse-item v-if="typeValue" name="general">
1057
- <template #title>
1058
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
1059
- {{ $t('SSConfig.general_information') }}
1060
- </label>
1061
- </template>
1062
- <div class="flex flex-wrap gap-2">
1063
- <el-form-item class="w-586px" v-bind="nameAttrs">
1064
- <template #label>
1065
- <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
1066
- </template>
1067
- <el-input
1068
- v-model="nameValue"
1069
- :placeholder="$t('library_preset.enter_name')"
1070
- autocomplete="off"
1071
- clearable
1072
- :minlength="1"
1073
- :maxlength="50"
1074
- show-word-limit
1075
- />
1076
- </el-form-item>
1077
- <el-form-item v-if="isShowType" class="max-w-190px min-w-190px" v-bind="typeAttrs">
1078
- <template #label>
1079
- <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
1080
- </template>
1081
- <el-select
1082
- v-model="typeValue"
1083
- class="w-full"
1084
- :disabled="!!defaultMediaType || mode === 'edit'"
1085
- @change="handleChangeType"
1086
- >
1087
- <el-option
1088
- v-for="(type, idx) in ['video', 'audio', 'data']"
1089
- :key="type + idx"
1090
- :value="type"
1091
- :label="type"
1092
- />
1093
- </el-select>
1094
- </el-form-item>
1095
- <el-form-item v-if="isConfigEncoder && typeValue === 'video'" class="[&_.el-form-item\_\_content]:block" v-bind="encoderAttrs">
1096
- <template #label>
1097
- <SSInformationLabel :label="$t('library_preset.encoder')" :info="schemaObj.encoderType" />
1098
- </template>
1099
- <el-select
1100
- v-model="encoderValue"
1101
- :disabled="isPackage"
1102
- class="max-w-190px min-w-190px"
1103
- @change="handleChangeEncoder"
1104
- >
1105
- <el-option
1106
- v-for="(e, idx) in optionsEncoder"
1107
- :key="e + idx"
1108
- :value="e.value"
1109
- :label="e.label"
1110
- />
1111
- </el-select>
1112
- </el-form-item>
1113
- <el-form-item
1114
- v-if="typeValue === 'video'"
1115
- class="max-w-190px min-w-190px"
1116
- label="Codec"
1117
- v-bind="videoCodecAttrs"
1118
- >
1119
- <template #label>
1120
- <SSInformationLabel label="Codec" :info="schemaObj.videoCodec" />
1121
- </template>
1122
- <el-select
1123
- v-model="videoCodecValue"
1124
- class="max-w-190px min-w-190px"
1125
- default-first-option
1126
- :disabled="(isPackage && typeValue !== 'data' || disabledWithPTEConfig)"
1127
- @change="handleChangeVideoCodec"
1128
- >
1129
- <el-option
1130
- v-for="(type, idx) in codecSelection"
1131
- :key="type + idx"
1132
- :value="type"
1133
- :label="type"
1134
- />
1135
- </el-select>
1136
- </el-form-item>
1137
-
1138
- <el-form-item
1139
- v-if="typeValue === 'audio'"
1140
- class="max-w-190px min-w-190px"
1141
- label="Codec"
1142
- v-bind="audioCodecAttrs"
1143
- >
1144
- <template #label>
1145
- <SSInformationLabel label="Codec" :info="schemaObj.audioCodec" />
1146
- </template>
1147
- <el-select
1148
- v-model="audioCodecValue"
1149
- class="max-w-190px min-w-190px"
1150
- default-first-option
1151
- :disabled="isPackage"
1152
- >
1153
- <el-option
1154
- v-for="(type, idx) in codecSelection"
1155
- :key="type + idx"
1156
- :value="type"
1157
- :label="type"
1158
- />
1159
- </el-select>
1160
- </el-form-item>
1161
- <el-form-item
1162
- v-if="typeValue === 'data'"
1163
- class="max-w-190px min-w-190px"
1164
- label="Codec"
1165
- v-bind="dataCodecAttrs"
1166
- >
1167
- <template #label>
1168
- <SSInformationLabel label="Codec" :info="schemaObj.dataCodec" />
1169
- </template>
1170
- <el-select
1171
- v-model="dataCodecValue"
1172
- class="max-w-190px min-w-190px"
1173
- default-first-option
1174
- :disabled="isPackage"
1175
- >
1176
- <el-option
1177
- v-for="(type, idx) in codecSelection"
1178
- :key="type + idx"
1179
- :value="type"
1180
- :label="type"
1181
- />
1182
- </el-select>
1183
- </el-form-item>
1184
- </div>
1185
- </el-collapse-item>
1186
- <el-collapse-item v-if="typeValue === 'video' && encoderValue === 'nvenc' && isCreateChannel && encoderValue !== 'passthrough' && configPte?.pte?.enable" name="pte">
1187
- <template #title>
1188
- <label class="flex items-center gap-2 text-16px font-semibold">
1189
- PTE Config <span class="text-13px font-normal">({{ $t('base_library.used_in_video_encoding_with_ai-based_quality_assessment_to_optimize_efficiency_while_maintaining_visual_quality') }})</span>
1190
- <el-tooltip
1191
- class="box-item"
1192
- effect="dark"
1193
- content="Recommended Configuration"
1194
- placement="top"
1195
- >
1196
- <div v-if="configPte?.pte?.path" class="h-20px w-20px flex items-center justify-center rounded-full bg-primary">
1197
- <div class="i-carbon:thumbs-up-filled mb-1px cursor-pointer text-light" @click.prevent.stop="isVisibleRecommend = true" />
1198
- </div>
1199
- </el-tooltip>
1200
- </label>
1201
- </template>
1202
- <div class="flex gap-2">
1203
- <el-form-item class="max-w-190px min-w-190px" label="Enable" v-bind="defaultPTEAttrs">
1204
- <template #label>
1205
- <SSInformationLabel label="Enable" :info="schemaObj.pteEnabled" />
1206
- </template>
1207
- <el-switch
1208
- v-model="defaultPTEValue"
1209
- :disabled="!configPte?.pte?.enable"
1210
- @change="defaultPTEConfig"
1211
- />
1212
- </el-form-item>
1213
- <el-form-item label="vmafMax" class="max-w-190px min-w-190px" v-bind="vmafMaxAttrs">
1214
- <template #label>
1215
- <SSInformationLabel label="vmafMax" :info="schemaObj.vmafMax" />
1216
- </template>
1217
- <el-input-number
1218
- v-model="vmafMaxValue"
1219
- :disabled="!defaultPTEValue"
1220
- class="w-full [&_.el-input\_\_inner]:text-start"
1221
- :controls="false"
1222
- :precision="2"
1223
- :max="96"
1224
- :min="vmafMinValue || 89"
1225
- />
1226
- </el-form-item>
1227
- <el-form-item label="vmafMin" class="max-w-190px min-w-190px" v-bind="vmafMinAttrs">
1228
- <template #label>
1229
- <SSInformationLabel label="vmafMin" :info="schemaObj.vmafMin" />
1230
- </template>
1231
- <el-input-number
1232
- v-model="vmafMinValue"
1233
- :disabled="!defaultPTEValue"
1234
- class="w-full [&_.el-input\_\_inner]:text-start"
1235
- :controls="false"
1236
- :precision="2"
1237
- :max="vmafMaxValue || 96"
1238
- :min="89"
1239
- />
1240
- </el-form-item>
1241
- <el-form-item label="vmafThres" class="max-w-190px min-w-190px" v-bind="vmafThresAttrs">
1242
- <template #label>
1243
- <SSInformationLabel label="vmafThres" :info="schemaObj.vmafThres" />
1244
- </template>
1245
- <el-input-number
1246
- v-model="vmafThresValue"
1247
- :disabled="!defaultPTEValue"
1248
- class="w-full [&_.el-input\_\_inner]:text-start"
1249
- :controls="false"
1250
- :max="1"
1251
- :min="0.5"
1252
- :precision="2"
1253
- />
1254
- </el-form-item>
1255
- </div>
1256
- </el-collapse-item>
1257
- <el-collapse-item v-if="scte35 && ['copy', 'scte35'].includes(dataCodecValue) && encoderValue !== 'passthrough'" name="scte35">
1258
- <template #title>
1259
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
1260
- Overwrite SCTE35
1261
- </label>
1262
- </template>
1263
-
1264
- <div class="w-1/2 flex justify-between gap-2">
1265
- <el-form-item class="w-full">
1266
- <template #label>
1267
- <SSInformationLabel :label="$t('EventChannel.form.label.enable')" :info="schemaSCTE35.enabled" />
1268
- </template>
1269
- <el-switch
1270
- v-model="scte35OverwriteConfigValue.enabled"
1271
- />
1272
- </el-form-item>
1273
- <el-form-item class="w-full">
1274
- <template #label>
1275
- <SSInformationLabel :label="$t('fast_channel.duration')" :info="schemaSCTE35.overwriteDuration" />
1276
- </template>
1277
- <el-input-number
1278
- v-model="scte35OverwriteConfigValue.overwriteDuration"
1279
- :disabled="!scte35OverwriteConfigValue.enabled"
1280
- :min="1"
1281
- :max="180"
1282
- :precision="0"
1283
- class="w-full"
1284
- />
1285
- </el-form-item>
1286
-
1287
- <el-form-item class="w-full" :label="$t('EventChannel.form.label.delay')">
1288
- <template #label>
1289
- <SSInformationLabel :label="$t('EventChannel.form.label.delay')" :info="schemaSCTE35.overwriteDelayTime" />
1290
- </template>
1291
- <el-input-number
1292
- v-model="scte35OverwriteConfigValue.overwriteDelayTime"
1293
- :disabled="!scte35OverwriteConfigValue.enabled"
1294
- :min="0"
1295
- :max="60"
1296
- :precision="0"
1297
- class="w-full"
1298
- />
1299
- </el-form-item>
1300
- </div>
1301
- </el-collapse-item>
1302
- <el-collapse-item v-if="typeValue && !isPackage && encoderValue !== 'passthrough'" name="codec">
1303
- <template #title>
1304
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
1305
- {{ $t('SSConfig.codec_detail') }}
1306
- </label>
1307
- </template>
1308
-
1309
- <div class="flex flex-wrap gap-2">
1310
- <el-form-item v-if="isConfigEncoder && typeValue === 'video' && encoderValue !== 'passthrough' && !isPackage" class="max-w-190px min-w-190px" v-bind="presetAttrs">
1311
- <template #label>
1312
- <SSInformationLabel label="Preset" :info="schemaObj.videoPreset" />
1313
- </template>
1314
- <el-select v-model="presetValue" class="w-full">
1315
- <el-option
1316
- v-for="(e) in optionsPreset"
1317
- :key="e.value"
1318
- :value="e.value"
1319
- :label="e.label"
1320
- />
1321
- </el-select>
1322
- </el-form-item>
1323
- <el-form-item
1324
- v-if="typeValue === 'video'"
1325
- label="Pixel format"
1326
- class="max-w-190px min-w-190px"
1327
- v-bind="pixelFormatAttrs"
1328
- >
1329
- <template #label>
1330
- <SSInformationLabel label="Pixel format" :info="schemaObj.pixelFormat" />
1331
- </template>
1332
- <el-select
1333
- v-model="pixelFormatValue"
1334
- :disabled="isCopiedVideoCodec"
1335
- class="w-full"
1336
- clearable
1337
- @change="(value) => setUndefined('pixel', value)"
1338
- >
1339
- <el-option
1340
- v-for="(type, idx) in ['yuv420p', 'yuv444p', 'yuv420p10le', 'yuv444p10le']"
1341
- :key="type + idx"
1342
- :value="type"
1343
- :label="type"
1344
- />
1345
- </el-select>
1346
- </el-form-item>
1347
- <el-form-item
1348
- v-if="typeValue === 'video'"
1349
- class="max-w-190px min-w-190px"
1350
- label="Profile"
1351
- v-bind="profileAttrs"
1352
- >
1353
- <template #label>
1354
- <SSInformationLabel label="Profile" :info="schemaObj.videoProfile" />
1355
- </template>
1356
- <el-select
1357
- v-model="profileValue"
1358
- :disabled="isCopiedVideoCodec"
1359
- class="w-full"
1360
- default-first-option
1361
- clearable
1362
- @change="(value) => setUndefined('profile', value)"
1363
- >
1364
- <el-option
1365
- v-for="(type, idx) in optionsProfile"
1366
- :key="type + idx"
1367
- :value="type"
1368
- :label="type"
1369
- />
1370
- </el-select>
1371
- </el-form-item>
1372
- <el-form-item
1373
- v-if="typeValue === 'audio'"
1374
- class="max-w-190px min-w-190px"
1375
- label="Profile"
1376
- v-bind="audioProfileAttrs"
1377
- >
1378
- <template #label>
1379
- <SSInformationLabel label="Profile" :info="schemaObj.audioProfile" />
1380
- </template>
1381
- <el-select
1382
- v-model="audioProfileValue"
1383
- :disabled="isCopiedVideoCodec"
1384
- class="w-full"
1385
- default-first-option
1386
- clearable
1387
- @change="(value) => setUndefined('audioProfile', value)"
1388
- >
1389
- <el-option
1390
- v-for="(type, idx) in ['aac_low', 'aac_he', 'aac_he_v2', 'aac_main', 'aac_ld', 'aac_eld']"
1391
- :key="type + idx"
1392
- :value="type"
1393
- :label="type"
1394
- />
1395
- </el-select>
1396
- </el-form-item>
1397
- <el-form-item
1398
- v-if="typeValue === 'video'"
1399
- class="max-w-190px min-w-190px"
1400
- label="Level"
1401
- v-bind="levelAttrs"
1402
- >
1403
- <template #label>
1404
- <SSInformationLabel label="Level" :info="schemaObj.videoLevel" />
1405
- </template>
1406
- <el-select
1407
- v-model="levelValue"
1408
- :disabled="isCopiedVideoCodec"
1409
- class="w-full"
1410
- default-first-option
1411
- clearable
1412
- @change="(value) => setUndefined('level', value)"
1413
- >
1414
- <el-option
1415
- v-for="(type, idx) in optionsLevel"
1416
- :key="type + idx"
1417
- :value="type"
1418
- :label="type"
1419
- />
1420
- </el-select>
1421
- </el-form-item>
1422
- </div>
1423
- </el-collapse-item>
1424
- <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" title="Detail Information" name="output_aspect">
1425
- <template #title>
1426
- <label class="flex items-center gap-2 text-16px font-semibold">
1427
- {{ $t('SSConfig.aspect_ratio') }}
1428
- </label>
1429
- </template>
1430
-
1431
- <div class="flex gap-2">
1432
- <el-form-item label="Aspect Ratio Mode" class="max-w-190px min-w-190px" v-bind="aspectRatioModeAttrs">
1433
- <template #label>
1434
- <SSInformationLabel label="Aspect Ratio Mode" :info="schemaObj.aspectRatioMode" />
1435
- </template>
1436
- <el-select
1437
- v-model="aspectRatioModeValue"
1438
- class="w-full"
1439
- :disabled="isCopiedVideoCodec"
1440
- >
1441
- <el-option
1442
- v-for="(type, idx) in [
1443
- 'auto', 'custom', 'source',
1444
- ]"
1445
- :key="type + idx"
1446
- :value="type"
1447
- :label="type"
1448
- />
1449
- </el-select>
1450
- </el-form-item>
1451
-
1452
- <el-form-item label="Aspect Ratio Width" class="max-w-190px min-w-190px" v-bind="aspectRatioWidthAttrs">
1453
- <template #label>
1454
- <SSInformationLabel label="Aspect Ratio Width" :info="schemaObj.aspectRatioWidth" />
1455
- </template>
1456
- <el-input-number
1457
- v-model="aspectRatioWidthValue"
1458
- :min="1"
1459
- :max="1000"
1460
- class="w-full [&_.el-input\_\_inner]:text-start"
1461
- :disabled="aspectRatioModeValue !== 'custom'"
1462
- :precision="0"
1463
- :controls="false"
1464
- step-strictly
1465
- />
1466
- </el-form-item>
1467
- <el-form-item label="Aspect Ratio Height" class="max-w-190px min-w-190px" v-bind="aspectRatioHeightAttrs">
1468
- <template #label>
1469
- <SSInformationLabel label="Aspect Ratio Height" :info="schemaObj.aspectRatioHeight" />
1470
- </template>
1471
- <el-input-number
1472
- v-model="aspectRatioHeightValue"
1473
- :min="1"
1474
- :max="1000"
1475
- class="w-full [&_.el-input\_\_inner]:text-start"
1476
- :disabled="aspectRatioModeValue !== 'custom'"
1477
- :precision="0"
1478
- :controls="false"
1479
- step-strictly
1480
- />
1481
- </el-form-item>
1482
- </div>
1483
- </el-collapse-item>
1484
- <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" title="Detail Information" name="aspect">
1485
- <template #title>
1486
- <label class="flex items-center gap-2 text-16px font-semibold">
1487
- {{ $t('Channel.output_aspect_ratio') }}
1488
- </label>
1489
- </template>
1490
- <div class="flex gap-2">
1491
- <el-form-item label="Width" class="max-w-190px min-w-190px" v-bind="widthAttrs">
1492
- <template #label>
1493
- <SSInformationLabel label="Width" :info="schemaObj.width" />
1494
- </template>
1495
- <el-input-number
1496
- v-model="widthValue"
1497
- :min="0"
1498
- :max="7680"
1499
- class="w-full [&_.el-input\_\_inner]:text-start"
1500
- :disabled="isCopiedVideoCodec"
1501
- :precision="0"
1502
- :controls="false"
1503
- step-strictly
1504
- />
1505
- </el-form-item>
1506
-
1507
- <el-form-item label="Height" class="max-w-190px min-w-190px" v-bind="heightAttrs">
1508
- <template #label>
1509
- <SSInformationLabel label="Height" :info="schemaObj.height" />
1510
- </template>
1511
- <el-input-number
1512
- v-model="heightValue"
1513
- :min="0"
1514
- :max="4320"
1515
- class="w-full [&_.el-input\_\_inner]:text-start"
1516
- :disabled="isCopiedVideoCodec"
1517
- :precision="0"
1518
- :controls="false"
1519
- step-strictly
1520
- />
1521
- </el-form-item>
1522
- <el-form-item label="Scale Type" class="max-w-190px min-w-190px" v-bind="scaleTypeAttrs">
1523
- <template #label>
1524
- <SSInformationLabel label="Scale Type" :info="schemaObj.scaleType" />
1525
- </template>
1526
- <el-select
1527
- v-model="scaleTypeValue"
1528
- class="w-full"
1529
- :disabled="isCopiedVideoCodec"
1530
- clearable
1531
- @change="(value) => setUndefined('scale', value)"
1532
- >
1533
- <el-option
1534
- v-for="(type, idx) in [
1535
- 'fitWidth',
1536
- 'fitHeight',
1537
- 'fitInside',
1538
- 'fitCrop',
1539
- 'fitBoth',
1540
- 'source',
1541
- ]"
1542
- :key="type + idx"
1543
- :value="type"
1544
- :label="type"
1545
- />
1546
- </el-select>
1547
- </el-form-item>
1548
- </div>
1549
- </el-collapse-item>
1550
-
1551
- <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="frame">
1552
- <template #title>
1553
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
1554
- {{ $t('SSConfig.frame_rate') }}
1555
- </label>
1556
- </template>
1557
-
1558
- <div class="flex gap-2">
1559
- <el-form-item v-bind="fpsAttrs" label="FPS" class="max-w-190px min-w-190px">
1560
- <template #label>
1561
- <SSInformationLabel label="FPS" :info="schemaObj.fps" />
1562
- </template>
1563
- <el-input-number
1564
- v-model="fpsValue"
1565
- class="w-full [&_.el-input\_\_inner]:text-start"
1566
- :disabled="isCopiedVideoCodec"
1567
- :precision="0"
1568
- :controls="false"
1569
- step-strictly
1570
- />
1571
- </el-form-item>
1572
- <el-form-item label="Scan Type" class="max-w-190px min-w-190px" v-bind="scanTypeAttrs">
1573
- <template #label>
1574
- <SSInformationLabel label="Scan Type" :info="schemaObj.scanType" />
1575
- </template>
1576
- <el-select
1577
- v-model="scanTypeValue"
1578
- class="w-full"
1579
- :disabled="isCopiedVideoCodec"
1580
- clearable
1581
- @change="(value) => setUndefined('scan', value)"
1582
- >
1583
- <el-option
1584
- v-for="(type) in optionScanType"
1585
- :key="type.value"
1586
- :value="type.value"
1587
- :label="type.value"
1588
- />
1589
- </el-select>
1590
- </el-form-item>
1591
- </div>
1592
- </el-collapse-item>
1593
- <el-collapse-item v-if="typeValue && !isPackage && encoderValue !== 'passthrough'" name="control">
1594
- <template #title>
1595
- <label class="flex items-center gap-2 text-16px font-semibold">
1596
- {{ $t('SSConfig.rate_control') }}
1597
- </label>
1598
- </template>
1599
-
1600
- <div v-if="typeValue === 'video'" class="flex flex-wrap gap-2">
1601
- <el-form-item label="Rate control mode" class="max-w-190px min-w-190px flex-1" v-bind="rateControlModeAttrs">
1602
- <template #label>
1603
- <SSInformationLabel label="Rate control mode" :info="schemaObj.rateControlMode" />
1604
- </template>
1605
- <el-select
1606
- v-model="rateControlModeValue"
1607
- class="max-w-190px min-w-190px flex-1"
1608
- :disabled="isCopiedVideoCodec"
1609
- clearable
1610
- @change="(value) => setUndefined('rateControlMode', value)"
1611
- >
1612
- <el-option
1613
- v-for="(type, idx) in [
1614
- 'cbr',
1615
- 'vbr',
1616
- ]"
1617
- :key="type + idx"
1618
- :value="type"
1619
- :label="type"
1620
- />
1621
- </el-select>
1622
- </el-form-item>
1623
-
1624
- <el-form-item label="Constant quality" class="max-w-190px min-w-190px flex-1" v-bind="cqAttrs">
1625
- <template #label>
1626
- <SSInformationLabel label="Constant quality" min-width="min-w-112px" :info="schemaObj.cq" />
1627
- </template>
1628
- <el-input-number
1629
- v-model="cqValue"
1630
- :controls="false"
1631
- :precision="0"
1632
- class="w-full [&_.el-input\_\_inner]:text-start"
1633
- :disabled="isCopiedVideoCodec || rateControlModeValue !== 'vbr'"
1634
- :min="0"
1635
- :max="51"
1636
- />
1637
- </el-form-item>
1638
- <el-form-item label="RC" class="max-w-190px min-w-190px flex-1" v-bind="rcAttrs">
1639
- <template #label>
1640
- <SSInformationLabel label="RC" :info="schemaObj.rc" />
1641
- </template>
1642
- <el-select
1643
- v-model="rcValue"
1644
- class="max-w-190px min-w-190px flex-1"
1645
- :disabled="isCopiedVideoCodec || isDisabledRc"
1646
- clearable
1647
- @change="(value) => setUndefined('rc', value)"
1648
- >
1649
- <el-option
1650
- v-for="(type, idx) in optionRc"
1651
- :key="type + idx"
1652
- :value="type"
1653
- :label="type"
1654
- />
1655
- </el-select>
1656
- </el-form-item>
1657
- <el-form-item v-if="encoderValue !== 'passthrough' && !isPackage" class="max-w-190px min-w-190px flex-1" v-bind="videoRateAttrs">
1658
- <template #label>
1659
- <SSInformationLabel label="Bitrate" :info="schemaObj.videoBitrate" />
1660
- </template>
1661
- <el-input
1662
- v-model="videoRateValue"
1663
- class="max-w-190px min-w-190px flex-1"
1664
- :disabled="isCopiedVideoCodec"
1665
- :formatter="formatter"
1666
- :parser="parser"
1667
- />
1668
- </el-form-item>
1669
- <el-form-item v-bind="minrateAttrs" class="max-w-190px min-w-190px flex-1">
1670
- <template #label>
1671
- <SSInformationLabel label="Minrate" :info="schemaObj.minrate" />
1672
- </template>
1673
- <el-input
1674
- v-model="minrateValue"
1675
- class="max-w-190px min-w-190px flex-1"
1676
- :disabled="isCopiedVideoCodec"
1677
- :formatter="formatter"
1678
- :parser="parser"
1679
- />
1680
- </el-form-item>
1681
-
1682
- <el-form-item v-bind="maxrateAttrs" class="max-w-190px min-w-190px flex-1">
1683
- <template #label>
1684
- <SSInformationLabel label="Maxrate" :info="schemaObj.maxrate" />
1685
- </template>
1686
- <el-input
1687
- v-model="maxrateValue"
1688
- class="max-w-190px min-w-190px flex-1"
1689
- :disabled="isCopiedVideoCodec"
1690
- :formatter="formatter"
1691
- :parser="parser"
1692
- />
1693
- </el-form-item>
1694
- <el-form-item v-bind="bufsizeAttrs" class="max-w-190px min-w-190px flex-1">
1695
- <template #label>
1696
- <SSInformationLabel label="Bufsize" :info="schemaObj.bufsize" />
1697
- </template>
1698
- <el-input
1699
- v-model="bufsizeValue"
1700
- class="max-w-190px min-w-190px flex-1"
1701
- :disabled="isCopiedVideoCodec"
1702
- :formatter="formatter"
1703
- :parser="parser"
1704
- />
1705
- </el-form-item>
1706
- </div>
1707
- <div v-if="typeValue === 'audio'" class="flex flex-wrap gap-2">
1708
- <el-form-item class="max-w-190px min-w-190px flex-1" v-bind="audioRateAttrs">
1709
- <template #label>
1710
- <SSInformationLabel label="Bitrate" :info="schemaObj.audioBitrate" />
1711
- </template>
1712
- <el-input
1713
- v-model="audioRateValue"
1714
- class="max-w-190px min-w-190px flex-1"
1715
- :disabled="isCopiedVideoCodec"
1716
- :formatter="formatter"
1717
- :parser="parser"
1718
- />
1719
- </el-form-item>
1720
-
1721
- <el-form-item
1722
- v-if="!isPackage"
1723
- class="max-w-190px min-w-190px flex-1"
1724
- label="Sample rate"
1725
- v-bind="sampleRateAttrs"
1726
- >
1727
- <template #label>
1728
- <SSInformationLabel label="Sample rate" :info="schemaObj.sampleRate" />
1729
- </template>
1730
- <el-select
1731
- v-model="sampleRateValue"
1732
- :disabled="isCopiedAudioCodec"
1733
- class="w-full"
1734
- default-first-option
1735
- >
1736
- <el-option
1737
- v-for="(type, idx) in [44100, 48000]"
1738
- :key="type + idx"
1739
- :value="type"
1740
- :label="type"
1741
- />
1742
- </el-select>
1743
- </el-form-item>
1744
- <el-form-item
1745
- v-if="!isPackage"
1746
- class="max-w-190px min-w-190px flex-1"
1747
- label="Channel"
1748
- v-bind="channelAttrs"
1749
- >
1750
- <template #label>
1751
- <SSInformationLabel label="Channel" :info="schemaObj.channel" />
1752
- </template>
1753
- <el-select
1754
- v-model="channelValue"
1755
- :disabled="isCopiedAudioCodec"
1756
- class="w-full"
1757
- >
1758
- <el-option
1759
- v-for="(type, idx) in [1, 2, 6]"
1760
- :key="type + idx"
1761
- :value="type"
1762
- :label="type"
1763
- />
1764
- </el-select>
1765
- </el-form-item>
1766
- </div>
1767
- </el-collapse-item>
1768
- <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="color">
1769
- <template #title>
1770
- <label class="flex items-center gap-2 text-16px font-semibold">
1771
- {{ $t('SSConfig.color_space') }}
1772
- </label>
1773
- </template>
1774
-
1775
- <div class="flex gap-2">
1776
- <el-form-item label="Hdr" class="max-w-190px min-w-190px" v-bind="hdrAttrs">
1777
- <template #label>
1778
- <SSInformationLabel label="Hdr" :info="schemaObj.hdr" />
1779
- </template>
1780
- <el-select
1781
- v-model="hdrValue"
1782
- :disabled="isCopiedVideoCodec"
1783
- clearable
1784
- @change="(value) => setUndefined('hdr', value)"
1785
- >
1786
- <el-option
1787
- v-for="(type, idx) in ['COPY', 'NONE', 'HDR10', 'HLG10', 'PQ10']"
1788
- :key="type + idx"
1789
- :value="type"
1790
- :label="type"
1791
- />
1792
- </el-select>
1793
- </el-form-item>
1794
- </div>
1795
- </el-collapse-item>
1796
-
1797
- <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="gop">
1798
- <template #title>
1799
- <label for="" class="flex items-center gap-2 text-16px font-semibold">
1800
- {{ $t('SSConfig.gop_size') }}
1801
- </label>
1802
- </template>
1803
-
1804
- <div class="flex gap-2">
1805
- <el-form-item label="Bframe" class="max-w-190px min-w-190px" v-bind="bframeAttrs">
1806
- <template #label>
1807
- <SSInformationLabel label="Bframe" :info="schemaObj.bframe" />
1808
- </template>
1809
- <el-input-number
1810
- v-model="bframeValue"
1811
- class="w-full [&_.el-input\_\_inner]:text-start"
1812
- :disabled="isCopiedVideoCodec"
1813
- :controls="false"
1814
- :precision="1"
1815
- :step="0.1"
1816
- :max="3"
1817
- :min="0"
1818
- />
1819
- </el-form-item>
1820
- <el-form-item label="Gop structure mode" class="max-w-190px min-w-190px" v-bind="gopModeAttrs">
1821
- <template #label>
1822
- <SSInformationLabel label="Gop structure mode" :info="schemaObj.gopMode" />
1823
- </template>
1824
- <el-select
1825
- v-model="gopModeValue"
1826
- class="w-full"
1827
- :disabled="isCopiedVideoCodec"
1828
- clearable
1829
- @change="gopValue = undefined"
1830
- >
1831
- <el-option
1832
- v-for="(type, idx) in optionGopMode"
1833
- :key="type + idx"
1834
- :value="type.value"
1835
- :label="type.label"
1836
- />
1837
- </el-select>
1838
- </el-form-item>
1839
- <el-form-item label="Gop size" class="max-w-190px min-w-190px" v-bind="gopAttrs">
1840
- <template #label>
1841
- <SSInformationLabel label="Gop size" :info="schemaObj.gopMode" />
1842
- </template>
1843
- <el-input
1844
- v-model="gopValue"
1845
- :disabled="isCopiedVideoCodec || isDisabledGopSize"
1846
- :formatter="formatter"
1847
- :parser="parser"
1848
- />
1849
- </el-form-item>
1850
- <el-form-item label="FixedGOP" class="max-w-190px min-w-190px" v-bind="fixedGOPAttrs">
1851
- <template #label>
1852
- <SSInformationLabel label="FixedGOP" :info="schemaObj.fixedGOP" />
1853
- </template>
1854
- <el-switch
1855
- v-model="fixedGOPValue"
1856
- :disabled="disabledWithPTEConfig"
1857
- />
1858
- </el-form-item>
1859
- </div>
1860
- </el-collapse-item>
1861
- <el-collapse-item v-if="typeValue === 'audio'" name="other">
1862
- <template #title>
1863
- <label class="flex items-center gap-2 text-16px font-semibold">
1864
- {{ $t('SSConfig.other') }}
1865
- </label>
1866
- </template>
1867
-
1868
- <div class="flex flex-wrap gap-2">
1869
- <el-form-item class="max-w-190px min-w-190px" v-bind="groupIdAttrs">
1870
- <template #label>
1871
- <SSInformationLabel :label="$t('general.groupId')" :info="schemaObj.name" />
1872
- </template>
1873
- <el-input
1874
- v-model="groupIdValue"
1875
- :placeholder="$t('library_preset.enter_group_id')"
1876
- autocomplete="off"
1877
- clearable
1878
- :maxlength="50"
1879
- show-word-limit
1880
- />
1881
- </el-form-item>
1882
- <el-form-item
1883
- v-if="!isPackage"
1884
- class="max-w-190px min-w-190px"
1885
- label="Volume"
1886
- v-bind="volumeAttrs"
1887
- >
1888
- <template #label>
1889
- <SSInformationLabel label="Volume" :info="schemaObj.volume" />
1890
- </template>
1891
- <el-select
1892
- v-model="volumeValue"
1893
- :disabled="isCopiedAudioCodec"
1894
- class="w-full"
1895
- default-first-option
1896
- clearable
1897
- @change="(value) => setUndefined('volume', value)"
1898
- >
1899
- <el-option
1900
- v-for="(type, idx) in ['+5dB', '-10dB', '0.5', '2', 'loudnorm']"
1901
- :key="type + idx"
1902
- :value="type"
1903
- :label="type"
1904
- />
1905
- </el-select>
1906
- </el-form-item>
1907
- <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.language')" v-bind="languageAttrs">
1908
- <template #label>
1909
- <SSInformationLabel :label="$t('profile.language')" :info="schemaObj.language" />
1910
- </template>
1911
- <el-select-v2
1912
- v-model="languageValue"
1913
- :options="optionsLang"
1914
- placeholder="Select"
1915
- />
1916
- </el-form-item>
1917
- <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.label')" v-bind="labelAttrs">
1918
- <template #label>
1919
- <SSInformationLabel :label="$t('profile.label')" :info="schemaObj.label" />
1920
- </template>
1921
- <el-input
1922
- v-model="labelValue"
1923
- :disabled="isCopiedAudioCodec && !isPackage"
1924
- :placeholder="$t('profile.placeholder_label')"
1925
- autocomplete="off"
1926
- clearable
1927
- show-word-limit
1928
- maxlength="50"
1929
- @change="(value) => setUndefined('label', value)"
1930
- />
1931
- </el-form-item>
1932
- <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.default')" v-bind="defaultAttrs">
1933
- <template #label>
1934
- <SSInformationLabel :label="$t('profile.default')" :info="schemaObj.audioDefault" />
1935
- </template>
1936
- <el-switch
1937
- v-model="defaultValue"
1938
- />
1939
- </el-form-item>
1940
- </div>
1941
- </el-collapse-item>
1942
- </el-collapse>
1943
- </template>
1944
- <DevOnly>
1945
- <el-button @click="fillVideo">
1946
- Fill Video
1947
- </el-button>
1948
- <el-button @click="fillAudio">
1949
- Fill Audio
1950
- </el-button>
1951
- <el-button @click="fillData">
1952
- Fill Data
1953
- </el-button>
1954
- </DevOnly>
1955
-
1956
- <SSRecommendedConfigurationPTE v-if="isVisibleRecommend" v-model:visible="isVisibleRecommend" @apply-config="handleApplyConfig" />
1957
- </template>
1
+ <script lang="ts" setup>
2
+ import { langOptions } from '../../constants/languageCode'
3
+
4
+ const { schemaObj } = useAsyncSchema('/api/transcode/api-docs-json', 'CreatePresetDto')
5
+ const { schemaObj: schemaSCTE35 } = useAsyncSchema('/api/transcode/api-docs-json', 'PresetScte35OverwriteDto')
6
+
7
+ const { defaultMediaType, isPackage, prop, encoderOptions, videoCodecs, mode, isConfigEncoder, isShowType, scte35 } = definePropsRefs<{
8
+ defaultMediaType?: 'video' | 'audio' | 'data'
9
+ isPackage?: boolean
10
+ prop?: string
11
+ videoCodecs?: Record<string, string>
12
+ encoderOptions?: any
13
+ mode?: 'create' | 'edit' | 'clone'
14
+ isConfigEncoder?: boolean
15
+ isShowType?: boolean
16
+ scte35?: boolean
17
+ }>()
18
+
19
+ const { t } = useI18n()
20
+ const { formRef } = useElFormContext()
21
+
22
+ function getProp(key: string) {
23
+ return () => prop.value ? `${prop.value}.${key}` : key
24
+ }
25
+
26
+ const encoderIdValue = ref(inject('encoderIdValue'))
27
+ const mappingEncoder = {
28
+ open_h264: 'OpenH264',
29
+ open_hevc: 'OpenHEVC',
30
+ nvenc: 'NVENC',
31
+ passthrough: 'Passthrough',
32
+ }
33
+
34
+ const triggerAction = ref(inject('triggerAction'))
35
+ const optionsEncoder = computed(() => {
36
+ if (encoderOptions.value) {
37
+ return encoderOptions.value
38
+ }
39
+ const value = encoderIdValue.value
40
+
41
+ // TH1: encoderIdValue === -1
42
+ if ((value === -1 || value === 'cpu') && triggerAction.value !== 'edit') {
43
+ return [
44
+ { label: 'OpenH264', value: 'open_h264' },
45
+ { label: 'OpenHEVC', value: 'open_hevc' },
46
+ { label: 'Passthrough', value: 'passthrough' },
47
+ ]
48
+ }
49
+
50
+ // TH2: encoderIdValue là null, undefined, '' hoặc bất kỳ giá trị nào khác
51
+ if (value === null || value === undefined || value === '' || triggerAction.value === 'edit') {
52
+ return [
53
+ { label: 'OpenH264', value: 'open_h264' },
54
+ { label: 'OpenHEVC', value: 'open_hevc' },
55
+ { label: 'NVENC', value: 'nvenc' },
56
+ // { label: 'Aurora4', value: 'aurora4' },
57
+ { label: 'Passthrough', value: 'passthrough' },
58
+ ]
59
+ }
60
+
61
+ // Mặc định cho các giá trị khác (ví dụ: 0, 1, 2, 3,...)
62
+ return [
63
+ { label: 'NVENC', value: 'nvenc' },
64
+ { label: 'Passthrough', value: 'passthrough' },
65
+ ]
66
+ })
67
+
68
+ function findFirstMatchingEncoder(options) {
69
+ return options?.find(item =>
70
+ optionsEncoder.value?.some(option => option.value === item),
71
+ )
72
+ }
73
+
74
+ const profilesValue = ref(inject('profilesValue'))
75
+ function areAllEncoderTypesSame(profiles, newEncoderType?: string) {
76
+ const encoderTypes = newEncoderType ? [newEncoderType] : []
77
+
78
+ for (const profile of profiles) {
79
+ for (const preset of profile.presets || []) {
80
+ if (preset.encoderType)
81
+ encoderTypes.push(preset.encoderType)
82
+ }
83
+ }
84
+
85
+ if (encoderTypes.length === 0)
86
+ return true
87
+
88
+ return encoderTypes?.filter(Boolean)?.every(type => type === encoderTypes[0])
89
+ }
90
+
91
+ const isVisibleRecommend = ref(false)
92
+ const [typeValue, typeAttrs] = useElField<string>(getProp('type'), [
93
+ {
94
+ required: true,
95
+ message: t('library_preset.type_is_required'),
96
+ },
97
+ ])
98
+ const [encoderValue, encoderAttrs] = useElField<string | undefined>(getProp('encoderType'), [
99
+ {
100
+ required: true,
101
+ trigger: ['blur', 'change'],
102
+ validator: (_rule, value: string, callback: any) => {
103
+ const encoderTypes = profilesValue.value?.flatMap(profile =>
104
+ (profile.presets || []).map(preset => preset.encoderType),
105
+ )
106
+ const commonEncoder = findFirstMatchingEncoder(encoderTypes)
107
+
108
+ if (!value || value.trim().length === 0) {
109
+ callback(new Error(t('library_preset.preset_encoder_is_required')))
110
+ }
111
+ else if (!optionsEncoder.value.some(option => option.value === value)) {
112
+ callback(new Error(t('base_library.encoder_not_supported_please_select_encoder_again')))
113
+ }
114
+ else if (profilesValue.value && triggerAction.value !== 'edit' && value !== commonEncoder && !areAllEncoderTypesSame(profilesValue.value, value)) {
115
+ if (commonEncoder && encoderTypes.length > 0)
116
+ callback(new Error(t('base_libray.all_profiles_must_have_the_same_video_encoder_data_please_proceed_with_data_sync', [mappingEncoder[commonEncoder] ? `, ${$t('base_library.currently_is')} ${mappingEncoder[commonEncoder]}` : ''])))
117
+ else
118
+ callback(new Error($t('base_library.the_encoder_of_the_profile_that_was_previously_created_or_taken_from_the_template_is_not_supported_please_re-select_a_valid_encoder_outside_the_channel_configuration')))
119
+ }
120
+ else {
121
+ callback()
122
+ }
123
+ callback()
124
+ },
125
+ },
126
+ ])
127
+ const [presetValue, presetAttrs] = useElField<string | undefined>(getProp('videoPreset'), [
128
+ {
129
+ required: true,
130
+ message: t('library_preset.preset_is_required'),
131
+ },
132
+ ])
133
+ const [nameValue, nameAttrs] = useElField<string>(getProp('name'), [
134
+ {
135
+ required: true,
136
+ validator: nameValidatorLow(t('library_preset.name')),
137
+ trigger: ['blur', 'change'],
138
+ },
139
+ ])
140
+ const [groupIdValue, groupIdAttrs] = useElField<string>(getProp('audioGroup'), [
141
+ {
142
+ validator: (rule, value, callback) => {
143
+ if (!/^[\w-\s]*$/.test(value))
144
+ callback(new Error(t('library_preset.group_id')))
145
+ else
146
+ callback()
147
+ },
148
+ trigger: ['blur', 'change'],
149
+ },
150
+ ])
151
+ const [defaultPTEValue, defaultPTEAttrs] = useElField(getProp('pteEnabled'), [])
152
+ const [vmafMaxValue, vmafMaxAttrs] = useElField(getProp('vmafMax'), [
153
+ {
154
+ trigger: ['blur', 'change'],
155
+ required: true,
156
+ validator: (rule, value, callback) => {
157
+ if (!value)
158
+ callback(new Error(t('base_libarry.please_input_vmafmax')))
159
+ else if (value < 89 || value > 96)
160
+ callback(new Error(t('base_library.vmafmax_must_not_be_less_than_89_and_greater_than_96')))
161
+ else
162
+ callback()
163
+ },
164
+ },
165
+ ], { enabled: defaultPTEValue })
166
+ const [vmafMinValue, vmafMinAttrs] = useElField(getProp('vmafMin'), [
167
+ {
168
+ trigger: ['blur', 'change'],
169
+ required: true,
170
+ validator: (rule, value, callback) => {
171
+ if (!value)
172
+ callback(new Error(t('base_libarry.please_input_vmafmin')))
173
+ else if (value < 89 || value > 96)
174
+ callback(new Error(t('base_library.vmafmin_must_not_be_less_than_89_and_greater_than_96')))
175
+ else
176
+ callback()
177
+ },
178
+ },
179
+ ], { enabled: defaultPTEValue })
180
+ const [vmafThresValue, vmafThresAttrs] = useElField(getProp('vmafThres'), [
181
+ {
182
+ required: true,
183
+ validator: (rule, value, callback) => {
184
+ if (!value)
185
+ callback(new Error(t('base_libarry.please_input_vmafthres')))
186
+ else
187
+ callback()
188
+ },
189
+ trigger: ['blur', 'change'],
190
+ },
191
+ ], { enabled: defaultPTEValue })
192
+
193
+ const [videoCodecValue, videoCodecAttrs] = useElField<string | undefined>(getProp('videoCodec'), [
194
+ {
195
+ validator: (rule, value, callback) => {
196
+ if (!value)
197
+ callback(new Error(t('please_select_codec')))
198
+ else
199
+ callback()
200
+ },
201
+ trigger: ['blur', 'change'],
202
+ required: true,
203
+ },
204
+ ])
205
+ const [audioCodecValue, audioCodecAttrs] = useElField<string | undefined>(getProp('audioCodec'), [
206
+ {
207
+ validator: (rule, value, callback) => {
208
+ if (!value)
209
+ callback(new Error(t('please_select_codec')))
210
+ else
211
+ callback()
212
+ },
213
+ trigger: ['blur', 'change'],
214
+ required: true,
215
+ },
216
+ ])
217
+ const [dataCodecValue, dataCodecAttrs] = useElField<string | undefined>(getProp('dataCodec'), [
218
+ {
219
+ validator: (rule, value, callback) => {
220
+ if (!value)
221
+ callback(new Error(t('please_select_codec')))
222
+ else
223
+ callback()
224
+ },
225
+ trigger: ['blur', 'change'],
226
+ required: true,
227
+ },
228
+ ])
229
+
230
+ const enableValid = computed(() => {
231
+ return !!(audioCodecValue.value !== 'copy') as boolean
232
+ })
233
+ const [descriptionValue, descriptionAttrs] = useElField<string>(getProp('description'), [
234
+ {
235
+ validator: (rule, value, callback) => {
236
+ if (!/^[\w-\s]*$/.test(value))
237
+ callback(new Error(t('description.format_description')))
238
+ else
239
+ callback()
240
+ },
241
+ trigger: ['blur', 'change'],
242
+ },
243
+ ])
244
+
245
+ const [minrateValue, minrateAttrs] = useElField<number | undefined>(getProp('minrate'), [
246
+ {
247
+ trigger: ['blur', 'change'],
248
+ validator: (rule, value, callback) => {
249
+ if (typeValue.value === 'video' && (convertStringToNumber(value || 0) < 64000))
250
+ callback(new Error($t('minrate_khong_duoc_lon_hon_bitrate')))
251
+ else if (typeValue.value === 'video' && (convertStringToNumber(value) < 64000))
252
+ callback(new Error($t('minrate_khong_duoc_lon_hon_bitrate')))
253
+ else
254
+ callback()
255
+ },
256
+ },
257
+ ])
258
+
259
+ const [videoRateValue, videoRateAttrs] = useElField<number | undefined>(getProp('videoBitrate'), [
260
+ {
261
+ required: true,
262
+ trigger: ['blur', 'change'],
263
+ validator: (rule, value, callback) => {
264
+ if (!value)
265
+ callback(new Error(t('library_preset.video_is_required')))
266
+ else if (convertStringToNumber(minrateValue.value || 0) >= convertStringToNumber(value))
267
+ callback(new Error($t('bitrate_khong_duoc_be_hon_minrate')))
268
+ else if (convertStringToNumber(value) > 60000000)
269
+ callback(new Error($t('bitrate_khong_duoc_lon_hon_60m')))
270
+ else
271
+ callback()
272
+ },
273
+ },
274
+ ])
275
+ const [audioRateValue, audioRateAttrs] = useElField<number>(getProp('audioBitrate'), [
276
+ {
277
+ required: true,
278
+ trigger: ['blur', 'change'],
279
+ validator: (rule, value, callback) => {
280
+ if (!value)
281
+ callback(new Error(t('library_preset.bitrate_is_required')))
282
+
283
+ else if (convertStringToNumber(value) < 32000 || convertStringToNumber(value) > 2000000)
284
+ callback(new Error($t('SSConfig.audiorate_khong_duoc_be_hon_minrate')))
285
+ else
286
+ callback()
287
+ },
288
+ },
289
+ ])
290
+ const [maxrateValue, maxrateAttrs] = useElField<number | undefined>(getProp('maxrate'), [
291
+ {
292
+ trigger: ['blur', 'change'],
293
+ validator: (rule, value, callback) => {
294
+ if (convertStringToNumber(value || 0) < 64000)
295
+ callback(new Error(t('base_library.maxrate_cannot_be_less_than_64000')))
296
+ else if (convertStringToNumber(videoRateValue.value || 0) > convertStringToNumber(value || 0))
297
+ callback(new Error($t('SSConfig.maxrate_khong_duoc_lon_hon_bitrate')))
298
+ else if (convertStringToNumber(value) > 60000000)
299
+ callback(new Error($t('SSConfig.maxrate_khong_duoc_lon_hon_60m')))
300
+ else
301
+ callback()
302
+ },
303
+ },
304
+ ])
305
+ const [fpsValue, fpsAttrs] = useElField<number | undefined>(getProp('fps'), [
306
+ {
307
+ required: true,
308
+ trigger: ['blur', 'change'],
309
+ validator: (rule, value, callback) => {
310
+ if (!value) {
311
+ callback(new Error($t('SSConfig.fps_is_required')))
312
+ }
313
+ else if (convertStringToNumber(value) < 10 || convertStringToNumber(value) > 60) {
314
+ callback(new Error($t('SSConfig.fps_less_10_greater_60')))
315
+ }
316
+ else {
317
+ callback()
318
+ }
319
+ },
320
+ },
321
+ ])
322
+ const [widthValue, widthAttrs] = useElField<number | undefined>(getProp('width'), [
323
+ {
324
+ required: true,
325
+ trigger: ['blur', 'change'],
326
+ validator: (rule, value, callback) => {
327
+ if (!value && value !== 0) {
328
+ callback(new Error($t('SSConfig.width_is_required')))
329
+ }
330
+ else if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 7680) {
331
+ callback(new Error($t('SSConfig.width_less_0_greater_7680')))
332
+ }
333
+ else {
334
+ callback()
335
+ }
336
+ },
337
+ },
338
+ ])
339
+ const [heightValue, heightAttrs] = useElField<number | undefined>(getProp('height'), [
340
+ {
341
+ required: true,
342
+ trigger: ['blur', 'change'],
343
+ validator: (rule, value, callback) => {
344
+ if (!value && value !== 0) {
345
+ callback(new Error($t('SSConfig.height_is_required')))
346
+ }
347
+ else if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 4320) {
348
+ callback(new Error($t('SSConfig.height_less_0_greater_7680')))
349
+ }
350
+ else {
351
+ callback()
352
+ }
353
+ },
354
+ },
355
+ ])
356
+
357
+ const [aspectRatioModeValue, aspectRatioModeAttrs] = useElField<string>(getProp('aspectRatioMode'), [])
358
+ const isRequiredAspect = computed(() => {
359
+ return aspectRatioModeValue.value === 'custom'
360
+ })
361
+ const [aspectRatioWidthValue, aspectRatioWidthAttrs] = useElField<number | undefined>(getProp('aspectRatioWidth'), [
362
+ {
363
+ required: true,
364
+ trigger: ['blur', 'change'],
365
+ validator: (rule, value, callback) => {
366
+ if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 1000) {
367
+ callback(new Error($t('ratio_width_less_0_greater_1000')))
368
+ }
369
+ else {
370
+ callback()
371
+ }
372
+ },
373
+ },
374
+ ], { enabled: isRequiredAspect })
375
+ const [aspectRatioHeightValue, aspectRatioHeightAttrs] = useElField<number | undefined>(getProp('aspectRatioHeight'), [
376
+ {
377
+ required: true,
378
+ trigger: ['blur', 'change'],
379
+ validator: (rule, value, callback) => {
380
+ if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 1000) {
381
+ callback(new Error($t('ratio_height_less_0_greater_1000')))
382
+ }
383
+ else {
384
+ callback()
385
+ }
386
+ },
387
+ },
388
+ ], { enabled: isRequiredAspect })
389
+ const [bframeValue, bframeAttrs] = useElField<number | undefined>(getProp('bframe'), [])
390
+ const [pixelFormatValue, pixelFormatAttrs] = useElField<string | undefined>(getProp('pixelFormat'), [])
391
+ const [scaleTypeValue, scaleTypeAttrs] = useElField<string | undefined>(getProp('scaleType'), [])
392
+ const [scanTypeValue, scanTypeAttrs] = useElField<string | undefined>(getProp('scanType'), [])
393
+ const [rateControlModeValue, rateControlModeAttrs] = useElField<string | undefined>(getProp('rateControlMode'), [])
394
+ const [rcValue, rcAttrs] = useElField<string | undefined>(getProp('rc'), [])
395
+ const [gopModeValue, gopModeAttrs] = useElField<string | undefined>(getProp('gopMode'), [])
396
+ const [fixedGOPValue, fixedGOPAttrs] = useElField<boolean | undefined>(getProp('fixedGOP'), [])
397
+ const isRequiredGopSize = computed(() => {
398
+ return gopModeValue.value === 'fixed_frame' || gopModeValue.value === 'fixed_second'
399
+ })
400
+ const [gopValue, gopAttrs] = useElField<string | undefined>(getProp('gopValue'), [
401
+ {
402
+ required: true,
403
+ trigger: ['blur', 'change'],
404
+ validator: (rule, value, callback) => {
405
+ if (!value && (gopModeValue.value === 'fixed_frame' || gopModeValue.value === 'fixed_second')) {
406
+ callback(new Error($t('SSConfig.gop_value_required')))
407
+ }
408
+ else if (gopModeValue.value === 'fixed_frame' && (convertStringToNumber(value) < 17 || convertStringToNumber(value) > 300)) {
409
+ callback(new Error($t('SSConfig.gopsize_cannot_be_less_than_17_and_greater_than_300')))
410
+ }
411
+ else if (gopModeValue.value === 'fixed_second' && (convertStringToNumber(value) < 1 || convertStringToNumber(value) > 16)) {
412
+ callback(new Error($t('SSConfig.second_cannot_be_less_than_17_and_greater_than_300')))
413
+ }
414
+ else {
415
+ callback()
416
+ }
417
+ },
418
+ },
419
+ ], {
420
+ enabled: isRequiredGopSize,
421
+ })
422
+ const [bufsizeValue, bufsizeAttrs] = useElField<number | undefined>(getProp('bufsize'), [
423
+ {
424
+ trigger: ['blur', 'change'],
425
+ validator: (rule, value, callback) => {
426
+ if (convertStringToNumber(value) < 10000 || convertStringToNumber(value) > 60000000) {
427
+ callback(new Error($t('SSConfig.buffsize_cannot_be_less_than_64000_and_greater_than_60000000')))
428
+ }
429
+ else {
430
+ callback()
431
+ }
432
+ },
433
+ },
434
+ ])
435
+ const [hdrValue, hdrAttrs] = useElField<string | undefined>(getProp('hdr'), [])
436
+ const [cqValue, cqAttrs] = useElField<number | undefined>(getProp('cq'), [
437
+ {
438
+ trigger: ['blur', 'change'],
439
+ validator: (rule, value, callback) => {
440
+ if (convertStringToNumber(value) < 0 || convertStringToNumber(value) > 51) {
441
+ callback(new Error($t('SSConfig.cbr_less_0_greater_51')))
442
+ }
443
+ else {
444
+ callback()
445
+ }
446
+ },
447
+ },
448
+ ])
449
+
450
+ // Audio
451
+ const [sampleRateValue, sampleRateAttrs] = useElField<number | undefined>(getProp('sampleRate'), [])
452
+ const [channelValue, channelAttrs] = useElField<number | undefined>(getProp('channel'), [
453
+ {
454
+ required: true,
455
+ message: t('library_preset.preset_channel'),
456
+ trigger: ['blur', 'change'],
457
+ },
458
+ ], {
459
+ enabled: enableValid,
460
+ })
461
+ const [profileValue, profileAttrs] = useElField<string | undefined>(getProp('videoProfile'), [])
462
+ const [audioProfileValue, audioProfileAttrs] = useElField<string | undefined>(getProp('audioProfile'), [])
463
+ const [levelValue, levelAttrs] = useElField<string | undefined>(getProp('videoLevel'), [])
464
+ const [volumeValue, volumeAttrs] = useElField<string | undefined>(getProp('volume'), [])
465
+ const [languageValue, languageAttrs] = useElField<string | undefined>(getProp('language'), [])
466
+ const [labelValue, labelAttrs] = useElField<string | undefined>(getProp('label'), [])
467
+ const [defaultValue, defaultAttrs] = useElField<boolean | undefined>(getProp('audioDefault'), [])
468
+ const [scte35OverwriteConfigValue] = useElField(getProp('scte35OverwriteConfig'), [])
469
+ const isCopiedVideoCodec = computed(() => {
470
+ return videoCodecValue.value === 'copy'
471
+ })
472
+
473
+ const isCopiedAudioCodec = computed(() => {
474
+ return audioCodecValue.value === 'copy'
475
+ })
476
+ const isCreateChannel = ref(inject('isCreateChannel'))
477
+
478
+ function fillAudio() {
479
+ typeValue.value = 'audio'
480
+ nameValue.value = nameValue.value ?? ''
481
+ descriptionValue.value = descriptionValue.value ?? ''
482
+
483
+ audioCodecValue.value = 'aac'
484
+ videoCodecValue.value = undefined
485
+ dataCodecValue.value = undefined
486
+ audioProfileValue.value = undefined
487
+ profileValue.value = undefined
488
+ levelValue.value = undefined
489
+ rcValue.value = undefined
490
+ audioRateValue.value = 32000
491
+ videoRateValue.value = undefined
492
+ sampleRateValue.value = 44100
493
+ groupIdValue.value = undefined
494
+ defaultValue.value = undefined
495
+ minrateValue.value = undefined
496
+ maxrateValue.value = undefined
497
+ presetValue.value = undefined
498
+ fpsValue.value = undefined
499
+ widthValue.value = undefined
500
+ heightValue.value = undefined
501
+ pixelFormatValue.value = undefined
502
+ bframeValue.value = undefined
503
+ scaleTypeValue.value = undefined
504
+ scanTypeValue.value = undefined
505
+ gopModeValue.value = undefined
506
+ fixedGOPValue.value = undefined
507
+ rateControlModeValue.value = undefined
508
+ cqValue.value = undefined
509
+ channelValue.value = 2
510
+ volumeValue.value = undefined
511
+ languageValue.value = undefined
512
+ labelValue.value = undefined
513
+ defaultPTEValue.value = undefined
514
+ vmafMaxValue.value = undefined
515
+ vmafMinValue.value = undefined
516
+ vmafThresValue.value = undefined
517
+ }
518
+
519
+ function fillVideo() {
520
+ typeValue.value = 'video'
521
+ nameValue.value = nameValue.value ?? ''
522
+ descriptionValue.value = descriptionValue.value ?? ''
523
+ audioCodecValue.value = undefined
524
+ videoCodecValue.value = 'h264'
525
+ dataCodecValue.value = undefined
526
+ encoderValue.value = (encoderIdValue.value !== -1 && encoderIdValue.value !== null && encoderIdValue.value !== undefined && encoderIdValue.value !== '') ? 'nvenc' : 'open_h264'
527
+ presetValue.value = (encoderIdValue.value !== -1 && encoderIdValue.value !== null && encoderIdValue.value !== undefined && encoderIdValue.value !== '') ? 'llhp' : 'veryfast'
528
+ videoRateValue.value = 4000000
529
+ rateControlModeValue.value = 'vbr'
530
+ minrateValue.value = undefined
531
+ maxrateValue.value = undefined
532
+ sampleRateValue.value = undefined
533
+ fpsValue.value = 25
534
+ widthValue.value = 1920
535
+ heightValue.value = 1080
536
+ pixelFormatValue.value = undefined
537
+ bframeValue.value = undefined
538
+ scaleTypeValue.value = undefined
539
+ scanTypeValue.value = 'progressive'
540
+ cqValue.value = undefined
541
+ gopModeValue.value = 'auto'
542
+ gopValue.value = undefined
543
+ fixedGOPValue.value = undefined
544
+ hdrValue.value = undefined
545
+ rcValue.value = undefined
546
+ channelValue.value = undefined
547
+ profileValue.value = undefined
548
+ levelValue.value = undefined
549
+ volumeValue.value = undefined
550
+ defaultPTEValue.value = undefined
551
+ vmafMaxValue.value = undefined
552
+ vmafMinValue.value = undefined
553
+ vmafThresValue.value = undefined
554
+ }
555
+
556
+ function fillData() {
557
+ typeValue.value = 'data'
558
+ nameValue.value = nameValue.value ?? ''
559
+ descriptionValue.value = descriptionValue.value ?? ''
560
+ dataCodecValue.value = 'copy'
561
+ audioCodecValue.value = undefined
562
+ videoCodecValue.value = undefined
563
+ minrateValue.value = undefined
564
+ maxrateValue.value = undefined
565
+ sampleRateValue.value = undefined
566
+ fpsValue.value = undefined
567
+ widthValue.value = undefined
568
+ heightValue.value = undefined
569
+ rcValue.value = undefined
570
+ pixelFormatValue.value = undefined
571
+ bframeValue.value = undefined
572
+ scaleTypeValue.value = undefined
573
+ cqValue.value = undefined
574
+ channelValue.value = undefined
575
+ profileValue.value = undefined
576
+ levelValue.value = undefined
577
+ volumeValue.value = undefined
578
+ fixedGOPValue.value = undefined
579
+ defaultPTEValue.value = undefined
580
+ vmafMaxValue.value = undefined
581
+ vmafMinValue.value = undefined
582
+ vmafThresValue.value = undefined
583
+ }
584
+
585
+ const configPte = ref(inject('configPte'))
586
+ // disabled with PTE config
587
+ const disabledWithPTEConfig = computed(() => {
588
+ return isCreateChannel.value && defaultPTEValue.value && encoderValue.value === 'nvenc' && configPte.value?.pte?.enable
589
+ })
590
+
591
+ async function handleChangeType(type: string) {
592
+ if (type === 'data')
593
+ fillData()
594
+
595
+ else if (type === 'audio')
596
+ fillAudio()
597
+
598
+ else if (type === 'video')
599
+ fillVideo()
600
+
601
+ if (type === 'video')
602
+ await formRef.value?.validateField('videoBitrate')
603
+ else if (type === 'audio')
604
+ await formRef.value?.validateField('audioBitrate')
605
+ }
606
+
607
+ function setUndefined(type: string, value: any) {
608
+ switch (type) {
609
+ case 'volume':
610
+ !value ? volumeValue.value = undefined : volumeValue.value = value
611
+ break
612
+ case 'hdr':
613
+ !value ? hdrValue.value = undefined : hdrValue.value = value
614
+ break
615
+ case 'pixel':
616
+ !value ? pixelFormatValue.value = undefined : pixelFormatValue.value = value
617
+ break
618
+ case 'scale':
619
+ !value ? scaleTypeValue.value = undefined : scaleTypeValue.value = value
620
+ break
621
+ case 'scan':
622
+ !value ? scanTypeValue.value = undefined : scanTypeValue.value = value
623
+ break
624
+ case 'profile':
625
+ !value ? profileValue.value = undefined : profileValue.value = value
626
+ break
627
+ case 'audioProfile':
628
+ !value ? audioProfileValue.value = undefined : audioProfileValue.value = value
629
+ break
630
+ case 'level':
631
+ !value ? levelValue.value = undefined : levelValue.value = value
632
+ break
633
+ case 'label':
634
+ !value ? labelValue.value = undefined : labelValue.value = value
635
+ break
636
+ case 'rateControlMode':
637
+ !value ? rateControlModeValue.value = undefined : rateControlModeValue.value = value
638
+ rcValue.value = undefined
639
+ break
640
+ case 'rc':
641
+ !value ? rcValue.value = undefined : rcValue.value = value
642
+ break
643
+ }
644
+ }
645
+
646
+ const optionsPreset = computed(() => {
647
+ return encoderValue.value === 'nvenc'
648
+ ? [
649
+ {
650
+ label: 'SLOW',
651
+ value: 'slow',
652
+ },
653
+ {
654
+ label: 'MEDIUM',
655
+ value: 'medium',
656
+ },
657
+ {
658
+ label: 'FAST',
659
+ value: 'fast',
660
+ },
661
+ {
662
+ label: 'HP',
663
+ value: 'hp',
664
+ },
665
+ {
666
+ label: 'HQ',
667
+ value: 'hq',
668
+ },
669
+ {
670
+ label: 'BD',
671
+ value: 'bd',
672
+ },
673
+ {
674
+ label: 'LL',
675
+ value: 'll',
676
+ },
677
+ {
678
+ label: 'LLHQ',
679
+ value: 'llhq',
680
+ },
681
+ {
682
+ label: 'LLHP',
683
+ value: 'llhp',
684
+ },
685
+ ]
686
+ : [
687
+ {
688
+ label: 'MEDIUM',
689
+ value: 'medium',
690
+ },
691
+ {
692
+ label: 'FAST',
693
+ value: 'fast',
694
+ },
695
+ {
696
+ label: 'FASTER',
697
+ value: 'faster',
698
+ },
699
+ {
700
+ label: 'VERYFAST',
701
+ value: 'veryfast',
702
+ },
703
+ {
704
+ label: 'SUPERFAST',
705
+ value: 'superfast',
706
+ },
707
+ {
708
+ label: 'ULTRAFAST',
709
+ value: 'ultrafast',
710
+ },
711
+ ]
712
+ })
713
+
714
+ const codecSelection = computed(() => {
715
+ return {
716
+ video: (encoderValue.value === 'open_h264' || encoderValue.value === 'aurora4')
717
+ ? { H264: 'h264' }
718
+ : encoderValue.value === 'open_hevc'
719
+ ? { HEVC: 'hevc' }
720
+ : encoderValue.value === 'nvenc'
721
+ ? { H264: 'h264', HEVC: 'hevc' }
722
+ : { COPY: 'copy' },
723
+ audio: AUDIO_CODECS,
724
+ data: DATA_CODECS,
725
+ }[typeValue.value]
726
+ })
727
+
728
+ function defaultPTEConfig(_newValue) {
729
+ videoCodecValue.value = 'h264'
730
+ fixedGOPValue.value = false
731
+ if (_newValue) {
732
+ vmafMaxValue.value = 95
733
+ vmafMinValue.value = 91
734
+ vmafThresValue.value = 0.85
735
+ }
736
+ }
737
+
738
+ function getEncoderConfig(newEncoderType: string) {
739
+ const config = {
740
+ videoCodec: '',
741
+ videoPreset: '',
742
+ videoProfile: '',
743
+ videoLevel: '',
744
+ vmafMaxValue: undefined,
745
+ vmafMinValue: undefined,
746
+ vmafThresValue: undefined,
747
+ }
748
+
749
+ if (isPackage.value)
750
+ return config
751
+
752
+ switch (newEncoderType) {
753
+ case 'open_h264':
754
+ config.videoCodec = 'h264'
755
+ config.videoPreset = 'veryfast'
756
+ break
757
+ case 'open_hevc':
758
+ config.videoCodec = 'hevc'
759
+ config.videoPreset = 'veryfast'
760
+ break
761
+ case 'nvenc':
762
+ config.videoCodec = 'h264'
763
+ config.videoPreset = 'llhp'
764
+ if (isCreateChannel.value) {
765
+ config.vmafMaxValue = 95
766
+ config.vmafMinValue = 91
767
+ config.vmafThresValue = 0.85
768
+ }
769
+ break
770
+ case 'aurora4':
771
+ config.videoCodec = 'h264'
772
+ config.videoPreset = 'veryfast'
773
+ break
774
+ case 'passthrough':
775
+ config.videoCodec = 'copy'
776
+ break
777
+ }
778
+
779
+ return config
780
+ }
781
+
782
+ function updateAllEncoderTypes(newEncoderType: string) {
783
+ const config = getEncoderConfig(newEncoderType)
784
+
785
+ return profilesValue.value?.map((_profile) => {
786
+ const updatedPresets = _profile?.presets?.map(preset => ({
787
+ ...preset,
788
+ encoderType: newEncoderType,
789
+ videoPreset: config.videoPreset,
790
+ videoProfile: config.videoProfile,
791
+ videoLevel: config.videoLevel,
792
+ videoCodec: config.videoCodec,
793
+ }))
794
+ return {
795
+ ..._profile,
796
+ presets: updatedPresets,
797
+ }
798
+ })
799
+ }
800
+
801
+ const isVod = ref(inject('isVod'))
802
+ function handleChangeEncoder(newValue: string) {
803
+ const config = getEncoderConfig(newValue)
804
+ const isCheck = isVod.value ? !areAllEncoderTypesSame(profilesValue.value, newValue) : !areAllEncoderTypesSame(profilesValue.value)
805
+ if (profilesValue.value?.length > 0 && isCheck) {
806
+ ElMessageBox.alert(
807
+ $t('base_libray.less_than_strong_greater_than_all_profiles', [`<strong>${$t('base_libray.all_profiles_must_have_the_same_video_encoder_data')}</strong>`]),
808
+ $t('base_libray.encoder_sync'),
809
+ {
810
+ confirmButtonText: t('Actions.confirm'),
811
+ dangerouslyUseHTMLString: true,
812
+ showClose: false,
813
+ callback: () => {
814
+ profilesValue.value = updateAllEncoderTypes(newValue)
815
+ formRef.value.validate()
816
+ },
817
+ },
818
+ )
819
+ }
820
+ else {
821
+ formRef.value.validate()
822
+ }
823
+
824
+ defaultPTEValue.value = false
825
+
826
+ videoCodecValue.value = config.videoCodec
827
+ presetValue.value = config.videoPreset
828
+ profileValue.value = config.videoProfile
829
+ levelValue.value = config.videoLevel
830
+
831
+ vmafMaxValue.value = config.vmafMaxValue
832
+ vmafMinValue.value = config.vmafMinValue
833
+ vmafThresValue.value = config.vmafThresValue
834
+ }
835
+
836
+ function formatter(value: string) {
837
+ return value.replace(/\D/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, '.')
838
+ }
839
+
840
+ function parser(value: string) {
841
+ return Number.parseInt(value.replace(/\D/g, '').replace(/\$\s?|(\.*)/g, ''))
842
+ }
843
+
844
+ const activeNames = ref(['general', 'aspect', 'frame', 'control', 'color', 'gop', 'codec', 'other', 'scte35', 'output_aspect', 'pte'])
845
+
846
+ const optionsProfile = computed(() => {
847
+ return videoCodecValue.value === 'h264' ? ['baseline', 'main', 'high'] : videoCodecValue.value === 'hevc' ? ['main'] : []
848
+ })
849
+ const optionsLevel = computed(() => {
850
+ return videoCodecValue.value === 'h264' ? ['H264_LEVEL_5_2', 'H264_LEVEL_5_1', 'H264_LEVEL_5', 'H264_LEVEL_4_2', 'H264_LEVEL_4_1', 'H264_LEVEL_4', 'H264_LEVEL_3_2', 'H264_LEVEL_3_1', 'H264_LEVEL_3', 'H264_LEVEL_2_2', 'H264_LEVEL_2_1', 'H264_LEVEL_2', 'H264_LEVEL_1_3', 'H264_LEVEL_1_2', 'H264_LEVEL_1_1', 'H264_LEVEL_1'] : videoCodecValue.value === 'hevc' ? ['H265_LEVEL_6_2', 'H265_LEVEL_6_1', 'H265_LEVEL_6', 'H265_LEVEL_5_2', 'H265_LEVEL_5_1', 'H265_LEVEL_5', 'H265_LEVEL_4_1', 'H265_LEVEL_4', 'H265_LEVEL_3_1', 'H265_LEVEL_3', 'H265_LEVEL_2_1', 'H265_LEVEL_2', 'H265_LEVEL_1'] : []
851
+ })
852
+ const isDisabledGopSize = computed(() => {
853
+ return !!(gopModeValue.value === 'auto' || gopModeValue.value === 'from_source')
854
+ })
855
+ const isDisabledRc = computed(() => {
856
+ return !!(encoderValue.value !== 'nvenc') as boolean
857
+ })
858
+
859
+ const optionRc = computed(() => {
860
+ return rateControlModeValue.value === 'cbr' ? ['cbr_hq', 'cbr_hp'] : rateControlModeValue.value === 'vbr' ? ['vbr_hq', 'vbr_hp'] : []
861
+ })
862
+
863
+ const optionGopMode = [
864
+ { label: 'Auto', value: 'auto' },
865
+ { label: 'Source', value: 'from_source' },
866
+ { label: 'Seconds', value: 'fixed_second' },
867
+ { label: 'Frames', value: 'fixed_frame' },
868
+ ]
869
+
870
+ function handleChangeVideoCodec() {
871
+ profileValue.value = ''
872
+ levelValue.value = ''
873
+ }
874
+
875
+ const optionScanType = [
876
+ { label: 'Progressive mode', value: 'progressive' },
877
+ { label: 'Interlaced mode', value: 'interlaced' },
878
+ ]
879
+
880
+ const optionsLang = computed(() => {
881
+ return langOptions.value?.map(item => ({
882
+ label: `${item[0]} (${item[1]})`,
883
+ value: item[1],
884
+ }))
885
+ })
886
+
887
+ async function handleApplyConfig(_value) {
888
+ defaultPTEValue.value = true
889
+ nameValue.value = _value?.name
890
+ bframeValue.value = _value?.bframe
891
+ // encoderValue.value = _value?.encoder
892
+ pixelFormatValue.value = _value?.format
893
+ fpsValue.value = _value?.fps
894
+ maxrateValue.value = _value?.maxrate
895
+ profileValue.value = _value?.profile
896
+ presetValue.value = _value?.preset
897
+ videoCodecValue.value = 'h264'
898
+ fixedGOPValue.value = false
899
+
900
+ await formRef.value?.validate()
901
+ }
902
+ </script>
903
+
904
+ <template>
905
+ <template v-if="typeValue === 'data'">
906
+ <el-collapse
907
+ v-model="activeNames"
908
+ class="[&_.el-collapse-item\_\_content]:pb-0 [&_.el-collapse-item\_\_header]:(text-16px) ![&_.el-collapse-item\_\_header]:font-600"
909
+ >
910
+ <el-collapse-item name="general">
911
+ <template #title>
912
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
913
+ {{ $t('channel_input.general_information') }}
914
+ </label>
915
+ </template>
916
+ <div class="flex gap-2">
917
+ <el-form-item class="w-full" v-bind="nameAttrs">
918
+ <template #label>
919
+ <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
920
+ </template>
921
+ <el-input
922
+ v-model="nameValue"
923
+ :placeholder="$t('library_preset.enter_name')"
924
+ autocomplete="off"
925
+ clearable
926
+ :minlength="1"
927
+ :maxlength="50"
928
+ show-word-limit
929
+ />
930
+ </el-form-item>
931
+ <el-form-item v-if="isShowType" class="w-full" v-bind="typeAttrs">
932
+ <template #label>
933
+ <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
934
+ </template>
935
+ <el-select
936
+ v-model="typeValue"
937
+ class="w-full"
938
+ :disabled="!!defaultMediaType || mode === 'edit'"
939
+ @change="handleChangeType"
940
+ >
941
+ <el-option
942
+ v-for="(type, idx) in ['video', 'audio', 'data']"
943
+ :key="type + idx"
944
+ :value="type"
945
+ :label="type"
946
+ />
947
+ </el-select>
948
+ </el-form-item>
949
+ <el-form-item class="w-full" label="Codec" v-bind="dataCodecAttrs">
950
+ <template #label>
951
+ <SSInformationLabel label="Codec" :info="schemaObj.dataCodec" />
952
+ </template>
953
+ <el-select
954
+ v-model="dataCodecValue"
955
+ class="w-full"
956
+ default-first-option
957
+ :disabled="isPackage && typeValue !== 'data'"
958
+ >
959
+ <el-option
960
+ v-for="(type, idx) in codecSelection"
961
+ :key="type + idx"
962
+ :value="type"
963
+ :label="type"
964
+ />
965
+ </el-select>
966
+ </el-form-item>
967
+ </div>
968
+ </el-collapse-item>
969
+ <el-collapse-item v-if="scte35 && dataCodecValue === 'copy'" name="scte35">
970
+ <template #title>
971
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
972
+ Overwrite SCTE35
973
+ </label>
974
+ </template>
975
+
976
+ <div class="w-1/2 flex justify-between gap-2">
977
+ <el-form-item class="w-full">
978
+ <template #label>
979
+ <SSInformationLabel :label="$t('EventChannel.form.label.enable')" :info="schemaSCTE35.enabled" />
980
+ </template>
981
+ <el-switch
982
+ v-model="scte35OverwriteConfigValue.enabled"
983
+ />
984
+ </el-form-item>
985
+ <el-form-item class="w-full">
986
+ <template #label>
987
+ <SSInformationLabel :label="$t('fast_channel.duration')" :info="schemaSCTE35.overwriteDuration" />
988
+ </template>
989
+ <el-input-number
990
+ v-model="scte35OverwriteConfigValue.overwriteDuration"
991
+ :disabled="!scte35OverwriteConfigValue.enabled"
992
+ :min="1"
993
+ :max="180"
994
+ :precision="0"
995
+ class="w-full"
996
+ />
997
+ </el-form-item>
998
+
999
+ <el-form-item class="w-full" label="Delay">
1000
+ <template #label>
1001
+ <SSInformationLabel :label="$t('EventChannel.form.label.delay')" :info="schemaSCTE35.overwriteDelayTime" />
1002
+ </template>
1003
+ <el-input-number
1004
+ v-model="scte35OverwriteConfigValue.overwriteDelayTime"
1005
+ :disabled="!scte35OverwriteConfigValue.enabled"
1006
+ :min="0"
1007
+ :max="60"
1008
+ :precision="0"
1009
+ class="w-full"
1010
+ />
1011
+ </el-form-item>
1012
+ </div>
1013
+ </el-collapse-item>
1014
+ </el-collapse>
1015
+ </template>
1016
+ <template v-else>
1017
+ <div v-if="!typeValue && isShowType" class="flex gap-2">
1018
+ <el-form-item class="flex-1" v-bind="nameAttrs">
1019
+ <template #label>
1020
+ <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
1021
+ </template>
1022
+ <el-input
1023
+ v-model="nameValue"
1024
+ :placeholder="$t('library_preset.enter_name')"
1025
+ autocomplete="off"
1026
+ clearable
1027
+ :minlength="1"
1028
+ :maxlength="50"
1029
+ show-word-limit
1030
+ />
1031
+ </el-form-item>
1032
+ <el-form-item v-if="isShowType" class="flex-1" v-bind="typeAttrs">
1033
+ <template #label>
1034
+ <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
1035
+ </template>
1036
+ <el-select
1037
+ v-model="typeValue"
1038
+ class="w-full"
1039
+ :disabled="!!defaultMediaType || mode === 'edit'"
1040
+ @change="handleChangeType"
1041
+ >
1042
+ <el-option
1043
+ v-for="(type, idx) in ['video', 'audio', 'data']"
1044
+ :key="type + idx"
1045
+ :value="type"
1046
+ :label="type"
1047
+ />
1048
+ </el-select>
1049
+ </el-form-item>
1050
+ </div>
1051
+
1052
+ <el-collapse
1053
+ v-model="activeNames"
1054
+ class="[&_.el-collapse-item\_\_content]:pb-0 [&_.el-collapse-item\_\_header]:(text-16px) ![&_.el-collapse-item\_\_header]:font-600"
1055
+ >
1056
+ <el-collapse-item v-if="typeValue" name="general">
1057
+ <template #title>
1058
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
1059
+ {{ $t('SSConfig.general_information') }}
1060
+ </label>
1061
+ </template>
1062
+ <div class="flex flex-wrap gap-2">
1063
+ <el-form-item class="w-586px" v-bind="nameAttrs">
1064
+ <template #label>
1065
+ <SSInformationLabel :label="$t('general.name')" :info="schemaObj.name" />
1066
+ </template>
1067
+ <el-input
1068
+ v-model="nameValue"
1069
+ :placeholder="$t('library_preset.enter_name')"
1070
+ autocomplete="off"
1071
+ clearable
1072
+ :minlength="1"
1073
+ :maxlength="50"
1074
+ show-word-limit
1075
+ />
1076
+ </el-form-item>
1077
+ <el-form-item v-if="isShowType" class="max-w-190px min-w-190px" v-bind="typeAttrs">
1078
+ <template #label>
1079
+ <SSInformationLabel :label="$t('library_preset.type')" :info="schemaObj.type" />
1080
+ </template>
1081
+ <el-select
1082
+ v-model="typeValue"
1083
+ class="w-full"
1084
+ :disabled="!!defaultMediaType || mode === 'edit'"
1085
+ @change="handleChangeType"
1086
+ >
1087
+ <el-option
1088
+ v-for="(type, idx) in ['video', 'audio', 'data']"
1089
+ :key="type + idx"
1090
+ :value="type"
1091
+ :label="type"
1092
+ />
1093
+ </el-select>
1094
+ </el-form-item>
1095
+ <el-form-item v-if="isConfigEncoder && typeValue === 'video'" class="[&_.el-form-item\_\_content]:block" v-bind="encoderAttrs">
1096
+ <template #label>
1097
+ <SSInformationLabel :label="$t('library_preset.encoder')" :info="schemaObj.encoderType" />
1098
+ </template>
1099
+ <el-select
1100
+ v-model="encoderValue"
1101
+ :disabled="isPackage"
1102
+ class="max-w-190px min-w-190px"
1103
+ @change="handleChangeEncoder"
1104
+ >
1105
+ <el-option
1106
+ v-for="(e, idx) in optionsEncoder"
1107
+ :key="e + idx"
1108
+ :value="e.value"
1109
+ :label="e.label"
1110
+ />
1111
+ </el-select>
1112
+ </el-form-item>
1113
+ <el-form-item
1114
+ v-if="typeValue === 'video'"
1115
+ class="max-w-190px min-w-190px"
1116
+ label="Codec"
1117
+ v-bind="videoCodecAttrs"
1118
+ >
1119
+ <template #label>
1120
+ <SSInformationLabel label="Codec" :info="schemaObj.videoCodec" />
1121
+ </template>
1122
+ <el-select
1123
+ v-model="videoCodecValue"
1124
+ class="max-w-190px min-w-190px"
1125
+ default-first-option
1126
+ :disabled="(isPackage && typeValue !== 'data' || disabledWithPTEConfig)"
1127
+ @change="handleChangeVideoCodec"
1128
+ >
1129
+ <el-option
1130
+ v-for="(type, idx) in codecSelection"
1131
+ :key="type + idx"
1132
+ :value="type"
1133
+ :label="type"
1134
+ />
1135
+ </el-select>
1136
+ </el-form-item>
1137
+
1138
+ <el-form-item
1139
+ v-if="typeValue === 'audio'"
1140
+ class="max-w-190px min-w-190px"
1141
+ label="Codec"
1142
+ v-bind="audioCodecAttrs"
1143
+ >
1144
+ <template #label>
1145
+ <SSInformationLabel label="Codec" :info="schemaObj.audioCodec" />
1146
+ </template>
1147
+ <el-select
1148
+ v-model="audioCodecValue"
1149
+ class="max-w-190px min-w-190px"
1150
+ default-first-option
1151
+ :disabled="isPackage"
1152
+ >
1153
+ <el-option
1154
+ v-for="(type, idx) in codecSelection"
1155
+ :key="type + idx"
1156
+ :value="type"
1157
+ :label="type"
1158
+ />
1159
+ </el-select>
1160
+ </el-form-item>
1161
+ <el-form-item
1162
+ v-if="typeValue === 'data'"
1163
+ class="max-w-190px min-w-190px"
1164
+ label="Codec"
1165
+ v-bind="dataCodecAttrs"
1166
+ >
1167
+ <template #label>
1168
+ <SSInformationLabel label="Codec" :info="schemaObj.dataCodec" />
1169
+ </template>
1170
+ <el-select
1171
+ v-model="dataCodecValue"
1172
+ class="max-w-190px min-w-190px"
1173
+ default-first-option
1174
+ :disabled="isPackage"
1175
+ >
1176
+ <el-option
1177
+ v-for="(type, idx) in codecSelection"
1178
+ :key="type + idx"
1179
+ :value="type"
1180
+ :label="type"
1181
+ />
1182
+ </el-select>
1183
+ </el-form-item>
1184
+ </div>
1185
+ </el-collapse-item>
1186
+ <el-collapse-item v-if="typeValue === 'video' && encoderValue === 'nvenc' && isCreateChannel && encoderValue !== 'passthrough' && configPte?.pte?.enable" name="pte">
1187
+ <template #title>
1188
+ <label class="flex items-center gap-2 text-16px font-semibold">
1189
+ PTE Config <span class="text-13px font-normal">({{ $t('base_library.used_in_video_encoding_with_ai-based_quality_assessment_to_optimize_efficiency_while_maintaining_visual_quality') }})</span>
1190
+ <el-tooltip
1191
+ class="box-item"
1192
+ effect="dark"
1193
+ content="Recommended Configuration"
1194
+ placement="top"
1195
+ >
1196
+ <div v-if="configPte?.pte?.path" class="h-20px w-20px flex items-center justify-center rounded-full bg-primary">
1197
+ <div class="i-carbon:thumbs-up-filled mb-1px cursor-pointer text-light" @click.prevent.stop="isVisibleRecommend = true" />
1198
+ </div>
1199
+ </el-tooltip>
1200
+ </label>
1201
+ </template>
1202
+ <div class="flex gap-2">
1203
+ <el-form-item class="max-w-190px min-w-190px" label="Enable" v-bind="defaultPTEAttrs">
1204
+ <template #label>
1205
+ <SSInformationLabel label="Enable" :info="schemaObj.pteEnabled" />
1206
+ </template>
1207
+ <el-switch
1208
+ v-model="defaultPTEValue"
1209
+ :disabled="!configPte?.pte?.enable"
1210
+ @change="defaultPTEConfig"
1211
+ />
1212
+ </el-form-item>
1213
+ <el-form-item label="vmafMax" class="max-w-190px min-w-190px" v-bind="vmafMaxAttrs">
1214
+ <template #label>
1215
+ <SSInformationLabel label="vmafMax" :info="schemaObj.vmafMax" />
1216
+ </template>
1217
+ <el-input-number
1218
+ v-model="vmafMaxValue"
1219
+ :disabled="!defaultPTEValue"
1220
+ class="w-full [&_.el-input\_\_inner]:text-start"
1221
+ :controls="false"
1222
+ :precision="2"
1223
+ :max="96"
1224
+ :min="vmafMinValue || 89"
1225
+ />
1226
+ </el-form-item>
1227
+ <el-form-item label="vmafMin" class="max-w-190px min-w-190px" v-bind="vmafMinAttrs">
1228
+ <template #label>
1229
+ <SSInformationLabel label="vmafMin" :info="schemaObj.vmafMin" />
1230
+ </template>
1231
+ <el-input-number
1232
+ v-model="vmafMinValue"
1233
+ :disabled="!defaultPTEValue"
1234
+ class="w-full [&_.el-input\_\_inner]:text-start"
1235
+ :controls="false"
1236
+ :precision="2"
1237
+ :max="vmafMaxValue || 96"
1238
+ :min="89"
1239
+ />
1240
+ </el-form-item>
1241
+ <el-form-item label="vmafThres" class="max-w-190px min-w-190px" v-bind="vmafThresAttrs">
1242
+ <template #label>
1243
+ <SSInformationLabel label="vmafThres" :info="schemaObj.vmafThres" />
1244
+ </template>
1245
+ <el-input-number
1246
+ v-model="vmafThresValue"
1247
+ :disabled="!defaultPTEValue"
1248
+ class="w-full [&_.el-input\_\_inner]:text-start"
1249
+ :controls="false"
1250
+ :max="1"
1251
+ :min="0.5"
1252
+ :precision="2"
1253
+ />
1254
+ </el-form-item>
1255
+ </div>
1256
+ </el-collapse-item>
1257
+ <el-collapse-item v-if="scte35 && ['copy', 'scte35'].includes(dataCodecValue) && encoderValue !== 'passthrough'" name="scte35">
1258
+ <template #title>
1259
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
1260
+ Overwrite SCTE35
1261
+ </label>
1262
+ </template>
1263
+
1264
+ <div class="w-1/2 flex justify-between gap-2">
1265
+ <el-form-item class="w-full">
1266
+ <template #label>
1267
+ <SSInformationLabel :label="$t('EventChannel.form.label.enable')" :info="schemaSCTE35.enabled" />
1268
+ </template>
1269
+ <el-switch
1270
+ v-model="scte35OverwriteConfigValue.enabled"
1271
+ />
1272
+ </el-form-item>
1273
+ <el-form-item class="w-full">
1274
+ <template #label>
1275
+ <SSInformationLabel :label="$t('fast_channel.duration')" :info="schemaSCTE35.overwriteDuration" />
1276
+ </template>
1277
+ <el-input-number
1278
+ v-model="scte35OverwriteConfigValue.overwriteDuration"
1279
+ :disabled="!scte35OverwriteConfigValue.enabled"
1280
+ :min="1"
1281
+ :max="180"
1282
+ :precision="0"
1283
+ class="w-full"
1284
+ />
1285
+ </el-form-item>
1286
+
1287
+ <el-form-item class="w-full" :label="$t('EventChannel.form.label.delay')">
1288
+ <template #label>
1289
+ <SSInformationLabel :label="$t('EventChannel.form.label.delay')" :info="schemaSCTE35.overwriteDelayTime" />
1290
+ </template>
1291
+ <el-input-number
1292
+ v-model="scte35OverwriteConfigValue.overwriteDelayTime"
1293
+ :disabled="!scte35OverwriteConfigValue.enabled"
1294
+ :min="0"
1295
+ :max="60"
1296
+ :precision="0"
1297
+ class="w-full"
1298
+ />
1299
+ </el-form-item>
1300
+ </div>
1301
+ </el-collapse-item>
1302
+ <el-collapse-item v-if="typeValue && !isPackage && encoderValue !== 'passthrough'" name="codec">
1303
+ <template #title>
1304
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
1305
+ {{ $t('SSConfig.codec_detail') }}
1306
+ </label>
1307
+ </template>
1308
+
1309
+ <div class="flex flex-wrap gap-2">
1310
+ <el-form-item v-if="isConfigEncoder && typeValue === 'video' && encoderValue !== 'passthrough' && !isPackage" class="max-w-190px min-w-190px" v-bind="presetAttrs">
1311
+ <template #label>
1312
+ <SSInformationLabel label="Preset" :info="schemaObj.videoPreset" />
1313
+ </template>
1314
+ <el-select v-model="presetValue" class="w-full">
1315
+ <el-option
1316
+ v-for="(e) in optionsPreset"
1317
+ :key="e.value"
1318
+ :value="e.value"
1319
+ :label="e.label"
1320
+ />
1321
+ </el-select>
1322
+ </el-form-item>
1323
+ <el-form-item
1324
+ v-if="typeValue === 'video'"
1325
+ label="Pixel format"
1326
+ class="max-w-190px min-w-190px"
1327
+ v-bind="pixelFormatAttrs"
1328
+ >
1329
+ <template #label>
1330
+ <SSInformationLabel label="Pixel format" :info="schemaObj.pixelFormat" />
1331
+ </template>
1332
+ <el-select
1333
+ v-model="pixelFormatValue"
1334
+ :disabled="isCopiedVideoCodec"
1335
+ class="w-full"
1336
+ clearable
1337
+ @change="(value) => setUndefined('pixel', value)"
1338
+ >
1339
+ <el-option
1340
+ v-for="(type, idx) in ['yuv420p', 'yuv444p', 'yuv420p10le', 'yuv444p10le']"
1341
+ :key="type + idx"
1342
+ :value="type"
1343
+ :label="type"
1344
+ />
1345
+ </el-select>
1346
+ </el-form-item>
1347
+ <el-form-item
1348
+ v-if="typeValue === 'video'"
1349
+ class="max-w-190px min-w-190px"
1350
+ label="Profile"
1351
+ v-bind="profileAttrs"
1352
+ >
1353
+ <template #label>
1354
+ <SSInformationLabel label="Profile" :info="schemaObj.videoProfile" />
1355
+ </template>
1356
+ <el-select
1357
+ v-model="profileValue"
1358
+ :disabled="isCopiedVideoCodec"
1359
+ class="w-full"
1360
+ default-first-option
1361
+ clearable
1362
+ @change="(value) => setUndefined('profile', value)"
1363
+ >
1364
+ <el-option
1365
+ v-for="(type, idx) in optionsProfile"
1366
+ :key="type + idx"
1367
+ :value="type"
1368
+ :label="type"
1369
+ />
1370
+ </el-select>
1371
+ </el-form-item>
1372
+ <el-form-item
1373
+ v-if="typeValue === 'audio'"
1374
+ class="max-w-190px min-w-190px"
1375
+ label="Profile"
1376
+ v-bind="audioProfileAttrs"
1377
+ >
1378
+ <template #label>
1379
+ <SSInformationLabel label="Profile" :info="schemaObj.audioProfile" />
1380
+ </template>
1381
+ <el-select
1382
+ v-model="audioProfileValue"
1383
+ :disabled="isCopiedVideoCodec"
1384
+ class="w-full"
1385
+ default-first-option
1386
+ clearable
1387
+ @change="(value) => setUndefined('audioProfile', value)"
1388
+ >
1389
+ <el-option
1390
+ v-for="(type, idx) in ['aac_low', 'aac_he', 'aac_he_v2', 'aac_main', 'aac_ld', 'aac_eld']"
1391
+ :key="type + idx"
1392
+ :value="type"
1393
+ :label="type"
1394
+ />
1395
+ </el-select>
1396
+ </el-form-item>
1397
+ <el-form-item
1398
+ v-if="typeValue === 'video'"
1399
+ class="max-w-190px min-w-190px"
1400
+ label="Level"
1401
+ v-bind="levelAttrs"
1402
+ >
1403
+ <template #label>
1404
+ <SSInformationLabel label="Level" :info="schemaObj.videoLevel" />
1405
+ </template>
1406
+ <el-select
1407
+ v-model="levelValue"
1408
+ :disabled="isCopiedVideoCodec"
1409
+ class="w-full"
1410
+ default-first-option
1411
+ clearable
1412
+ @change="(value) => setUndefined('level', value)"
1413
+ >
1414
+ <el-option
1415
+ v-for="(type, idx) in optionsLevel"
1416
+ :key="type + idx"
1417
+ :value="type"
1418
+ :label="type"
1419
+ />
1420
+ </el-select>
1421
+ </el-form-item>
1422
+ </div>
1423
+ </el-collapse-item>
1424
+ <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" title="Detail Information" name="output_aspect">
1425
+ <template #title>
1426
+ <label class="flex items-center gap-2 text-16px font-semibold">
1427
+ {{ $t('SSConfig.aspect_ratio') }}
1428
+ </label>
1429
+ </template>
1430
+
1431
+ <div class="flex gap-2">
1432
+ <el-form-item label="Aspect Ratio Mode" class="max-w-190px min-w-190px" v-bind="aspectRatioModeAttrs">
1433
+ <template #label>
1434
+ <SSInformationLabel label="Aspect Ratio Mode" :info="schemaObj.aspectRatioMode" />
1435
+ </template>
1436
+ <el-select
1437
+ v-model="aspectRatioModeValue"
1438
+ class="w-full"
1439
+ :disabled="isCopiedVideoCodec"
1440
+ >
1441
+ <el-option
1442
+ v-for="(type, idx) in [
1443
+ 'auto', 'custom', 'source',
1444
+ ]"
1445
+ :key="type + idx"
1446
+ :value="type"
1447
+ :label="type"
1448
+ />
1449
+ </el-select>
1450
+ </el-form-item>
1451
+
1452
+ <el-form-item label="Aspect Ratio Width" class="max-w-190px min-w-190px" v-bind="aspectRatioWidthAttrs">
1453
+ <template #label>
1454
+ <SSInformationLabel label="Aspect Ratio Width" :info="schemaObj.aspectRatioWidth" />
1455
+ </template>
1456
+ <el-input-number
1457
+ v-model="aspectRatioWidthValue"
1458
+ :min="1"
1459
+ :max="1000"
1460
+ class="w-full [&_.el-input\_\_inner]:text-start"
1461
+ :disabled="aspectRatioModeValue !== 'custom'"
1462
+ :precision="0"
1463
+ :controls="false"
1464
+ step-strictly
1465
+ />
1466
+ </el-form-item>
1467
+ <el-form-item label="Aspect Ratio Height" class="max-w-190px min-w-190px" v-bind="aspectRatioHeightAttrs">
1468
+ <template #label>
1469
+ <SSInformationLabel label="Aspect Ratio Height" :info="schemaObj.aspectRatioHeight" />
1470
+ </template>
1471
+ <el-input-number
1472
+ v-model="aspectRatioHeightValue"
1473
+ :min="1"
1474
+ :max="1000"
1475
+ class="w-full [&_.el-input\_\_inner]:text-start"
1476
+ :disabled="aspectRatioModeValue !== 'custom'"
1477
+ :precision="0"
1478
+ :controls="false"
1479
+ step-strictly
1480
+ />
1481
+ </el-form-item>
1482
+ </div>
1483
+ </el-collapse-item>
1484
+ <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" title="Detail Information" name="aspect">
1485
+ <template #title>
1486
+ <label class="flex items-center gap-2 text-16px font-semibold">
1487
+ {{ $t('Channel.output_aspect_ratio') }}
1488
+ </label>
1489
+ </template>
1490
+ <div class="flex gap-2">
1491
+ <el-form-item label="Width" class="max-w-190px min-w-190px" v-bind="widthAttrs">
1492
+ <template #label>
1493
+ <SSInformationLabel label="Width" :info="schemaObj.width" />
1494
+ </template>
1495
+ <el-input-number
1496
+ v-model="widthValue"
1497
+ :min="0"
1498
+ :max="7680"
1499
+ class="w-full [&_.el-input\_\_inner]:text-start"
1500
+ :disabled="isCopiedVideoCodec"
1501
+ :precision="0"
1502
+ :controls="false"
1503
+ step-strictly
1504
+ />
1505
+ </el-form-item>
1506
+
1507
+ <el-form-item label="Height" class="max-w-190px min-w-190px" v-bind="heightAttrs">
1508
+ <template #label>
1509
+ <SSInformationLabel label="Height" :info="schemaObj.height" />
1510
+ </template>
1511
+ <el-input-number
1512
+ v-model="heightValue"
1513
+ :min="0"
1514
+ :max="4320"
1515
+ class="w-full [&_.el-input\_\_inner]:text-start"
1516
+ :disabled="isCopiedVideoCodec"
1517
+ :precision="0"
1518
+ :controls="false"
1519
+ step-strictly
1520
+ />
1521
+ </el-form-item>
1522
+ <el-form-item label="Scale Type" class="max-w-190px min-w-190px" v-bind="scaleTypeAttrs">
1523
+ <template #label>
1524
+ <SSInformationLabel label="Scale Type" :info="schemaObj.scaleType" />
1525
+ </template>
1526
+ <el-select
1527
+ v-model="scaleTypeValue"
1528
+ class="w-full"
1529
+ :disabled="isCopiedVideoCodec"
1530
+ clearable
1531
+ @change="(value) => setUndefined('scale', value)"
1532
+ >
1533
+ <el-option
1534
+ v-for="(type, idx) in [
1535
+ 'fitWidth',
1536
+ 'fitHeight',
1537
+ 'fitInside',
1538
+ 'fitCrop',
1539
+ 'fitBoth',
1540
+ 'source',
1541
+ ]"
1542
+ :key="type + idx"
1543
+ :value="type"
1544
+ :label="type"
1545
+ />
1546
+ </el-select>
1547
+ </el-form-item>
1548
+ </div>
1549
+ </el-collapse-item>
1550
+
1551
+ <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="frame">
1552
+ <template #title>
1553
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
1554
+ {{ $t('SSConfig.frame_rate') }}
1555
+ </label>
1556
+ </template>
1557
+
1558
+ <div class="flex gap-2">
1559
+ <el-form-item v-bind="fpsAttrs" label="FPS" class="max-w-190px min-w-190px">
1560
+ <template #label>
1561
+ <SSInformationLabel label="FPS" :info="schemaObj.fps" />
1562
+ </template>
1563
+ <el-input-number
1564
+ v-model="fpsValue"
1565
+ class="w-full [&_.el-input\_\_inner]:text-start"
1566
+ :disabled="isCopiedVideoCodec"
1567
+ :precision="0"
1568
+ :controls="false"
1569
+ step-strictly
1570
+ />
1571
+ </el-form-item>
1572
+ <el-form-item label="Scan Type" class="max-w-190px min-w-190px" v-bind="scanTypeAttrs">
1573
+ <template #label>
1574
+ <SSInformationLabel label="Scan Type" :info="schemaObj.scanType" />
1575
+ </template>
1576
+ <el-select
1577
+ v-model="scanTypeValue"
1578
+ class="w-full"
1579
+ :disabled="isCopiedVideoCodec"
1580
+ clearable
1581
+ @change="(value) => setUndefined('scan', value)"
1582
+ >
1583
+ <el-option
1584
+ v-for="(type) in optionScanType"
1585
+ :key="type.value"
1586
+ :value="type.value"
1587
+ :label="type.value"
1588
+ />
1589
+ </el-select>
1590
+ </el-form-item>
1591
+ </div>
1592
+ </el-collapse-item>
1593
+ <el-collapse-item v-if="typeValue && !isPackage && encoderValue !== 'passthrough'" name="control">
1594
+ <template #title>
1595
+ <label class="flex items-center gap-2 text-16px font-semibold">
1596
+ {{ $t('SSConfig.rate_control') }}
1597
+ </label>
1598
+ </template>
1599
+
1600
+ <div v-if="typeValue === 'video'" class="flex flex-wrap gap-2">
1601
+ <el-form-item label="Rate control mode" class="max-w-190px min-w-190px flex-1" v-bind="rateControlModeAttrs">
1602
+ <template #label>
1603
+ <SSInformationLabel label="Rate control mode" :info="schemaObj.rateControlMode" />
1604
+ </template>
1605
+ <el-select
1606
+ v-model="rateControlModeValue"
1607
+ class="max-w-190px min-w-190px flex-1"
1608
+ :disabled="isCopiedVideoCodec"
1609
+ clearable
1610
+ @change="(value) => setUndefined('rateControlMode', value)"
1611
+ >
1612
+ <el-option
1613
+ v-for="(type, idx) in [
1614
+ 'cbr',
1615
+ 'vbr',
1616
+ ]"
1617
+ :key="type + idx"
1618
+ :value="type"
1619
+ :label="type"
1620
+ />
1621
+ </el-select>
1622
+ </el-form-item>
1623
+
1624
+ <el-form-item label="Constant quality" class="max-w-190px min-w-190px flex-1" v-bind="cqAttrs">
1625
+ <template #label>
1626
+ <SSInformationLabel label="Constant quality" min-width="min-w-112px" :info="schemaObj.cq" />
1627
+ </template>
1628
+ <el-input-number
1629
+ v-model="cqValue"
1630
+ :controls="false"
1631
+ :precision="0"
1632
+ class="w-full [&_.el-input\_\_inner]:text-start"
1633
+ :disabled="isCopiedVideoCodec || rateControlModeValue !== 'vbr'"
1634
+ :min="0"
1635
+ :max="51"
1636
+ />
1637
+ </el-form-item>
1638
+ <el-form-item label="RC" class="max-w-190px min-w-190px flex-1" v-bind="rcAttrs">
1639
+ <template #label>
1640
+ <SSInformationLabel label="RC" :info="schemaObj.rc" />
1641
+ </template>
1642
+ <el-select
1643
+ v-model="rcValue"
1644
+ class="max-w-190px min-w-190px flex-1"
1645
+ :disabled="isCopiedVideoCodec || isDisabledRc"
1646
+ clearable
1647
+ @change="(value) => setUndefined('rc', value)"
1648
+ >
1649
+ <el-option
1650
+ v-for="(type, idx) in optionRc"
1651
+ :key="type + idx"
1652
+ :value="type"
1653
+ :label="type"
1654
+ />
1655
+ </el-select>
1656
+ </el-form-item>
1657
+ <el-form-item v-if="encoderValue !== 'passthrough' && !isPackage" class="max-w-190px min-w-190px flex-1" v-bind="videoRateAttrs">
1658
+ <template #label>
1659
+ <SSInformationLabel label="Bitrate" :info="schemaObj.videoBitrate" />
1660
+ </template>
1661
+ <el-input
1662
+ v-model="videoRateValue"
1663
+ class="max-w-190px min-w-190px flex-1"
1664
+ :disabled="isCopiedVideoCodec"
1665
+ :formatter="formatter"
1666
+ :parser="parser"
1667
+ />
1668
+ </el-form-item>
1669
+ <el-form-item v-bind="minrateAttrs" class="max-w-190px min-w-190px flex-1">
1670
+ <template #label>
1671
+ <SSInformationLabel label="Minrate" :info="schemaObj.minrate" />
1672
+ </template>
1673
+ <el-input
1674
+ v-model="minrateValue"
1675
+ class="max-w-190px min-w-190px flex-1"
1676
+ :disabled="isCopiedVideoCodec"
1677
+ :formatter="formatter"
1678
+ :parser="parser"
1679
+ />
1680
+ </el-form-item>
1681
+
1682
+ <el-form-item v-bind="maxrateAttrs" class="max-w-190px min-w-190px flex-1">
1683
+ <template #label>
1684
+ <SSInformationLabel label="Maxrate" :info="schemaObj.maxrate" />
1685
+ </template>
1686
+ <el-input
1687
+ v-model="maxrateValue"
1688
+ class="max-w-190px min-w-190px flex-1"
1689
+ :disabled="isCopiedVideoCodec"
1690
+ :formatter="formatter"
1691
+ :parser="parser"
1692
+ />
1693
+ </el-form-item>
1694
+ <el-form-item v-bind="bufsizeAttrs" class="max-w-190px min-w-190px flex-1">
1695
+ <template #label>
1696
+ <SSInformationLabel label="Bufsize" :info="schemaObj.bufsize" />
1697
+ </template>
1698
+ <el-input
1699
+ v-model="bufsizeValue"
1700
+ class="max-w-190px min-w-190px flex-1"
1701
+ :disabled="isCopiedVideoCodec"
1702
+ :formatter="formatter"
1703
+ :parser="parser"
1704
+ />
1705
+ </el-form-item>
1706
+ </div>
1707
+ <div v-if="typeValue === 'audio'" class="flex flex-wrap gap-2">
1708
+ <el-form-item class="max-w-190px min-w-190px flex-1" v-bind="audioRateAttrs">
1709
+ <template #label>
1710
+ <SSInformationLabel label="Bitrate" :info="schemaObj.audioBitrate" />
1711
+ </template>
1712
+ <el-input
1713
+ v-model="audioRateValue"
1714
+ class="max-w-190px min-w-190px flex-1"
1715
+ :disabled="isCopiedVideoCodec"
1716
+ :formatter="formatter"
1717
+ :parser="parser"
1718
+ />
1719
+ </el-form-item>
1720
+
1721
+ <el-form-item
1722
+ v-if="!isPackage"
1723
+ class="max-w-190px min-w-190px flex-1"
1724
+ label="Sample rate"
1725
+ v-bind="sampleRateAttrs"
1726
+ >
1727
+ <template #label>
1728
+ <SSInformationLabel label="Sample rate" :info="schemaObj.sampleRate" />
1729
+ </template>
1730
+ <el-select
1731
+ v-model="sampleRateValue"
1732
+ :disabled="isCopiedAudioCodec"
1733
+ class="w-full"
1734
+ default-first-option
1735
+ >
1736
+ <el-option
1737
+ v-for="(type, idx) in [44100, 48000]"
1738
+ :key="type + idx"
1739
+ :value="type"
1740
+ :label="type"
1741
+ />
1742
+ </el-select>
1743
+ </el-form-item>
1744
+ <el-form-item
1745
+ v-if="!isPackage"
1746
+ class="max-w-190px min-w-190px flex-1"
1747
+ label="Channel"
1748
+ v-bind="channelAttrs"
1749
+ >
1750
+ <template #label>
1751
+ <SSInformationLabel label="Channel" :info="schemaObj.channel" />
1752
+ </template>
1753
+ <el-select
1754
+ v-model="channelValue"
1755
+ :disabled="isCopiedAudioCodec"
1756
+ class="w-full"
1757
+ >
1758
+ <el-option
1759
+ v-for="(type, idx) in [1, 2, 6]"
1760
+ :key="type + idx"
1761
+ :value="type"
1762
+ :label="type"
1763
+ />
1764
+ </el-select>
1765
+ </el-form-item>
1766
+ </div>
1767
+ </el-collapse-item>
1768
+ <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="color">
1769
+ <template #title>
1770
+ <label class="flex items-center gap-2 text-16px font-semibold">
1771
+ {{ $t('SSConfig.color_space') }}
1772
+ </label>
1773
+ </template>
1774
+
1775
+ <div class="flex gap-2">
1776
+ <el-form-item label="Hdr" class="max-w-190px min-w-190px" v-bind="hdrAttrs">
1777
+ <template #label>
1778
+ <SSInformationLabel label="Hdr" :info="schemaObj.hdr" />
1779
+ </template>
1780
+ <el-select
1781
+ v-model="hdrValue"
1782
+ :disabled="isCopiedVideoCodec"
1783
+ clearable
1784
+ @change="(value) => setUndefined('hdr', value)"
1785
+ >
1786
+ <el-option
1787
+ v-for="(type, idx) in ['COPY', 'NONE', 'HDR10', 'HLG10', 'PQ10']"
1788
+ :key="type + idx"
1789
+ :value="type"
1790
+ :label="type"
1791
+ />
1792
+ </el-select>
1793
+ </el-form-item>
1794
+ </div>
1795
+ </el-collapse-item>
1796
+
1797
+ <el-collapse-item v-if="typeValue === 'video' && !isPackage && encoderValue !== 'passthrough'" name="gop">
1798
+ <template #title>
1799
+ <label for="" class="flex items-center gap-2 text-16px font-semibold">
1800
+ {{ $t('SSConfig.gop_size') }}
1801
+ </label>
1802
+ </template>
1803
+
1804
+ <div class="flex gap-2">
1805
+ <el-form-item label="Bframe" class="max-w-190px min-w-190px" v-bind="bframeAttrs">
1806
+ <template #label>
1807
+ <SSInformationLabel label="Bframe" :info="schemaObj.bframe" />
1808
+ </template>
1809
+ <el-input-number
1810
+ v-model="bframeValue"
1811
+ class="w-full [&_.el-input\_\_inner]:text-start"
1812
+ :disabled="isCopiedVideoCodec"
1813
+ :controls="false"
1814
+ :precision="1"
1815
+ :step="0.1"
1816
+ :max="3"
1817
+ :min="0"
1818
+ />
1819
+ </el-form-item>
1820
+ <el-form-item label="Gop structure mode" class="max-w-190px min-w-190px" v-bind="gopModeAttrs">
1821
+ <template #label>
1822
+ <SSInformationLabel label="Gop structure mode" :info="schemaObj.gopMode" />
1823
+ </template>
1824
+ <el-select
1825
+ v-model="gopModeValue"
1826
+ class="w-full"
1827
+ :disabled="isCopiedVideoCodec"
1828
+ clearable
1829
+ @change="gopValue = undefined"
1830
+ >
1831
+ <el-option
1832
+ v-for="(type, idx) in optionGopMode"
1833
+ :key="type + idx"
1834
+ :value="type.value"
1835
+ :label="type.label"
1836
+ />
1837
+ </el-select>
1838
+ </el-form-item>
1839
+ <el-form-item label="Gop size" class="max-w-190px min-w-190px" v-bind="gopAttrs">
1840
+ <template #label>
1841
+ <SSInformationLabel label="Gop size" :info="schemaObj.gopMode" />
1842
+ </template>
1843
+ <el-input
1844
+ v-model="gopValue"
1845
+ :disabled="isCopiedVideoCodec || isDisabledGopSize"
1846
+ :formatter="formatter"
1847
+ :parser="parser"
1848
+ />
1849
+ </el-form-item>
1850
+ <el-form-item label="FixedGOP" class="max-w-190px min-w-190px" v-bind="fixedGOPAttrs">
1851
+ <template #label>
1852
+ <SSInformationLabel label="FixedGOP" :info="schemaObj.fixedGOP" />
1853
+ </template>
1854
+ <el-switch
1855
+ v-model="fixedGOPValue"
1856
+ :disabled="disabledWithPTEConfig"
1857
+ />
1858
+ </el-form-item>
1859
+ </div>
1860
+ </el-collapse-item>
1861
+ <el-collapse-item v-if="typeValue === 'audio'" name="other">
1862
+ <template #title>
1863
+ <label class="flex items-center gap-2 text-16px font-semibold">
1864
+ {{ $t('SSConfig.other') }}
1865
+ </label>
1866
+ </template>
1867
+
1868
+ <div class="flex flex-wrap gap-2">
1869
+ <el-form-item class="max-w-190px min-w-190px" v-bind="groupIdAttrs">
1870
+ <template #label>
1871
+ <SSInformationLabel :label="$t('general.groupId')" :info="schemaObj.name" />
1872
+ </template>
1873
+ <el-input
1874
+ v-model="groupIdValue"
1875
+ :placeholder="$t('library_preset.enter_group_id')"
1876
+ autocomplete="off"
1877
+ clearable
1878
+ :maxlength="50"
1879
+ show-word-limit
1880
+ />
1881
+ </el-form-item>
1882
+ <el-form-item
1883
+ v-if="!isPackage"
1884
+ class="max-w-190px min-w-190px"
1885
+ label="Volume"
1886
+ v-bind="volumeAttrs"
1887
+ >
1888
+ <template #label>
1889
+ <SSInformationLabel label="Volume" :info="schemaObj.volume" />
1890
+ </template>
1891
+ <el-select
1892
+ v-model="volumeValue"
1893
+ :disabled="isCopiedAudioCodec"
1894
+ class="w-full"
1895
+ default-first-option
1896
+ clearable
1897
+ @change="(value) => setUndefined('volume', value)"
1898
+ >
1899
+ <el-option
1900
+ v-for="(type, idx) in ['+5dB', '-10dB', '0.5', '2', 'loudnorm']"
1901
+ :key="type + idx"
1902
+ :value="type"
1903
+ :label="type"
1904
+ />
1905
+ </el-select>
1906
+ </el-form-item>
1907
+ <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.language')" v-bind="languageAttrs">
1908
+ <template #label>
1909
+ <SSInformationLabel :label="$t('profile.language')" :info="schemaObj.language" />
1910
+ </template>
1911
+ <el-select-v2
1912
+ v-model="languageValue"
1913
+ :options="optionsLang"
1914
+ placeholder="Select"
1915
+ />
1916
+ </el-form-item>
1917
+ <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.label')" v-bind="labelAttrs">
1918
+ <template #label>
1919
+ <SSInformationLabel :label="$t('profile.label')" :info="schemaObj.label" />
1920
+ </template>
1921
+ <el-input
1922
+ v-model="labelValue"
1923
+ :disabled="isCopiedAudioCodec && !isPackage"
1924
+ :placeholder="$t('profile.placeholder_label')"
1925
+ autocomplete="off"
1926
+ clearable
1927
+ show-word-limit
1928
+ maxlength="50"
1929
+ @change="(value) => setUndefined('label', value)"
1930
+ />
1931
+ </el-form-item>
1932
+ <el-form-item class="max-w-190px min-w-190px" :label="$t('profile.default')" v-bind="defaultAttrs">
1933
+ <template #label>
1934
+ <SSInformationLabel :label="$t('profile.default')" :info="schemaObj.audioDefault" />
1935
+ </template>
1936
+ <el-switch
1937
+ v-model="defaultValue"
1938
+ />
1939
+ </el-form-item>
1940
+ </div>
1941
+ </el-collapse-item>
1942
+ </el-collapse>
1943
+ </template>
1944
+ <DevOnly>
1945
+ <el-button @click="fillVideo">
1946
+ Fill Video
1947
+ </el-button>
1948
+ <el-button @click="fillAudio">
1949
+ Fill Audio
1950
+ </el-button>
1951
+ <el-button @click="fillData">
1952
+ Fill Data
1953
+ </el-button>
1954
+ </DevOnly>
1955
+
1956
+ <SSRecommendedConfigurationPTE v-if="isVisibleRecommend" v-model:visible="isVisibleRecommend" @apply-config="handleApplyConfig" />
1957
+ </template>