From f6b0c24bc5d6ff980b25a0fb14f5e383c8575c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lluc=20Sim=C3=B3=20Margalef?= Date: Mon, 4 Dec 2023 01:49:41 +0100 Subject: [PATCH] mac compatibility and refactor --- automarker.py | 45 +++++++++++++++++++++++++------------------- automarker_mac.spec | 2 +- automarker_win.spec | 2 +- icon.ico | Bin 5448 -> 0 bytes icon.png | Bin 0 -> 14399 bytes 5 files changed, 28 insertions(+), 21 deletions(-) delete mode 100644 icon.ico create mode 100644 icon.png diff --git a/automarker.py b/automarker.py index 647e905..7e06f50 100644 --- a/automarker.py +++ b/automarker.py @@ -76,7 +76,9 @@ PREMIERE_PROCESS_NAME = "adobe premiere pro.exe" if WINDOWS_SYSTEM else "Adobe Premiere Pro" AFTERFX_PROCESS_NAME = "AfterFX.exe" if WINDOWS_SYSTEM else "Adobe After Effects" RESOLVE_PROCESS_NAME = "Resolve.exe" if WINDOWS_SYSTEM else "Resolve" +BLENDER_PROCESS_NAME = "blender.exe" if WINDOWS_SYSTEM else "blender" CEPPANEL_PROCESS_NAME = "CEPHtmlEngine.exe" if WINDOWS_SYSTEM else "CEPHtmlEngine" +SAMPLE_RATE = 44100 ############################### ############################### @@ -151,12 +153,12 @@ def obtain_data_from_file(): info.set("Reading file from source...") root.update() - data, samplerate = librosa.load(path=path.get(), sr=sample_rate, mono=True) + data, samplerate = librosa.load(path=path.get(), sr=SAMPLE_RATE, mono=True) info.set("Getting beat positions...") root.update() - tempo, beatsamples = librosa.beat.beat_track(y=data, units="time", sr=sample_rate) + tempo, beatsamples = librosa.beat.beat_track(y=data, units="time", sr=SAMPLE_RATE) info.set("Displaying preview") root.update() @@ -174,8 +176,8 @@ def child_window_setup(): playButton = ttk.Button(newWindow, text="Play", command=play_preview) # Draw the waveform - stepsize = int(len(data[:sample_rate * 10]) / 1000) - buffer = [int(x * 130 + 210) for x in data[:sample_rate * 10:stepsize]] + stepsize = int(len(data[:SAMPLE_RATE * 10]) / 1000) + buffer = [int(x * 130 + 210) for x in data[:SAMPLE_RATE * 10:stepsize]] for i in range(len(buffer)-1): canvas.create_line(i, buffer[i], i + 1, buffer[i+1], fill="black") @@ -216,13 +218,13 @@ def callback(in_data, frame_count, time_info, status): global playpos chunk = data[playpos:playpos+frame_count] playpos += frame_count - if playpos >= sample_rate*10: + if playpos >= SAMPLE_RATE*10: return (chunk, pyaudio.paComplete) return (chunk, pyaudio.paContinue) def play_preview(): global stream, iid - stream = p.open(format=pyaudio.paFloat32, channels=1, rate=sample_rate, output=True, stream_callback=callback) + stream = p.open(format=pyaudio.paFloat32, channels=1, rate=SAMPLE_RATE, output=True, stream_callback=callback) thread = Thread(target=track_line) thread.daemon = True thread.start() @@ -239,9 +241,9 @@ def track_line(): global playpos global stream if changepos.get(): - playpos = int(playpos_param.get()/999*sample_rate*10) + playpos = int(playpos_param.get()/999*SAMPLE_RATE*10) changepos.set(False) - position = int(playpos*999/sample_rate/10) + position = int(playpos*999/SAMPLE_RATE/10) newWindow.children["!canvas"].delete("line") newWindow.children["!canvas"].create_line(position, 120, position, 300, fill="red", tags="line") newWindow.update() @@ -364,14 +366,20 @@ def __init__(self, aeVersion = "", returnFolder = ""): if not len(self.aeVersion): self.aeVersion = str(int(time.strftime("%Y")[2:]) + 1) + ".0" - # Get the AE_ exe path from the registry. - try: - self.aeKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Adobe\\After Effects\\" + self.aeVersion) - except: - print ("ERROR: Unable to find After Effects version " + self.aeVersion + " on this computer\nTo get correct version number please check https://en.wikipedia.org/wiki/Adobe_After_Effects\nFor example, \"After Effect CC 2019\" is version \"16.0\"") - sys.exit() - - self.aeApp = _winreg.QueryValueEx(self.aeKey, 'InstallPath')[0] + 'AfterFX.exe' + if WINDOWS_SYSTEM: + # Get the AE_ exe path from the registry. + try: + self.aeKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Adobe\\After Effects\\" + self.aeVersion) + except: + print ("ERROR: Unable to find After Effects version " + self.aeVersion + " on this computer\nTo get correct version number please check https://en.wikipedia.org/wiki/Adobe_After_Effects\nFor example, \"After Effect CC 2019\" is version \"16.0\"") + + self.aeApp = _winreg.QueryValueEx(self.aeKey, 'InstallPath')[0] + 'AfterFX.exe' + else: + guess_path = "/Applications/Adobe After Effects" + self.aeVersion + "/Adobe After Effects " + self.aeVersion + ".app/Contents/MacOS/AfterFX" + if os.path.exists(guess_path): + self.aeApp = guess_path + else: + print ("ERROR: Unable to find After Effects version " + self.aeVersion + " on this computer\nTo get correct version number please check https://en.wikipedia.org/wiki/Adobe_After_Effects\nFor example, \"After Effect CC 2019\" is version \"16.0\"") # Get the path to the return file. Create it if it doesn't exist. if not len(returnFolder): @@ -636,8 +644,6 @@ def clearAllMarkers(self): ########################################### ########################################### - -sample_rate = 44100 newWindow = None playpos = 0 p = pyaudio.PyAudio() @@ -718,7 +724,8 @@ def clearAllMarkers(self): for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) -root.iconbitmap(os.path.join(basedir, "icon.ico")) +icon = tk.PhotoImage(file=os.path.join(basedir, "icon.png")) +root.tk.call('wm', 'iconphoto', root._w, icon) root.after(0, update_runvar) root.mainloop() \ No newline at end of file diff --git a/automarker_mac.spec b/automarker_mac.spec index d2c3253..7084cb2 100644 --- a/automarker_mac.spec +++ b/automarker_mac.spec @@ -4,7 +4,7 @@ block_cipher = None added_files = [ - ('icon.ico', '.'), + ('icon.png', '.'), ('extension_installer_mac.sh', '.'), ('extension_installer_win.bat', '.'), ('README.md', '.'), diff --git a/automarker_win.spec b/automarker_win.spec index 346c72a..5ee45a3 100644 --- a/automarker_win.spec +++ b/automarker_win.spec @@ -4,7 +4,7 @@ block_cipher = None added_files = [ - ('icon.ico', '.'), + ('icon.png', '.'), ('extension_installer_mac.sh', '.'), ('extension_installer_win.bat', '.'), ('README.md', '.'), diff --git a/icon.ico b/icon.ico deleted file mode 100644 index da938971186ac195e22d9dca9e4fdea856727ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5448 zcmcInc{r49+rMUvF=NR{MZ}m#(NoIu*s{$eMafp8NT@eNBC;i&^Si|8UQ*78~cp9L~Ue}uhue1FqO z(THU-gWqKHX;=gb7l$!L<(w`WmiLRZl@?Y+DfMf+V?7kz1*M#l4!kDbJGzl)$L111 z4l*>~b*?$OfKx^%YEs-T`7G&@_3rK-XOjFSFoe7YI5D21K$lF%`$m7})rG}}m2m8> zho&NjBh>*RFIcFgbn^j+Pp4=RTX^MR)f_9C$(SbUxB{{uvyABXfa425&hYuxgAAq) zv6tt|vS4jzEzqZgO}>>;8+euOrPCD}sg;Ms>DMJ6Sb7>LWq1{;U@>2AK| zVB0r6vt~@g3QJWZtcM)WS3PqYn(>p2om-%~@e16R3mls#zFc!(9{QjmYpf1$evPMe zMH)if{*G}R^3$eWYiQwFR`PD>VRhIkyVeE|F$|mCKHbqsEj1G5p6#Q$O~29z{YRv% zk0ju&EO%D*3u?pP2gNT{l&Ukt zV=rVhyY=R4tgkj}gnD@FSTk3>D9WX3x{CnRK1E)^#Uj2gOQs#Km84k`$n2fDCtCYl zl!E)Zv{7W3AgSAQHB?%MHQnJmAi zM|JBd)<`YeC;p~9uF3M=Ax0V1t-tLsW9kul%R!7~$-pMs*;_+rf9OU0t^U5WYfKKQ zUU{b}b)Wn4==1%I;fFT!U$y~EJ_?vzF*$R7=$sEtVPH77NFw%~<)Q1l)>PkYvl@Z{ z)2lE-{c2YzmC~&9wXXMuyQ>Ux>S=rvi}k{(wuI+!5D8E_#Ys|2QJZJZmp`%5`MRIc z;1rQ4tO%6swLt%ak(-+PhZ`fVJ&gCdzG(an8Zkj=Vi)T{Ber}-Y^~aX8p16zIiK_MNO^UAfQiWXe29~@# zxV{qa9upND+^@?Eu)O6#unAC*?Va)0WQ@gP_2JM|7!W`$X0tp!k7Gkx<;1x3{pD@< z#JT&nHn2AgNX{@mA7mJGl?3t)Rtf?I2JphZn2n*EmYh&>5cRljYD=vYEh$4CK-*oE z^xVNsVlg!Qg!Vhn$ySZjZ@a8kdd$fEgwCbQ)M8aGjOD=E%d+VpdJ3+vR&T%`n#`2I zp^j*fLff(C+94T>KKSCMOL|WwW7V=RW|Ilz?fLd5H5M_0;vq=oygAyO6_q9e`JffpCRk5Zib>YdH<-HW zy7=qS-8`8a+UpfpU8d0>c}5=oY)M`W-gxj5@WObNRQJ_2x_k~JbEKEPnA8<^Nq}rP z6+e1NHAtQzd9z6nld)7wL4aSi2W#o+=4qQ_QK!dfY-1LCtY!146uE8eMhXD7cA$zj zdUjdj5B>3vMc~nzaOI;aVUTSKTefDMY97G=i(?Z70PGYc(E{~)Fyo&9iRS`HqQa!& zH^YzER{h~h;$Ia%#Owbt6c5jSt(r!u4WdW_8XV-^0<(Y4K47_*`T$9KCf^QoPq^`^ zw0o(c8k0Hhdjl^m3FKmIPlEGTz-$#JDt5BX`KTHis6OU!E3fAwEa^RTat1SKlN$zY*j_Ls4(4|Qmxg0UZ#v#%*Gk_O zg4BQ%jwG}k;nqq%an#%@gZ|y1{AU%XDk?KvwARUJ5DFwD1L4MP5%VSZJ=kzQKV7xd z&0JgM`Uz**(=<$nTzAUVH0tqQ!oPaMz{GsAc_HuJZNcOVuO*U-n6ZIogi4G_ zl3lvK_Q9Hz^L=*^LT}&@0oy6i{h0Dvbu*zPx1NqLG5$mDcZbiu)Va+QxJgtE5zz7?{lmJ^3;kVBH7LqWwC9CCW^I4OXEZhKG# z0~ZfZ@OxIAnY59vxTDkp7TGGEKEa$f5yVsspXEYwy2!PT)k^5Zp;QO0kl8sp&vvW<%W zt%td~+$zOAFj8FMzJ}Yu)vS&2JLyZUa5u-LlT>5(<;mt&njs1RLLhKcGI%=DD~%0} zw|@OT-teVMh)&;ZuT{sd!H*d=Sw80m_bKf~gP7l0U3nfQ0a!pl3uPD0f$V*oZ?60t zyLHci>gMh9>%+O(^0_w|k%}2RTvl?(xqed$m1^GkC&y-$ftoc6c$RJ6HxWGUD-a^h zxPB2PJmcs>^yQ|$FvTc^sA0D^05`#{1C!9Zf; z03aENI(lSk^}pWB6o#B6s9&@fa2uYkJRW@Fc*&AqjTY=0eY6I|?H9IPWvZjBQ;;O1 z*ZbHsi@rOwZIG!^&OxiAN5Y+)e7*@R;)4g<-ondQJt$f2-{k7=*lY2^D|)ibbwTuz z*`i}8&|eq$OmL849May~ip<{w^5*t0u*M!!T9V6y4u!21^q^UufN&O;4fBKtul*pu z$#`G960{lsk_~U!ry$Q^%Q>m~2*wmY+}+;yGqUkF77BE$0ShZ(lfh6hlvP$xtX$q@ zpHt|tbb&N#EXKcR`Ku>TnrEbH_T6>E=?0Oi$$Ew&UJ-J;GJYd8{Cbdb80#Ga(=mRL zlS|wVx;@-RdUye^n+*g58nQ>K&Hk(wy`yVV!Ej8$QM6VpzOGK??FQXD>ksP5fit+) z{l0S<4ZYtfDAL*r9ro%00=pKXn6G(~3x644`D}`}ug(5jZzFrUTtn6qTgdJ%c zi$1*$BM9k-#I3FW82J6|wZZ5HPvK=J^v?UMejl~f7ZW~3S-HqJ5%_S?s*T+UB!9jC zR)lY=H1f)`5iWYQ*yOTP!XL54@Il5_W>@Yldl8b@)|_x8_n~#S`lpB4AKY0t7@XJZq4uU^;B*xJ~9WO5Yad zs)lW+o|;ra$ShIm9C}Fx?f5c`Fa>w>bd8poC|^x+7DlP1cNf$|(E|*>5Jz|!F~0=S zjgcS5z^$gS9j^)+J5y-^u1rn(-FB=VMVSe=Ljbul=~6w4v_GS_HO^HP>FFoRN-uoG zcxNFYKG#~mvCu*{91XZ+v&J1wY$X3d{Lm3o*BTM1;e85R_mTslUGO0;Cw1SKB1CUR zP{&+XeWgu3Kfyt_4pjLiFEpWzyw8AFbjFV?B*S`HdtyD$%CUko%J!}27ARD&fGV=T zGO(RD0!7FZDF%|+ItDJO&X@aoT@Bd@Z0Lv~z^TGq_J(>}`}KS~Vx8^^0$~L|<488r zGM4fRUNcj|+S{-B;9YX)Du4tCyGw*rMbgl-hevi``a5#dcmduj6NmMr{rw^{T`D$C zDHg5>O=N7{!7px%T6rDtr=KOZ{mi>dd9m2BrJY_9#-Jt-!+-yfuQ5w2b`m-V034uW zm7@MgPQSjx3)WQWm|cyoF*B11$*)r-?X7Q<1Q;MYxpZ`On^)?eYhvYvgM|nM`kcND zKPy}FAF6v`&;T7i5V@@cU0Klmx+VSz?#2@^nq3Q&9P z-CzTN1G@ker2e z`wyK382cA3V}VZ}fz}-fXd2|sy968A>v+o{?~YnEp0jvoL2VRB^=#M%vM&SwL=KEK zUgwurA@bt2N>hP?5AhRLU_~EMk9Ltd0Ee$6wR^H~Zp<`=8T6$?q1-eLueqP`ltCW* zf~!s3UvZ5i9X1gS)y-~WIOp&+>BgL24+3v~$I~7B9i^h}4_g~sPLLDd z*$ATOwV^97y-g>aSVKcAN*If(uSDJA9`g!82_{;52d3(q(UHxJzwar=nCbC1CR?L~ z=q>Gz($U&aFsU;xXs<6d(x@k{3;1aM?xrqt!u*w+e+iTH`W%MA(3FP)sxyu^`*oh9PsWL*EpD*mmD>xLb~lk0Xx zrV}`pFmtZS`T<5JvN1P^qRw-2kNQi2Xy1mZ>h!f<4Qq=fWcM$VgUrj&`1~+bU7t}) z?eBR3yHa9O!=h)Vwyp2c+k9-8ZnbXbLLhh|--qF{e@^b%(~6~6cRDW_dJ3w;^uL?0 zzQ<;F!ew96-kgso9S|CMD{fXH7_U+wcDSwssEasE zVNcCSeM_(MggkwYxT0RK-zpEX4epW-%W={;rv*}z{Ei5Jiwc3x_{)0v4(xC1c|A(Y zU3BSj&8ZFt#rs%#SU>M7G>a5YV>DvQw#H~k?aHSL_VhBG7g(# ziR)GwGQ%St^t)aqT&Z)e`(Yws$+4+i!SPUF`m}7;k0S9r&xT8%?uUF*TpUP#($Ya` z>%-#ksA$@#oS}KP;^C!VNk5x>Z{?2G-&-fT!ByB#{_9v!lcop@$ zU=B@ndbr-T%B~SR8@i%w{~MzGiV05e%gwdOdSyVCNe;NFYWm~Y#J0)=2WRO!6;oJZ zjh}}@wIt4d7ed>8J#k1eCVy~)JL%0AS|W8}rJ~~=36XeF%qCnt(XmzwgKrP4=I|ju zOyja2UM91O5l;D`;Tl0cB_Vx&haN{tmClw^8IW zE_vF&XFZVb>GHBS1)4V}rm=`VFupSJR2s5lr9zOr}huA)diH@81!4ooq zG6gGc%-1)LDlDF3y9pjpnm6xr44RW{qf95n==I|%gc`fNL+`)ROpCBN8+RLB-WkIe zBwGeHRyUSsAQx=hCEdUY)GJ>}iY?m(^Q64hP_xDY8G2uA9Hpg5R+gS%8+&xZDMZiJ z_4N9=C9Y;J7vs%HX}tFgjkk%8liLFisd*i(0(8@8R_jvUktp%NSR(@k)caKC&0JBA zo@pN10hTX5dR>t1qtI|W7jN1j922P=hw5D>ikz{XcF9 Bw9fzl diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e334a330657ddd47d5a9f921be2c98ea10a20562 GIT binary patch literal 14399 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 literal 0 HcmV?d00001