From 3d0f3f935d734398904892f41c8e068a35bc17ae Mon Sep 17 00:00:00 2001 From: grayhook Date: Tue, 8 Jul 2025 16:02:06 +0700 Subject: [PATCH] bump --- gemini/.core_ui.sh.swp | Bin 0 -> 16384 bytes gemini/.universal_merger.sh.swp | Bin 0 -> 16384 bytes gemini/core_ui.sh | 74 ++++++++++++++++++++++++---------------- 3 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 gemini/.core_ui.sh.swp create mode 100644 gemini/.universal_merger.sh.swp diff --git a/gemini/.core_ui.sh.swp b/gemini/.core_ui.sh.swp new file mode 100644 index 0000000000000000000000000000000000000000..ead34c1b5da186e9486fc4d5d0a17b5a88832944 GIT binary patch literal 16384 zcmeI2ZE#dq8OJZ8_5~@_esk)0SRzRS>@I4L-mp$LfbqSi>`W^-ci{5|L1O>RO$QU;M> z?k;~e_uO;OdCvcN&U2pU*=?x&&W6qEE9I3Iuf>+-+)TC<&tGdjSND0VITPF0l1}fE zTX%Y`-x}NZT)Nf1Qy;l^urOf7v*~!Q)lNCtij2KGovnzcQ+w=;Q_*azSue7dPx$L8WCYv&>v{fX;r;^udg^_@Is6D22pI?&2pI?&2pI?& z2pI?&2pI?&2pI?&2pM<)8HhDn*83#+8|Nb&-~Si#|Bn_~)`#FScmX^Hu0LT}gP;`r zVWDNc2R4C!e8#eV1wI;EP}$_!|X;zkqkZFt`o|!7JdWpc*_4{`|OQ z)q&^1_dp4F3jF6W%lZKP9&~{nU^}P+?>}l;x4=!%2@Zk;*aS9$VsQBp%en|IfNy}6 z;0xeSpGID=0KD-j%X%GL2A9AOK|OdHJPJPiBy)it@LjM2YzLnM3&6kO@&j-Y)Pc>w z@cRJjKNRU+F>v63rFdm*Czna7qBZ8KF%e6qn^mM}|FavuwrR`y`YqquzO8QU&I1t@ zjXDV@X>-qfO2a-on@UTAz1NATs!Fx0(u}fH>C?Jj=iS5Zapkt@G5wa#D?R8Q);HWk zx>xtxBD-AmuYdQkV70g~x>EU9GJ+DK7#B-kc0&{!3*a*29=htrhE zw3d{r{T7qH#!N#DKfrKpOl>Yl^_X%GE8XXI=&O2+`Nw45S9NcNK97uTmgO<=@z&m& zZEi^K9bbI){a<{xCH>?2Ry&)GHQO^XFsMh}BWBgY@yjqg2IX*qLLhvM_f_{8su<-~ z-h#zwG^+ILZaXbQ=7B*4Z+Sfch4dbPNK}Yc(c1u>dflVm<8G%si+Orii7-f%`5r;7hhM;9gWI!z59eP+Uef#L+2KK}{j-cM_SWky%6lRjm z>$a|6=S?xhV|m6i+8=)k(^Jgb&KRuUSi=pZ8DYF*?s4~oYTdP`)y_2A5%mLOYcgy! z$}hfh2>x@X9CF*~#xpk%RF)5u(jZ19Lk$amW>zsZNI^&u7^>+p!u$ovxy9ugw#!Pk zi>eOHI2Qxd-32pNW`gT*)dr1&Zf8OGdiGATzA%`yvQx5l(vCazvAB~+r)IR45fQnt zE^o7-Wm!mI9_5pe*ZpDvz3l0BqdXW5D!(AX+Z8_r#Jp+p~?yJWS~UD@N0vr|u8d;cZrM&pVyXUUa(=Ie*omj@H-yL&Wg8q00 zCcJJw5p{J_9$!+cmRG2qJJqsfYGPQ(nYgG3dgh5{`s^<-Ds$9CiyG~wST5;Fb|Cmv z@CMJV2;K{hF}qS46B#T#o!K{&VvL;{$1tSin1J_QHtv|d=C%j9AK&=iR+IhiTO!-P zu<`pvV~Sg1sNx^m=p;uA3N^l<6Q{%IIG!on2czY%SiMpl07R|z=@6GQmmQ-|GOC=Q zo)5>Fm@PZ==9huZ*(eL~q%{X`;LJ6S&G>q3RSwW0k!)%NAa0~JmPm2tq;f%$Cmp%h zrWLQiZ&Sh&dE{lsTO@W!XA;ecR4f_Xxpp#ZTc*=Qzl@#5fIRa^G^sjOWbaKl^;n&g z%c`jTBUPz(epNXwb}G2D1D$I97{?o_wx}dhv=&`Fv#d&0JyX$W@2PN{eWhkz&ntKx zz0tBQi6$p-Z?f1}Cjm)toB8|{RhOxv6=kZtyu3znlE|SW_JPe5v@Ir*7w6WCelSH} zqit>nhjCF=O@Rlc^clR$ON`N9Q2rEus7kmcc4^$rq?20WE+)eNc;oAQsYFbHbKdQY zGBhW>dx%cxR4msU3@7IMs-VzAjCRP_lvux*<24S~+om=>23Qv^kA7y`m0MQ8x@t?J z(RezU&Y;I=LoB|_4>a{q$;1FyMalLZ8%q7SY>XD~c+RV0 z&wCZ$^OaglmsB()QWXs`eqS&7KWthjZ5)D}a3<+6=LumL!8UhI z^8f!$cBUs|qGA$eIfY12bnVBxvym32H{_fTPkJ-Gy6-x#5oh7Y%zjBR5XHLf<%`_fmfUvLN3Zo^?-1lq*4RKY>`gMA>pd_^tbEROIWiRNPKR z%2Z@sHXdQQ-P|a|{>O+vP1sBA^^U1Sxh2!hmU#IhNgmU$D#>W3FJ%xaO9_m)Sr4no zmW?w?WnxDY(4$34j9%R7WeJ`{_czt^*LPv6EUHApV6Un}>?`%TTPRgfDx@~wgbIVr)Qh=6Sc*wIAsm)6EB`jdxo{jqnv)k?;7nUf= z3p(eRgj36%J$Hr@DM6cx&0MV7-*%EC$unm2kw2Na&a(!u@@FWXWY!;d9(IqUWw&i= zx2?un%AK&n;8o!!k*s^mCs!CE(^eRY^<7sOiX;D%l)l^K#6D32iV{bw$oz1XSLJRmeH zeV*MjXa4h_@Bhz#&i{|cdPkB+`Qtsk44;P?d-Uz%#9P~*WP_uhVdE9;)I_;_f^Kc~ zIh@u`4VFvBR(b2vsFK%ZC5A2sqeW$X6fAW#s77v8CLIy$xLIy$xLIy$x zLIy$xLIy$x{@)m=O>Se~!lbsj6Fcl)-`941!2SJM_d3{i-~Ab0LIy$xLIy$xLIy$x zLIy$xLIy$xLIy$xLIy$x{s$S*3XDAiy8{1K10^{c*;A5Bvi7 zGVsoJ#@+%Nz#Q;>;B&y6AH#Pb2YecM40z+Cj9mlffRn%&kOGE)-+Y9z1>g#B8F&OL8M_J$ z1OGuG<9EO}fdudc;Pb$PzyrW-6hbZmrvVK}0Ruok5Cw>*7ro-heYYnMd`6;tBsrj_ z@|kpheju6d+ZCys`EjF`FPIfWuazsOxFRmubK<6G+NZ^$eMU67SP~6eL9gllFesR>9jhO&CtL~lpi|8Jk4~i zYM`S&Q8sl$;ikp>TgOfREA<|$7}|-J76VT?I@{lddbfI%mfL#K&?5 zgB?3|h}R|z%kQ(369JAej%nV(gvAn(A=ZfnF4n~wak7fx)^Tm}e$CR2B6VICi(IYh z8~QtQa(FIjriK4LvFaFphOT+DW|XR zw^dmEJooLoCg$6uk~XnejEh&$`>uQz?to{|*w!^mqyJoLNWQa56sajX(g2V~6wp+p!-9VjrVb}F zsR1=Vlso#An$D-y!|K=C1m!w(YuIO@%p&;koEnpt;u5)mWJ;=*A5LVmYI>+m*l>ri z&K2Sba~25Aa}!}c!2#y%IdI3FiFfjxq2YfBE+rk33~`4D2Q%&mq-4}YCN<=8(l!D3 zm;$$2ff>QUGA_eKaJ=#GjBB5anog>jJelZ;SRNxFKHPzYVMQ`Xezr|;iUj)$O4{sh zdqlw~P|q9TsYFJl7||)dLwJIOU+~Pd-b2!h;-!R>YRWxH5bv zpCv)g!ti4Z?Su`C)f(EIWg|@^qo|B<&ORdDegWHtA6Xhb91*=i(HFuf=8|z~`#?-b z7yEW)93odC%TGq}&zgE5+L{h&$w4kcg&5 zNTO)JMBhQUnpSzFY7}@(jY6rHr5~>2N$hl3*qFe)v;Ff3q9Gnyg334X7q_AmENB9^ z$r0twh{M1N^|xOL1n3^p=f{}fg0$v&co^-T2p!l2q`TdAe3+Vi9(`jw_b4>cQ(Zzn zc?MbOns^o7bp<;(e!PMoKf?ODAg+oZhzmHIbwu$#WiLEbQ&?wAc5X@M#kNZmf`LeH zT9mGe#4ac#E;cMnVLk#S*CZ)8DNqmJ4rrEif}Z21Rfyppwa}bs6UO$4HQD6TX0f1a zl|mKgf|jt|r}XYuycHQ(eSM1G>cvlLY6*PQ&=Rqz!3_!5<>U~4B-a!enq+I|Xt0LR z;v5SiLGP4(?ek=7D33D(0udO(LZhWhUWT9WczH^QI?88_UR6`ju3 znf`QgI7{0q{xP~@#SN`0g+9c)^&8TlHd*@7~QPrwbH+#SH`)VwaW!JZm3Z3l;#e zfs?pB7n3X_R622!wnCW#NS7psqNW2O}!)9`Qgl>cXuSN{c|{NH=OUqsHojyyjBtRSyffH~yy+kgV{b{+T% z@G0P*$l3o0`~mni@CX#h{W=nvb56H;x9ZVwPR+BDl|tDvWvXA%f2M$P0T88LUV#s&yV72RBno!{Y1u5^PkSy4G zjzlju0xld7+c|p5AKkC2`9p8{%Jd@2j+aq>yd-`puC`SkJVihVNTTuu3TP?)on6R}}oWyDbGp(yXPR=;-uc33W~G literal 0 HcmV?d00001 diff --git a/gemini/core_ui.sh b/gemini/core_ui.sh index bdd708b..0719d66 100644 --- a/gemini/core_ui.sh +++ b/gemini/core_ui.sh @@ -2,68 +2,84 @@ #============================================================================== # Модуль интерфейса (TUI) на основе 'dialog' +# ИСПРАВЛЕНА ПЕРЕДАЧА АРГУМЕНТОВ ЧЕРЕЗ МАССИВ #============================================================================== -DIALOG_OPTS="--colors --backtitle 'Универсальный обработчик медиа'" +# Используем МАССИВ для опций, чтобы избежать проблем с кавычками и пробелами. +DIALOG_OPTS=(--colors --backtitle "Универсальный обработчик медиа") + +# Функция-обертка для вызова dialog и корректного возврата результата. +# $1: Исходное значение (для возврата при отмене) +# $2, $3, ...: Команда dialog и ее аргументы +_call_dialog() { + local original_value="$1" + shift + + local result + result=$("$@" 2>&1 1>/dev/tty) + local exit_status=$? + + if [ $exit_status -eq 0 ]; then + echo "$result" + else + echo "$original_value" + fi +} # Показать главное меню -# Принимает массив пунктов меню ui_main_menu() { - dialog $DIALOG_OPTS --title "Главное меню" \ - --menu "Выберите опцию для редактирования или действия:" 20 85 15 "${@}" 2>&1 >/dev/tty + # Передаем массив опций как "${DIALOG_OPTS[@]}" + _call_dialog "" \ + dialog "${DIALOG_OPTS[@]}" --title "Главное меню" \ + --menu "Выберите опцию для редактирования или действия:" 20 85 15 "${@}" } # Получить путь к каталогу -# $1: Заголовок окна -# $2: Текущее значение (для старта) -# $3: Путь по умолчанию (если текущее значение пусто) ui_get_directory() { local title="$1" local current_path="$2" local default_path="$3" local start_path="${current_path:-$default_path}" - - # Убедимся, что путь заканчивается на / для dselect [[ "$start_path" != */ ]] && start_path="$start_path/" - dialog $DIALOG_OPTS --title "$title" \ - --dselect "$start_path" 10 70 2>&1 >/dev/tty + _call_dialog "$current_path" \ + dialog "${DIALOG_OPTS[@]}" --title "$title" --dselect "$start_path" 10 70 } # Получить текстовый ввод от пользователя -# $1: Заголовок окна -# $2: Текущее значение ui_get_input() { local title="$1" local current_value="$2" - dialog $DIALOG_OPTS --title "$title" \ - --inputbox "Введите новое значение:" 10 70 "$current_value" 2>&1 >/dev/tty + _call_dialog "$current_value" \ + dialog "${DIALOG_OPTS[@]}" --title "$title" --inputbox "Введите новое значение:" 10 70 "$current_value" } +# Показать меню выбора действия перед запуском +ui_select_action() { + _call_dialog "" \ + dialog "${DIALOG_OPTS[@]}" --title "Выбор действия" \ + --menu "Какую операцию выполнить с найденными файлами?" 15 70 2 \ + "MERGE" "Склеить видео и аудио с помощью mkvmerge" \ + "SYMLINK" "Создать символические ссылки на видеофайлы" +} + + +# --- Функции без возврата значения --- + # Показать информационное сообщение -# $1: Заголовок -# $2: Текст сообщения ui_show_message() { local title="$1" local text="$2" - dialog $DIALOG_OPTS --title "$title" --msgbox "$text" 20 70 + # Здесь тоже исправляем на массив + dialog "${DIALOG_OPTS[@]}" --title "$title" --msgbox "$text" 20 70 } # Показать окно с выбором Да/Нет -# $1: Заголовок -# $2: Текст вопроса ui_confirm() { local title="$1" local text="$2" - dialog $DIALOG_OPTS --title "$title" --yesno "$text" 10 70 + # Здесь тоже исправляем на массив + dialog "${DIALOG_OPTS[@]}" --title "$title" --yesno "$text" 10 70 return $? } - -# Показать меню выбора действия перед запуском -ui_select_action() { - dialog $DIALOG_OPTS --title "Выбор действия" \ - --menu "Какую операцию выполнить с найденными файлами?" 15 70 2 \ - "MERGE" "Склеить видео и аудио с помощью mkvmerge" \ - "SYMLINK" "Создать символические ссылки на видеофайлы" 2>&1 >/dev/tty -}