From e598cbe85accc641198aaea166200e910687a6d1 Mon Sep 17 00:00:00 2001 From: Toni Melisma Date: Thu, 18 Mar 2021 23:49:15 +0200 Subject: [PATCH] PWA work --- cmd/fastgallery/assets/icon-180x180.png | Bin 0 -> 2896 bytes cmd/fastgallery/assets/icon-192x192.png | Bin 0 -> 3222 bytes cmd/fastgallery/assets/icon-36x36.png | Bin 0 -> 677 bytes cmd/fastgallery/assets/icon-48x48.png | Bin 0 -> 810 bytes cmd/fastgallery/assets/icon-512x512.png | Bin 0 -> 11237 bytes cmd/fastgallery/assets/manifest.json.tmpl | 16 ++++++ cmd/fastgallery/assets/serviceWorker.js | 13 +++++ cmd/fastgallery/main.go | 61 ++++++++++++---------- 8 files changed, 61 insertions(+), 29 deletions(-) create mode 100644 cmd/fastgallery/assets/icon-180x180.png create mode 100644 cmd/fastgallery/assets/icon-192x192.png create mode 100644 cmd/fastgallery/assets/icon-36x36.png create mode 100644 cmd/fastgallery/assets/icon-48x48.png create mode 100644 cmd/fastgallery/assets/icon-512x512.png create mode 100644 cmd/fastgallery/assets/manifest.json.tmpl create mode 100644 cmd/fastgallery/assets/serviceWorker.js diff --git a/cmd/fastgallery/assets/icon-180x180.png b/cmd/fastgallery/assets/icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..d5858d5b0268896b46a9d1156cd639421a5de167 GIT binary patch literal 2896 zcmYjTc{~&T8{bUY+&7!t?AP5=PFV~sXtp}7H;8AA^zb6?=U|Afk4o>b|VPys(x*-LX63o;5NSf#96~=4?`~mBi;h!%Tm8{KE$01~=1$$5i$7 z?vLthBclTl-;?{S@nn&%%os(ARy$Yu5?k|RT;N5`iI){Dme{CYF$ zxpb6&n?rwLvbp%?_Nv-w^x#AgpSKN&%1MPrh~c1h;(2`ZWByQS`;ogJX%HrOjdRU# z?L?hW1V>&2l96dD!NU~wQpZW)icIt6BzZyDxZ}74`~7pi?4JRLpdE;la%z_+Q^QMF z1kOGQc^xI89(HueRr|PAbzR{`5diz3;4)MkO1fgEtbhui-Sge(4bvYfTUBI z4P{BP5M{ZK8=PFZ+w7a?i+vvI;GKHop;#rqA^t`~I8((Az1 z{)N!~EG^p4Pr=;u!c5?(eT(sFr@~cErpl!2Cls+Sh!)07JiJ?t&yr=vC^UkLTlHOs z#Iv!9p2sKMTr5$-bAPC3%#V~pcEC40!@P5#5KJb|_OAK>P;Rxz zu_jnowjV`Qrh76Sz2Fj*5DR$Pei#Jj^f&(e=h#y1cr5h~Wb&ScYh_u#T0wYFTs76= zaJ21@j)5CU-*tZxt<-d74z0 zpZTcmUP3ZVh>z>C#VK<%IzT`~(A_+dD2kD#SUCTmxy~^S$)+XJmZ=tVT%lqZjgBeR zSuGrZ@MI0hw5M9Q)ZXcJ&QAE`?p&+}Y)in}!%bsv+XEuw?tfMv5&Yvb?_HQ^%(r_I z*U)|9Rp&KkH!VTcKsK%;Q3}|`c{rxLGpf%yY1XM%YhB=*=m|c2tF>ykewDfWDg4xJ zlJGu^c{vHOBX|(MRJrIeqoA~D6*_k6f(l+#36~>;k+OzFtJ|qc!>^v^c-=A=Q*H}K zX?9FWPduexOlJ#Gudh{kNMy*Tm!Sg+1!bK0h z%n*t~Ux}VL_7!;eg&-&3J>%Vz_HaefmJIw#JeaXyM<+XFC{mY2qU_a?o%*<}&~~S; zxz|J_s`jmaZ6+MrwH&R^Cg)5snK6i$dTvwH%Ri%;m=+hEw4BqcP@_@3HPV@~{pj77 zXZPsLukCyXb|_n+5=L%IgZO)O?KkXtN|!mKcv@m6Qokn!LqMp?u)_)EVj)_pZZ{S9 zD$%YT{*&<29Q)nPcVtixw^V-h3g5~(F|MlLB9=s5)C1UeeCVTDwKK@UzweAhz2>}= zT{0@RD_=}J+zoG3$8ZbrnH7Y&RX>QpzFmm?UWYMw7ssC{btZ7(;iaO>LE$GVqY?!u z1C$o=@7f$y*YW8R^4!r&OCo!2mRN-p|7BVJ$v{N}6H zQ`IYl-qZbaX0(&cRqD~3uE(*{BT<8T{!&RNH`(^52m4)ZncE+@$o+9s;j8^C^Fh%9 z)eL6a?wWd#W_>?(dbElyV>mK411P;ldOnPRg!1xi?OB|fGjs*DQ`#jei@2@_|Ggdz z2_<@_AAESf1D;grf)MiSTxdbuUt3Ny?}{v3pZ88ifue@ATHrHS#m(`A68HfLd55w9 zvf|!oOh012_|3y}iX4rWe8XVYRBfxT+OBt!_Oa|irS*^ zug8-SYcNmE;6a0Tk;N60Z`H9H*!hYwJIjE$9ftwyrCTVoFG?>}$(5N%70TP?p}u*xjz?)pa5$){$9(&Yu5AKr@NpF%NPJLfC10Oif|-2q&g{t+)qMYq`Y;3 z>dyRp>sL@EPyOH#_=&sNQAs_#E5H7Y{Wq1#Xim*%4MIi@u-KivA19kTC-@+RvvN!u zDr{YbK#DHe+o-P@c!v5}BHwJSA?vwyDf<{TwIgh@4L|;;ZK(Sa^DqyD zNUFFvYj>$4Eloc0K_q2e(&^)it(^Lv!}WJeQC5~Y@P!A^)Dc0XTvShi$t|#>%_4eD z1#f(Onx%okrt?u6#!qq?XOtAk8;CuUJ8CSC-*0eX-YgJu$qAKg5M#vxU1eDyx#|9m8^dFR*L%Pgy3g*HGWZ zMxF9XhMeZ~gw+X%G@emWmdgmvq;ET~7oA䇇wj)nbunyO1qWaW+STCL+wIcgi z@7EjFDZSGdF{G$N8dn-!jsA_Y@jt4vMCHqn-e0 zU^yfpg=X+ER)jgcJDz9>?>1-Eo2R1P1A0$L_j0O}XBDg|iul(GN=?2Q`DMgh`uf9k z1_{AK;&+EXHQQv7o03`N0;ypZ`J=))7Wt()i)@$wj764%Q4|{iW_?-yft; zAUNtk`S#tTQhXIz7n>S*@;Ck}(;lS5^4V*aNK{|Z>MB~RPv}Z47}tXFaiVEA6D_#r&B9$fibQ(IHZP%HvpO+jvmRQ zh%_786Pk1B9!+6QGIkG)Nj|`R%=lrgqb2c~OKmeNiyzb=t!H9#>_$b_Y2L|Md3jmR zx~y_KZXR6t=YT+kyx^xaO1O#^^+^SYz?iI^#N!(_*#VJ(4O~b4ecQ#Yc_>lWmYPmf zrd?|4;l^Fa7c=3aAHR@GW@Y{zJmLI(0>V=#>Bi>aghHXX`}`*t4bOahSV-iE0J{pd z_UWt0a(pvo+If{salM2XK@J7;tYTfuz}^Fdcuj`se9WFWE;~#NrXpM&%I#)m?ZIm( zbyi8_T8G^v?7kzE&G`O7-!S2xNNCq7n!EqsqB5PN_@UVg$h{blaA-#wZ2@9HcTVJYo8@YAnw27UInkg m*9=z#tGeUb9UW#2k3e5jh_(7WQ{}8}7+`H-XI_KyO86g0Buym% literal 0 HcmV?d00001 diff --git a/cmd/fastgallery/assets/icon-192x192.png b/cmd/fastgallery/assets/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..0dfa010eaa1d67ff2633b4e4006c4f55a2a7f29d GIT binary patch literal 3222 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 R8u_OHPFvWT*O+-;|1V8S-;)3U literal 0 HcmV?d00001 diff --git a/cmd/fastgallery/assets/icon-36x36.png b/cmd/fastgallery/assets/icon-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..fd11fcdfe5efe6f93fe932843ba2aecafe268051 GIT binary patch literal 677 zcmV;W0$TlvP)3{e0F@QO_MO8jXsAE3`+ckcf_`h^)AaQ1B0EuDk|? z)0Ok);mmNG2M+Nr-maKX?@>@YlQQdC}**0 zz>qk@LI))6&(J=ACo04wnTXnN4hdbCWYDK6D{-5(T5hrS9K;w#F^4HU5&l)_iAQ=P z$sx1R`A8xA47HW>M&w13hB$P(6c^3<)>FEgj0_VV2~h`UZ8A z@eIsUoD@!Ry#F&)&PEt^##YBz^}4F z{bGtxeSubsiBXHI1(k(K@_aR*vN81dfEH&Qw^RF`;i7QYFD2cA#&IVDb6&|W2Hk)v z!*m0x6q6+HMX}czxZg}h^*34hDm`2wW;5PLZOqj0((=Rn2tHwF>cCn2z`YVNH5}Fc zlJJ7?@cut6$1DhoW(bQ#Yq?-Gk5lO`tm7fRRfK2?%P;p^X9@fRum0$P@nib|00000 LNkvXXu0mjfg}^&q literal 0 HcmV?d00001 diff --git a/cmd/fastgallery/assets/icon-48x48.png b/cmd/fastgallery/assets/icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..dc99d0ff9dd80cffe8da8655c9bbd6a0d5c4c17c GIT binary patch literal 810 zcmV+_1J(SAP)OV8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10=G#- zK~!jg)!IFe4N)A&@z2UtY!(TL5D^*$yPK%cSmF%`rAq4|8bs$6SfW*U2NJJ<2HOyc zWOahXuBTW;!!FrXoIA-i_n4V`=i$!&l7I7`bMAb9=V{J8GyJPfxQaP^#ac^ZsmpYw z%NW%$d}sk|UcARl8vZzzTL4!ymb(p(&?W1k< ziTfN6Q`e@-Kndtd_rrjkuO!BI${d z7$^dtD9=RW1_psIV&YYk28MypGZ9<;YB5j-KF>t$2C9G`#6+bAvX;t0;S*hN%0M0P ziLy*oVxUg=ME^5U+CUTVi54RFC}p5Ycq)F7Rk_*}Ri(Sprs1i`z^LGHEa@JgtzjSrHXIA(6kP6SO5S307*qoM6N<$f{+kz?*IS* literal 0 HcmV?d00001 diff --git a/cmd/fastgallery/assets/icon-512x512.png b/cmd/fastgallery/assets/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfc4a2df72e23a4b197a32012528bc49db71448 GIT binary patch literal 11237 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 { + console.log("Service worker installed") +}); + +self.addEventListener('activate', (event) => { + console.log("Service worker activated") +}); + +self.addEventListener('fetch', (event) => { + event.respondWith( + fetch(event.request) + ); +}); \ No newline at end of file diff --git a/cmd/fastgallery/main.go b/cmd/fastgallery/main.go index e2aba81..94bc0a0 100644 --- a/cmd/fastgallery/main.go +++ b/cmd/fastgallery/main.go @@ -46,12 +46,14 @@ type configuration struct { videoExtension string } assets struct { - assetsDir string - htmlFile string - backIcon string - folderIcon string - playIcon string - htmlTemplate string + assetsDir string + htmlFile string + backIcon string + folderIcon string + playIcon string + htmlTemplate string + manifestFile string + manifestTemplate string } media struct { thumbnailWidth int @@ -75,10 +77,12 @@ func initializeConfig() (config configuration) { config.assets.assetsDir = "assets" config.assets.htmlFile = "index.html" + config.assets.htmlTemplate = "gallery.gohtml" config.assets.backIcon = "back.png" config.assets.folderIcon = "folder.png" config.assets.playIcon = "playbutton.png" - config.assets.htmlTemplate = "gallery.gohtml" + config.assets.manifestFile = "manifest.json" + config.assets.manifestTemplate = "manifest.json.tmpl" config.media.thumbnailWidth = 280 config.media.thumbnailHeight = 210 @@ -121,7 +125,7 @@ type directory struct { exists bool } -// htmlData struct is loaded with all the information required to generate the go template +// htmlData struct is loaded with all the information required to generate the html from template type htmlData struct { Title string Subdirectories []string @@ -412,6 +416,10 @@ func reservedFile(path string, config configuration) bool { return true } + if path == config.assets.manifestFile { + return true + } + return false } @@ -621,6 +629,15 @@ func copyFile(source string, destination string) { } */ +// createPWAManifest creates a customized manifest.json for a PWA if PWA url is supplied in args +func createPWAManifest(gallery directory, source directory, dryRun bool, config configuration) { + // TODO Fill in data structure, load template and execute it + // TODO Iterate over icons, grab size from filename + // TODO Add manifest link to HTMLs + // TODO Add apple-touch-icon to HTML + // TODO register service worker in HTML, add manifest and apple-touch-icon links to head +} + // copyRootAssets copies all the embedded assets to the root directory of the gallery func copyRootAssets(gallery directory, dryRun bool, config configuration) { assetDirectoryListing, err := assets.ReadDir(config.assets.assetsDir) @@ -636,31 +653,14 @@ func copyRootAssets(gallery directory, dryRun bool, config configuration) { if !entry.IsDir() { switch filepath.Ext(strings.ToLower(entry.Name())) { // Copy all javascript and CSS files - case ".js", ".css": + case ".js", ".css", ".png": if dryRun { - log.Println("Would copy JS/CSS file", entry.Name(), "to", gallery.absPath) + log.Println("Would copy JS/CSS/PNG file", entry.Name(), "to", gallery.absPath) } else { - assetPath := filepath.Join(config.assets.assetsDir, entry.Name()) - filebuffer, err := assets.ReadFile(assetPath) - if err != nil { - log.Println("couldn't open embedded asset:", assetPath, ":", err.Error()) - exit(1) + if entry.Name() == config.assets.playIcon { + break } - targetPath := filepath.Join(gallery.absPath, entry.Name()) - err = os.WriteFile(targetPath, filebuffer, config.files.fileMode) - if err != nil { - log.Println("couldn't write embedded asset:", targetPath, ":", err.Error()) - exit(1) - } - } - } - switch entry.Name() { - // Copy back.png and folder.png - case config.assets.backIcon, config.assets.folderIcon: - if dryRun { - log.Println("Would copy icon", entry.Name(), "to", gallery.absPath) - } else { assetPath := filepath.Join(config.assets.assetsDir, entry.Name()) filebuffer, err := assets.ReadFile(assetPath) if err != nil { @@ -1202,6 +1202,9 @@ func main() { // Copy updated web assets (JS, CSS, icons, etc) into gallery root copyRootAssets(gallery, args.DryRun, config) + // Copy PWA web manifest and fill-in relevant details + createPWAManifest(gallery, source, args.DryRun, config) + // If there are changes in the source, update the media files newSourceFiles := countChanges(source, config)