From e0e9cca371713a38d2e83a512faec4f14995adc5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christopher=20Cot=C3=A9?= Date: Sat, 14 Oct 2023 06:36:20 -0400 Subject: [PATCH] add videos --- media/database.db | Bin 278528 -> 282624 bytes media/database.db-shm | Bin 32768 -> 32768 bytes media/database.db-wal | Bin 4124152 -> 4124152 bytes media/default.env | 1 + media/image_metadata.exs | 171 +++++++++++++++++- media/templates/video.html.eex | 24 +++ media/templates/videos.html.eex | 27 +++ www/css/videos.css | 48 +++++ www/videos.html | 125 +++++++++++++ .../096f12b38af0717d3d836dc059021a24.html | 24 +++ .../0de505a86fe73b5f7af5f15115bf789f.html | 24 +++ .../167e29dc5b7c05c05021395b4cca29e2.html | 24 +++ .../326f1664b717ebb4a624881df2064332.html | 24 +++ .../3a3063a44387fc9d4f052754ea802733.html | 24 +++ .../3e7ce3ef0b169606cdbe342928719634.html | 24 +++ .../3ea6f31ec67c8dad7bc3c20b796bda4c.html | 24 +++ .../5d36ea72180a0640549445d93414eb6b.html | 24 +++ .../64f7d344c9993bf7837bd5dbcc553207.html | 24 +++ .../716e81c5b84a2f691fdf0d183c4d84ea.html | 24 +++ .../871d582560962db4cbd0593000d6bf9a.html | 24 +++ .../a51ffdbe691059d692706ecd511eb756.html | 24 +++ .../ab0f82d4281c57188c9f7e335aea6a65.html | 24 +++ .../c567671795fa33a74a1e9b77d2487470.html | 24 +++ .../c58497d555f0886271fe42ae18a69ba9.html | 24 +++ .../cfeaa8d830c1da8ecf7f8749019c9c44.html | 24 +++ .../d1680f15b97bbe30f087cb95cc4a778c.html | 24 +++ .../dad6b28a1f34b2d7cb4f7af929ae7c05.html | 24 +++ 27 files changed, 826 insertions(+), 2 deletions(-) create mode 100644 media/templates/video.html.eex create mode 100644 media/templates/videos.html.eex create mode 100644 www/css/videos.css create mode 100644 www/videos.html create mode 100644 www/videos/096f12b38af0717d3d836dc059021a24.html create mode 100644 www/videos/0de505a86fe73b5f7af5f15115bf789f.html create mode 100644 www/videos/167e29dc5b7c05c05021395b4cca29e2.html create mode 100644 www/videos/326f1664b717ebb4a624881df2064332.html create mode 100644 www/videos/3a3063a44387fc9d4f052754ea802733.html create mode 100644 www/videos/3e7ce3ef0b169606cdbe342928719634.html create mode 100644 www/videos/3ea6f31ec67c8dad7bc3c20b796bda4c.html create mode 100644 www/videos/5d36ea72180a0640549445d93414eb6b.html create mode 100644 www/videos/64f7d344c9993bf7837bd5dbcc553207.html create mode 100644 www/videos/716e81c5b84a2f691fdf0d183c4d84ea.html create mode 100644 www/videos/871d582560962db4cbd0593000d6bf9a.html create mode 100644 www/videos/a51ffdbe691059d692706ecd511eb756.html create mode 100644 www/videos/ab0f82d4281c57188c9f7e335aea6a65.html create mode 100644 www/videos/c567671795fa33a74a1e9b77d2487470.html create mode 100644 www/videos/c58497d555f0886271fe42ae18a69ba9.html create mode 100644 www/videos/cfeaa8d830c1da8ecf7f8749019c9c44.html create mode 100644 www/videos/d1680f15b97bbe30f087cb95cc4a778c.html create mode 100644 www/videos/dad6b28a1f34b2d7cb4f7af929ae7c05.html diff --git a/media/database.db b/media/database.db index b89600972452952410ac9fb6c0c4342586d4bf20..20fc448e484de2ff0b392624b16cd0781ad7e01f 100644 GIT binary patch delta 21320 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 delta 19891 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 literal 32768 zcmeI51&|y^5=Ha>6f-k3Gcz+YGc&U+W@ct)W@ct4+mhKb$Rx9M)pu@3dnNmB`z-A$ zR1@)|t84Q2RK3dXso7AZ;ylVI?h7JO9;iqO(@`|k-6tg`?0Gul;iG-qAJO4%@%dFG zDxvZERU+f{tHj3ZS4oW5uaX+CUnMhMze;Yrew4!a{3@mK`cW$5^Q+Xx z>sM)v*N@T~UtpBZ#0N&{O}t-aFy6q**>U+*Cgb(1%*N|iS&Y}OiWsk7Wi{TwDx2{H zM%higALTH8kM0bNp**6Lg|Z(#bkSr|Mxns>k(&p43x%TF>Y?J+Bw^lDL0Y5> zR@v_vbdWTszc%++J=SLfHe@3h)>1WjnTK2X%qg78X*Tl%@GOI}D2MW>fQqPu%BX^>sD|pOftsjgpZy+M zkxgxusHXNxbW<-erm3|O+td+^Yijz%H#PPWN>}Zs-F27l(W^oJ#F)+*oXJ_7%{iRQ zd7RG$T*yUit!=cecGS+=MVIMvU7@RVjcy3?@p>S?;%05sL0!~CeKbHrG(uxEK~pqC zbF@H9oBf{ENMx!qCNUKflbLFTDNH4xRHhvC9|JHDZ($GyV+e*~n9Y69n%*8y+ z#{w+GA}q!d%+a~JSNFZ~neRZWFAb!jG?K>BM4C!7X)Z0KrL>aP(k1}Ypgw(%@AE@` z#Er6Sr_1cW@W?a9^GOYtFv@Ltv)NlG!px=E^*oFAHR$ERw~tM3%}jSuO)~ zpuVM>b&Ku@a%S;0fhN>Mnpl%)Qcb4GHHD_sR6#zj;Fn4F@c?h*9lVQ&c!c-xK0d&Q z_y`~46MSm-KAr_zAuDB-td=#hR@TXS*&rKblWdkPvegq69Ga;$ji%LfnqD(#M$M#| zHH&7|Y&QF!Tb#%E44>l*e2FLc3SZ+Je2ee!6yM_q{D{T6L~rXo%gu1xCfj9)?37)y zTlUCa*(dwufE<)Va#)VYAUzmtC}r0inp1OWZq1{4HJ|3!0$NZDX<;p*b%M<(pG(Cc z==cdg;}`sj-|)=*GcJ%+hG0mBVrVYayOz}-YjRYM$#FR$C*_o!mNRlz&dGVXAQ$D5 zT>c{}I5diCF)gkow4|2O(ppB#+Ex6EWeLNu49D<{z=({*$c)0MjK=8pufxyrx*}KQ znp~F~a#L=}ZMh?N<(}M^2lBSO^IUXLc9hfdT0tvnC9Q1p{%;o|24gZ7V>1rpG9KeI z0TVJ26Wi>6j@rBOP#(#9^1gf^AIeAav3w$*%47LVK9?_Kuny6oI!uS_2py>h^pGCY nvwBf4>y=lYfqmGQ{n(!aIFN5~5C?MzhjJK)a|B1ef|dOjKh~6e diff --git a/media/database.db-wal b/media/database.db-wal index aa2dd10d6c846f6c920aa46f89623d52d7884806..4d8eb3364165812dd2a1d70895805dbe65a90e64 100644 GIT binary patch delta 82020 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 delta 59430 zcmeHQ4U`;3wchTT-I>|h|LosPc4o2*2$F2Js;j!IdqRNqARrKBF&>fw3F%)5CS;QU zhJa)fgFGK1i2|jFAyE!SQ9~Z!U_g?f2Z`?~380>%C@$)gBZ$UlFbMDMyWO*!o&Cv- z2upTj~pRtS#G8R&%KO4^=P3pR3##dpx=;^6iTI z%fA}l9@-(_D{U*=vbkr?j16V!X=NmpkP;DDmLp`|`uOsbV+vA~PK4oyn?IP{!Y{k6 zBFb;v)EMDaD_MKS!_2m@rn|_ok*gVoP8AJdO0i`j#p2xqZOwdZWhllMTdeJ)boQ0K zmv{Ns>_XW8DWR|VpTDGInR%77+BSRLjzt^FQbnztkCm)~vPj`Qw^cO9uU^}K&bJz` z4{ekQuUpAdX~Yy=H>j<+)HH}=>7MSowyt1X^EAXa?F*&(r4~z_Z78E{Ew1XAV{MJL z@tsRpCZc2!%_=I#Z-i5Pzy!Z(j;(l>OKha-riK(l)d|76ZX>KYF5;W_%c;N)MH}O@ z61o=OYO*`gm zyBdN@O7P61a$BW3A8X*ItO_^SCAaXdQ`+LP+{dN68XGgFiWo$>Y8s|TiASmKI)=e) z*VHZDbh-3MIL-Gq)FcTpMvNNi!fID3?cToVbg7kZ9;o%r02>I&qQHy}o;{^4mBBVs zDaNK}5F4Cgo7e?YRAL}-4}(woQ*F-;bus=#LrsDbovH;+32Z2F35~DpizZ~LrO+89 zOVF@0LULavKaeSJOjC_1wy9E^>KGvxo7e(RFv3)as+70SOB`{A8cgHCX&)G3mC!!0 zXIfI0ngcr`gM-3*ZfQ#TBN7W&92pbhI#e??+oqe4V@Uw(;Zj`v16DB*1^J< z&{<)S=3}CSb`TSdK}^Jg`>QY-9DA`=zT`1E&U;=+rP3aunCZ5nz!0daMVVz$TSK-( zk&BG{L@5Xh0~Ic8ff>cG;OTx?B&BIXc3?G2VUgwC%fOD_Tbts%_q6G$v}S1zQV@lk z5|!Ah!#rduFbLRIU5~e)pGZq2m>-lF%9xNSu5Jt((J*8L3 zqA^Wpism8PwoK1u#HI#O7%^>bJ{KCcf$4bk{2)cu4J+@6dcJ;LG*L}EF`JKJtWZxyNHbtt<*`e3nLJS*o8T=jdRpp zn8iO^asH~aA6z34h(I6$fd~X55Xjp`Ab+4&sFH??SS)fNA_r1B2O^&_ul&IC_kBws5P?7h z0uc!0pF$x1n}0H#g%JoOc=L;07?A_XAElWJXJNj-rR--806(-zMTjck$0#ny_^7Wbo* zpo+YQ$a@?iaUV&73hz2`{8k)(5rrQkc-)U#_;LG%3(q_C@$3HmUk`X_ldTbq03O3F zU_{14WIT@EJ!Vw@7g6sa>ODlgM?w3TsZj6nxs@I6wzbpuyo11_%a}D4I?xH=F{1aJ z$asj1NAccuW7@umN)J)#Au2tF`qqiYbK`Zc8_IY`fUNIcPc>m%<2+^zr(&vlIM(A8V-M%RSaFBRzLv@7!7`rq5S! zmTFnbd#-~fhcljTi1XD8*iEwD#cx}{X7J=f*6Cl%T*_jSueWUV+=vtcJ-+x7Hj}Tr zK9I&-LvOv`~Lk+$t9hUR)UG$r)--fNmu{8yK-&JMk+#Ah+@yp)|Ik=(7z zShFN4xlb>Gzbl{vBD8ho^)J-7@;!^$>lLsm%CfM%@x5u#)Ney1!XH?~+WEj`>;UK- zSi=4$MQ7Li<>K%C`1I3+dj{Q;1NZEcqtC~de`DdSnVbH#{E~yPiH4&OSG>|${lJb{ z$NR&dRvtb5kL1eozu&O`czx6lS46+?%Bh(-cYWc3 zKbtDOwMD&aMyVxz@PVGaYuCqnKlYv0cjbXr%{^0|py$~8@O#%TfAFHKCh$3O@Y-cE zUwZXieS#k1uJr82tG}}2um9{rFe$fU0ef*mZT#uMraNDgmv+1r8*|H7%uUJ@Zd>Hl zdH?s=2R`+0{Ar8zjt{+1#YB$ZfhRwCseaDP8%Oyj2iPwe&dpuG8bcF#`ycIIFe}&k z+Dn7C&jIvoDxdh<&RP?hb5cC((i)) z3j71FdnVMx=iJTySPqnsSmn~oGu!zGzr>#BZC_$lGB$EccFR=~{0F~kkNl?pZD846 z`ET%dZtgbrvJ_p5FTL*u^+Vw){6x7~o7ivV=&v7p;?$4MT5;_Ze3BfD%}+x7uzV_)yesXQ- z?nz~T4kq}YB!5PaHF)7)4t-l!4LJk({9}eF7^~}b@GhbYN#RT0t2k!{GGXInZ?q2oxyIwl@ySH_#ma6>4 zF!}CH_gt~&?6-2U4@Sq2%0EB--*MK*Av9AQd1HkSItDq!J_!QUy{CQUg*8QU_8G(f~3Iq!FYEq#2|Iq!lCq zk_4F!(gu}yO*s7=KkjNv3icP~}*wY;aS*}7I*91=RD_c?$<(qehlT_8IGW*Kj z%exe$C|!tlVb)bbpXB$qYXV~;v=g)WnDU(iwW%X!?7SGarCi%X6q(d@iQ}l)#nh&{ zt*FFxRhOI3)~AP!(6rG;prY!Kl3dvrO~_I;&pax(#n60Y_{XGF{=ll%_OSf*vZr|e z>ej}zOQ@x|*ajOcQ(=l>y2v9gF%1Q2Ha}=2(*XW^`qN2DR6+`@0P0oLRb1UN@>Wz; z@#|N%wng$*D0#s5fYln~_iSx!O}iGdZ0hKYz{6udp9-#EuIFNmUARPDO@R&A7-K_G zb%2l;Sgj|@kvQL`sLgx{t}2gW+^1Rneem&sp;5b6G0Q!UrlRM(&u1}8WcWMzL^o*webh_MO0QbOD0(k{7Gj#Lg?RGGI3&ax4H;MUGo z{_)*%5U_h!&TdP4mWmu?sFZn@Z4ss+f>h#RL&3VI@%n+<48N#94efAMZOjl^#kB!p z`^H3L!2y)8KSbO-G_#R^XqVi`%U8rw8RjXfgG|jbOh+-1Vp3+BFl%%eGetFd53e}l z3|u%{0%w%aw(=oT8|DAGB$lXBg6RSoeb{Q|2d`*px%21saT%g@=cgiVX%hmIx(4!? z?eqS4l&QAPJfeHH<9ZysEgAmV-Qfhqs!}*(6o1-!#kF1D3twmWubya#h8Jz9jTG90 zvlzh+!pe=!Exh-96ybfJZwiOYo;owk_ilR5f%ijQ@Gc@=?qm3enj*x=v?@2p7h{XdXn za)r$6Rx%hjTXB8A*s4oZPjxIrRG8LGGY}>4g>3WfO)2<-7p!yOu)>KIIIM)eQRuMs zHzh&;q(b1>n&}y^W10%S;Jv?0^1}4sY3tkGZQ>LuKNP;lP-RyfOT;C#NO(H|5$mk6qD{%2=w3 zG-@#yE3npi3idorGgZrUJgn=8Z{8Qm$1~WX2G<^3{R3M{Xq#hf2^BboXk1#~l<b<$Z)9x|_#aKv386Ytbdw;$yRV53`vr~mO9}13j|G0&0Fkj$izh18PJg`t z4s4b0ScGQy;oP3~G^Fb=v0yqGR99SxUCq^06BcEgF)p1QPs4E=|5ZRVIwFDtzZ6#| z{6j6(3He4Ta0a}O{JZ=6TYGcm!5rrwxxFc!rbNMprP+oJE3VB9O;yV`<#n zU!NMZVI9Ot;aU^e0KrsDKlprsKVZ=x0Xnu;&Ap#RUqAUD0UfeH9b-U?KpjJ%MW7CW zI?&ri9jZVbV^NDh9phmZfjY(oEmHz@oNz|}<=f7D>SlpD@(Gs_-=~9wi^z3A>M5UZ z5xI`zCf5=6zr6DYSVzm9OIxCoBF`ZZ$2fTsfj9)>$Y=kLmpsSQzpGe!$qAnw?BiT~ zb4BDi#%|7tJcr103<9#Zy1RnOG2C4dh-1v&jM!Nzx-TPkR>t3#5j!g*cVmK+sOP}*5mXJl_} z7KlS2j)_1V!TWuJDoAnHKT|;}5QkquDsmhm$1z;5AH3y7^=QJcsuk6v6I(sH`;+q@ z`uMAO-2CS8 zf;jYJ&dVVX$1n><6pI{($Z-@fdKBa25IGK!;}AKH<37jnfnS*Y?>q6q1#bg!=#z;F zOdyUt6PU*)b`q5wBy#2wQ zdBm}$tmaVlAF5u6KUcXg_IPwx!_6Peo(k;_mC4p;ITKO*zDNo%ZoUyt@d1;yXEeuFJj*3E zQgu^9ilG8y9uW802y2cD^nLr~6u;DBDMh0Ngn76N;jR+87T;>JqdwQPX@ak2r3tWpEq(ne5TdB^6(=I^h zuNG47%6(kAtFbX-s)#u-V5VVulz5bmYMCrO5>E5I4K+yuB$|bu0@f3?tCV(cUv#?E z8W5O*8Gcg%=%y8z(ZRE)w52k*c+*1OJ617i0$?|C7WN_#+q%7Akj`ukv2wJ5VJYHP@LD6n!G`H4~x7H}4HbXXL> zf(LCe`l3l`+K?Ss%~DuodG|7~qxaUPIPX1edMd41nu8QX;if<^Y^x6Qkfp#NVBl`` zc>DPYp8?sQACwp)m~8`J6jwI}jc6D$0wxH2`$AlLt#;5EFiFxW$0i!nbf#z?vTe)s zTn1ds22mI>ZEijn8n%Jyg|w)F4Wy|0xP1>{qg~G`h06udFZVA_wxy^B+^33VIR;Rn u0&T2;3OXk9`gP4i)Yw31s}=Ir26RzcQT0jKaGBQ~&PH;-|K;iRb^i}T#$1p9 diff --git a/media/default.env b/media/default.env index dbce8d59..8a19af83 100644 --- a/media/default.env +++ b/media/default.env @@ -1,5 +1,6 @@ export IMAGE_ROOT_PATH=XXXXXXXXXXXXXXXXXX export IMAGE_OUTPUT_DIRECTORY=XXXXXXXXXXXXXX +export VIDEO_ROOT_PATH=XXXXXXXXXXXXXXXXXX export AWS_ACCESS_KEY_ID=XXXXXXX export AWS_SECRET_ACCESS_KEY=XXXXXXXX export AWS_REGION=XXXXXXX diff --git a/media/image_metadata.exs b/media/image_metadata.exs index de6ae9c5..1c52c202 100644 --- a/media/image_metadata.exs +++ b/media/image_metadata.exs @@ -5,7 +5,8 @@ Mix.install( {:exexif, "~> 0.0.5"}, {:hackney, "~> 1.18"}, {:jason, "~> 1.3"}, - {:ecto_sqlite3, "~> 0.12"} + {:ecto_sqlite3, "~> 0.12"}, + {:sweet_xml, "~> 0.6"} ], config: [ ex_aws: [ @@ -62,6 +63,28 @@ defmodule Image do end end +defmodule Video do + use Ecto.Schema + import Ecto.Changeset + + schema "videos" do + field(:datetime, :utc_datetime) + field(:name, :string) + field(:hash, :string) + field(:original_path, :string) + field(:path, :string) + field(:uploaded, :boolean, default: false) + end + + def changeset(image, attrs) do + image + |> cast( + attrs, + ~w[datetime name hash original_path path uploaded]a + ) + end +end + defmodule Migration do use Ecto.Migration @@ -87,6 +110,136 @@ defmodule Migration do end end +defmodule Migration0 do + use Ecto.Migration + + def change do + create table("videos") do + add(:datetime, :utc_datetime) + add(:name, :string) + add(:hash, :string) + add(:original_path, :string) + add(:path, :string) + add(:uploaded, :boolean, default: false) + end + end +end + +defmodule Videos do + import Ecto.Query, warn: false + + def parse_root(root_path) do + files = + root_path + |> File.ls!() + + Enum.flat_map(files, &parse_dir(&1, Path.join(root_path, &1))) + end + + def parse_dir(dir, path) do + project = Path.join(path, "project.mp4") + thumb = Path.join(path, "thumbnail.jpg") + + if(File.dir?(path) and File.exists?(project) and File.exists?(thumb)) do + stat = File.stat!(project) + data = File.read!(project) + hash = :crypto.hash(:md5, data) + encoded = Base.encode16(hash, case: :lower) + file = encoded <> ".mp4" + + v = + case Repo.one(from(v in Video, where: v.original_path == ^project)) do + nil -> %Video{} + vi -> vi + end + + cs = + Video.changeset(v, %{ + name: dir, + datetime: NaiveDateTime.from_erl!(stat.mtime), + hash: encoded, + original_path: project, + path: "videos/#{file}" + }) + + cs = + if Ecto.Changeset.changed?(cs, :datetime) do + Ecto.Changeset.put_change(cs, :uploaded, false) + else + cs + end + + [cs] + else + [] + end + end + + def create_videos(videos, media_server) do + f = + EEx.eval_file("templates/videos.html.eex", + videos: videos, + media_server: media_server, + current_tag: "videos" + ) + + File.write!("../www/videos.html", f) + + Enum.each(videos, fn v -> + f = + EEx.eval_file("templates/video.html.eex", + video: v, + media_server: media_server, + current_tag: v.name + ) + + File.write!("../www/videos/#{v.hash}.html", f) + end) + end + + def upload_new(videos, bucket, region) do + new = Enum.reject(videos, & &1.uploaded) + + Enum.each(new, fn %{original_path: src_path, path: dest_path, hash: hash} = record -> + [_ | path] = + src_path + |> String.split("/") + |> Enum.reverse() + + thumbnail = ["thumbnail.jpg" | path] |> Enum.reverse() |> Enum.join("/") + thumbnail_data = File.read!(thumbnail) + + bucket + |> ExAws.S3.put_object("videos/#{hash}.jpg", thumbnail_data, + content_type: "image/jpeg", + acl: :public_read + ) + |> IO.inspect() + |> ExAws.request(region: region) + |> IO.inspect() + + src_path + |> ExAws.S3.Upload.stream_file() + |> ExAws.S3.upload(bucket, dest_path, + timeout: :infinity, + content_type: "video/mp4", + acl: :public_read + ) + |> IO.inspect() + |> ExAws.request(region: region) + |> IO.inspect() + |> handle_result(record) + end) + end + + def handle_result({:ok, _}, video) do + cs = Video.changeset(video, %{uploaded: true}) + Repo.update(cs) + end + + def handle_result({:error, er}), do: IO.inspect(er) +end + defmodule Images do import Ecto.Query, warn: false @@ -292,11 +445,16 @@ defmodule Main do _ok = Repo.__adapter__().storage_up(Repo.config()) {:ok, _} = Supervisor.start_link(children, strategy: :one_for_one) - Ecto.Migrator.run(Repo, [{0, Migration}], :up, all: true, log_migrations_sql: :debug) + + Ecto.Migrator.run(Repo, [{0, Migration}, {1, Migration0}], :up, + all: true, + log_migrations_sql: :debug + ) end end root_path = System.fetch_env!("IMAGE_ROOT_PATH") +video_root_path = System.fetch_env!("VIDEO_ROOT_PATH") output_directory = System.fetch_env!("IMAGE_OUTPUT_DIRECTORY") bucket = System.fetch_env!("AWS_BUCKET_NAME") region = System.fetch_env!("AWS_REGION") @@ -321,3 +479,12 @@ Images.create_images(images, tag_keys, date_keys, media_server) Images.create_tags(tags, tag_keys, date_keys, media_server) Images.create_dates(dates, tag_keys, date_keys, media_server) Images.upload_new(images, bucket, region) + +videos = + video_root_path + |> Videos.parse_root() + |> Enum.map(&Repo.insert_or_update!/1) + |> Enum.sort_by(& &1.datetime, {:desc, DateTime}) + +Videos.create_videos(videos, media_server) +Videos.upload_new(videos, bucket, region) diff --git a/media/templates/video.html.eex b/media/templates/video.html.eex new file mode 100644 index 00000000..e6f22e01 --- /dev/null +++ b/media/templates/video.html.eex @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/media/templates/videos.html.eex b/media/templates/videos.html.eex new file mode 100644 index 00000000..46681176 --- /dev/null +++ b/media/templates/videos.html.eex @@ -0,0 +1,27 @@ + + + + + + + + + + +
+
+ <%= for i <- videos do %> +
+ + + + <%= i.datetime |> DateTime.to_string() |> String.replace_suffix("Z", "") %> +
+ <% end %> +
+
+ + + diff --git a/www/css/videos.css b/www/css/videos.css new file mode 100644 index 00000000..7c88639f --- /dev/null +++ b/www/css/videos.css @@ -0,0 +1,48 @@ +html,body{ + background-color: #232323; + width: 100%; + margin: 0; + color: #cccccc; + font-family: sans-serif; +} + +main { + max-width: 1024px; + margin: auto; +} + +#header{ + height: 20px; + width: 100%; + background-color: #111111; + margin-bottom: 30px; + padding-top: 10px; + padding-bottom: 10px; +} + +#header span{ + margin-left: 10px; +} + +span#tag{ + color: #22FF22; + margin: 0; +} +span.datetime{ + color: #333333; + margin-top: 7px; + float: right; + font-size: 10px; +} + +.video{ + padding: 7px; + padding-bottom: 30px; + background-color: #EEEEEE; + margin-bottom: 30px; +} + +img{ + width: 100%; + padding-bottom: 33px; +} diff --git a/www/videos.html b/www/videos.html new file mode 100644 index 00000000..fa7e7cc1 --- /dev/null +++ b/www/videos.html @@ -0,0 +1,125 @@ + + + + + + + + + + +
+
+ +
+ + + + 2023-10-10 17:13:37 +
+ +
+ + + + 2023-10-06 14:42:29 +
+ +
+ + + + 2023-10-06 01:45:38 +
+ +
+ + + + 2023-09-10 22:50:39 +
+ +
+ + + + 2023-09-09 18:56:58 +
+ +
+ + + + 2023-09-01 14:49:26 +
+ +
+ + + + 2023-08-30 18:00:21 +
+ +
+ + + + 2023-08-21 18:50:32 +
+ +
+ + + + 2023-08-18 00:37:40 +
+ +
+ + + + 2023-08-11 02:41:09 +
+ +
+ + + + 2023-08-10 20:31:30 +
+ +
+ + + + 2023-08-09 16:46:48 +
+ +
+ + + + 2023-08-08 15:08:29 +
+ +
+ + + + 2023-08-07 18:41:39 +
+ +
+ + + + 2023-08-03 00:14:18 +
+ +
+
+ + + diff --git a/www/videos/096f12b38af0717d3d836dc059021a24.html b/www/videos/096f12b38af0717d3d836dc059021a24.html new file mode 100644 index 00000000..d68a0c6d --- /dev/null +++ b/www/videos/096f12b38af0717d3d836dc059021a24.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/0de505a86fe73b5f7af5f15115bf789f.html b/www/videos/0de505a86fe73b5f7af5f15115bf789f.html new file mode 100644 index 00000000..9ed2f281 --- /dev/null +++ b/www/videos/0de505a86fe73b5f7af5f15115bf789f.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/167e29dc5b7c05c05021395b4cca29e2.html b/www/videos/167e29dc5b7c05c05021395b4cca29e2.html new file mode 100644 index 00000000..053204e3 --- /dev/null +++ b/www/videos/167e29dc5b7c05c05021395b4cca29e2.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/326f1664b717ebb4a624881df2064332.html b/www/videos/326f1664b717ebb4a624881df2064332.html new file mode 100644 index 00000000..fbc236ff --- /dev/null +++ b/www/videos/326f1664b717ebb4a624881df2064332.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/3a3063a44387fc9d4f052754ea802733.html b/www/videos/3a3063a44387fc9d4f052754ea802733.html new file mode 100644 index 00000000..7d739d07 --- /dev/null +++ b/www/videos/3a3063a44387fc9d4f052754ea802733.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/3e7ce3ef0b169606cdbe342928719634.html b/www/videos/3e7ce3ef0b169606cdbe342928719634.html new file mode 100644 index 00000000..47efd93a --- /dev/null +++ b/www/videos/3e7ce3ef0b169606cdbe342928719634.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/3ea6f31ec67c8dad7bc3c20b796bda4c.html b/www/videos/3ea6f31ec67c8dad7bc3c20b796bda4c.html new file mode 100644 index 00000000..c9c556f4 --- /dev/null +++ b/www/videos/3ea6f31ec67c8dad7bc3c20b796bda4c.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/5d36ea72180a0640549445d93414eb6b.html b/www/videos/5d36ea72180a0640549445d93414eb6b.html new file mode 100644 index 00000000..76ff9e13 --- /dev/null +++ b/www/videos/5d36ea72180a0640549445d93414eb6b.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/64f7d344c9993bf7837bd5dbcc553207.html b/www/videos/64f7d344c9993bf7837bd5dbcc553207.html new file mode 100644 index 00000000..73a6a0e5 --- /dev/null +++ b/www/videos/64f7d344c9993bf7837bd5dbcc553207.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/716e81c5b84a2f691fdf0d183c4d84ea.html b/www/videos/716e81c5b84a2f691fdf0d183c4d84ea.html new file mode 100644 index 00000000..ac84cf4f --- /dev/null +++ b/www/videos/716e81c5b84a2f691fdf0d183c4d84ea.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/871d582560962db4cbd0593000d6bf9a.html b/www/videos/871d582560962db4cbd0593000d6bf9a.html new file mode 100644 index 00000000..3d6957c5 --- /dev/null +++ b/www/videos/871d582560962db4cbd0593000d6bf9a.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/a51ffdbe691059d692706ecd511eb756.html b/www/videos/a51ffdbe691059d692706ecd511eb756.html new file mode 100644 index 00000000..51909a65 --- /dev/null +++ b/www/videos/a51ffdbe691059d692706ecd511eb756.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/ab0f82d4281c57188c9f7e335aea6a65.html b/www/videos/ab0f82d4281c57188c9f7e335aea6a65.html new file mode 100644 index 00000000..acbc61bf --- /dev/null +++ b/www/videos/ab0f82d4281c57188c9f7e335aea6a65.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/c567671795fa33a74a1e9b77d2487470.html b/www/videos/c567671795fa33a74a1e9b77d2487470.html new file mode 100644 index 00000000..83069125 --- /dev/null +++ b/www/videos/c567671795fa33a74a1e9b77d2487470.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/c58497d555f0886271fe42ae18a69ba9.html b/www/videos/c58497d555f0886271fe42ae18a69ba9.html new file mode 100644 index 00000000..64ffe7fd --- /dev/null +++ b/www/videos/c58497d555f0886271fe42ae18a69ba9.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/cfeaa8d830c1da8ecf7f8749019c9c44.html b/www/videos/cfeaa8d830c1da8ecf7f8749019c9c44.html new file mode 100644 index 00000000..8f8eeb59 --- /dev/null +++ b/www/videos/cfeaa8d830c1da8ecf7f8749019c9c44.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/d1680f15b97bbe30f087cb95cc4a778c.html b/www/videos/d1680f15b97bbe30f087cb95cc4a778c.html new file mode 100644 index 00000000..35ac7291 --- /dev/null +++ b/www/videos/d1680f15b97bbe30f087cb95cc4a778c.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + diff --git a/www/videos/dad6b28a1f34b2d7cb4f7af929ae7c05.html b/www/videos/dad6b28a1f34b2d7cb4f7af929ae7c05.html new file mode 100644 index 00000000..014cf98f --- /dev/null +++ b/www/videos/dad6b28a1f34b2d7cb4f7af929ae7c05.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
+
+ +
+
+
+ + + -- 2.45.3