From 1ca410774d40448b39897bae178d1c9b7ae2e87c Mon Sep 17 00:00:00 2001 From: "Bora M. Alper" Date: Sat, 22 Feb 2020 15:42:14 +0000 Subject: [PATCH] magneticow: display readme! --- cmd/magneticow/api.go | 147 +++++++++++++++++- .../static/fonts/PxPlus_IBM_VGA8/README.md | 7 + .../pxplus_ibm_vga8-webfont.woff | Bin 0 -> 20532 bytes cmd/magneticow/data/static/scripts/common.js | 16 ++ cmd/magneticow/data/static/scripts/torrent.js | 19 ++- cmd/magneticow/data/static/styles/torrent.css | 17 +- cmd/magneticow/data/templates/torrent.html | 12 +- cmd/magneticow/main.go | 11 +- go.mod | 1 + 9 files changed, 219 insertions(+), 11 deletions(-) create mode 100644 cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/README.md create mode 100644 cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/pxplus_ibm_vga8-webfont.woff diff --git a/cmd/magneticow/api.go b/cmd/magneticow/api.go index fb9663430..8728b004d 100644 --- a/cmd/magneticow/api.go +++ b/cmd/magneticow/api.go @@ -1,18 +1,163 @@ package main import ( + "bytes" "encoding/hex" "encoding/json" "fmt" + "io" + "io/ioutil" "net/http" + "os" "strconv" + "strings" "time" - "github.com/boramalper/magnetico/pkg/persistence" + "golang.org/x/text/encoding/charmap" + "github.com/anacrolix/torrent" + "github.com/anacrolix/torrent/storage" "github.com/gorilla/mux" "go.uber.org/zap" + + "github.com/boramalper/magnetico/pkg/persistence" ) +type ApiReadmeHandler struct { + client *torrent.Client + tempdir string +} + +func NewApiReadmeHandler() (*ApiReadmeHandler, error) { + h := new(ApiReadmeHandler) + var err error + + h.tempdir, err = ioutil.TempDir("", "magneticod_") + if err != nil { + return nil, err + } + + config := torrent.NewDefaultClientConfig() + config.ListenPort = 0 + config.DefaultStorage = storage.NewFileByInfoHash(h.tempdir) + + h.client, err = torrent.NewClient(config) + if err != nil { + _ = os.RemoveAll(h.tempdir) + return nil, err + } + + return h, nil +} + +func (h *ApiReadmeHandler) Close() { + h.client.Close() + _ = os.RemoveAll(h.tempdir) +} + +func (h *ApiReadmeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + infohashHex := mux.Vars(r)["infohash"] + + infohash, err := hex.DecodeString(infohashHex) + if err != nil { + respondError(w, http.StatusBadRequest, "couldn't decode infohash: %s", err.Error()) + return + } + + files, err := database.GetFiles(infohash) + if err != nil { + zap.L().Error("GetFiles error", zap.Error(err)) + respondError(w, http.StatusInternalServerError, "Internal Server Error") + } + + ok := false + for _, file := range files { + if strings.HasSuffix(file.Path, ".nfo") { + ok = true + break + } else if strings.Contains(file.Path, "read") { + ok = true + break + } + } + + if !ok { + w.WriteHeader(http.StatusNotFound) + return + } + + zap.L().Warn("README") + + t, err := h.client.AddMagnet("magnet:?xt=urn:btih:" + infohashHex) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + defer t.Drop() + + zap.L().Warn("WAITING FOR INFO") + + select { + case <- t.GotInfo(): + + case <- time.After(30 * time.Second): + respondError(w, http.StatusInternalServerError, "Timeout") + return + } + + zap.L().Warn("GOT INFO!") + + t.CancelPieces(0, t.NumPieces()) + + var file *torrent.File + for _, file = range t.Files() { + filePath := file.Path() + if strings.HasSuffix(filePath, ".nfo") { + break + } else if strings.Contains(filePath, "read") { + break + } + } + + if file == nil { + w.WriteHeader(http.StatusNotFound) + return + } + + // Cancel if the file is larger than 50 KiB + if file.Length() > 50 * 1024 { + w.WriteHeader(http.StatusRequestEntityTooLarge) + return + } + + file.Download() + + reader := file.NewReader() + // BEWARE: + // ioutil.ReadAll(reader) + // returns some adjancent garbage too, for reasons unknown... + content := make([]byte, file.Length()) + _, err = io.ReadFull(reader, content) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + defer reader.Close() + + if strings.HasSuffix(file.Path(), ".nfo") { + content, err = charmap.CodePage437.NewDecoder().Bytes(content) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + } + + // Because .nfo files are right padded with \x00'es. + content = bytes.TrimRight(content, "\x00") + + w.Header().Set("Content-Type", "text/plain;charset=UTF-8") + _, _ = w.Write(content) +} + func apiTorrents(w http.ResponseWriter, r *http.Request) { // @lastOrderedValue AND @lastID are either both supplied or neither of them should be supplied // at all; and if that is NOT the case, then return an error. diff --git a/cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/README.md b/cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/README.md new file mode 100644 index 000000000..990db3dc3 --- /dev/null +++ b/cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/README.md @@ -0,0 +1,7 @@ +# PxPlus_IBM_VGA8 + +**Source:** https://int10h.org/oldschool-pc-fonts/ released under the +[CC BY-SA 4.0 license](http://creativecommons.org/licenses/by-sa/4.0/). + +.woff is generated by [Font Squirrel](https://www.fontsquirrel.com/tools/webfont-generator) from +`PxPlus_IBM_VGA8.ttf`. diff --git a/cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/pxplus_ibm_vga8-webfont.woff b/cmd/magneticow/data/static/fonts/PxPlus_IBM_VGA8/pxplus_ibm_vga8-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..15332256e21db24fabf5ea8a01684c50cf7b89bc GIT binary patch literal 20532 zcmY&+V~}V)wCv!FZQHhO+qP}nw$9kLZQHhO&zZUNy?6iIRQ1kYUEQ^^SCZP5xXFo% z0ssR1HhE?M`2YF^;{PB2_x^vIsHn0G005x%FN^&j0xJ!G#e_vff4T7AnD`f@0AzqP za!PcJzg*RCtn>?gzvSo*BO3#I005xh5C{nX0C)u_5(U7>)fpcE;1BXIiTEGD6M%(H z?agd{Ir3kB{jb(Usfn)C%)sf_3$pdA0smjXn^}99{&GhE0D^-60G;%_AjX;ICI-d; z0ODo88m3>c!rdE-ng5c%+<)Hx#!L(e^k>)H#@YRsd;5)(e{*4epE3$t+Zp}pB%*(F zLjD3i|70H2#=!kIuT=W44*x#@kpk-28rYcpa&5okYyAC=A?EMsc6&P~X8-`1-?{*) z{Bl3+wirTjoiVFnHlLXi0kXG`TcMK125v9py|6r z0}uki+5xz494D#CB?};j=Dw?|s$)@764ne-h8GyB)uCOXAa|}|y+opDMYH5Z(0B%{ zp`@rAN!3-u46n&Y&TRMw;2b&WvkghzW*g6Nola$PxB$>?ae?QP5K37UD7S_~#~6rH zzr_br7>X3^Gd~o|d`$9Nq`_iP5*a5)r=9o5#uo?lPi}PXN2XRl0F_w@U z{H0}DmnLsP`>dFqDBh_6N~v^IZgH$&MtPk{IW=lNQy+M1C2>AN?W$Ll9leZ-c~H(H zOrbA}##1SiWcezWg|S5BrvWOjeyj@0?%gnTgEh@A+1 zoLrPCv_6_B=U!T$Fe!Zsxr8z1d`h1bV#<)!DSeXrq|rZw+K@p?U6OE8eFjpsA#%Bc z%c>5O)eYnOQxbche3WCHgVrfXYwL*Btvx8|llurTZtMUeZv2E|*1g|JH*t{aVT>df zNM{JA$_zM@+z>8Z`jD<>i{L>Fx-iZ)0i@ z_6Z{G&SOaJ*Ad$8+lB9+ z26AIY{D@aR2*l8GjG-}C$T7GDn`1(h10WuMfH2HPEk<5`k$5I30h+kCATI$TlT~;D zGZ$B*(@X}F)I>ss+qu=O(kXHLz&7YK>pxlX=05Jq375}rDA3IL zWG+j9V;(ySI1CxC0L`Y-@A)st(9bWtM=tax=EbKaPKa}YKPQohc;=?76x2Y{^&s(L`Um^o#=M;6e=w81-k)ett^^d~j3OFq^~v5%Og7{3&R@2(Roy<82^Y?5)@Q zZx(;2@8<^q&VA$BM=RQTQ*$Lftz-A3N~7_{r~Jlc-Rha6^!2aHhkoPi34bsczYOz( zzA(cX0%Ac9KAX^-q_6@qJ()i^F=7y0U_XZy3%U$*`WaNjy-oL7lHFzho27cC*Sp>* zc4LKSb@Ob9zr*XzvdVHA<{_TZSK95*j~)81cO}EOUb#;ig!G_y$=%fPX=_Z~eQ!g7 z?k8UEE+{WIvxq<4>fNzT;g0ve_v*0P+C!Budz9LqWxj5&y?+baud6+muYQkOgFlvg zas#ChGSlg?80o$GEq6}^cVB59j}2#@bdUWe3Xi&;9?ltIbdjoWjJKwnb;~{O-_!Z4 z9b;Mw^N+NVqHhi1`&LxZVIrMQJ~sN{_w;r;r_*iV1DBU@xja#;YV64>-Z`X|mCL3` z>0FKL?k6$#Q>1HKHn!8G%vk6`gRxMjn+y>d=^-2pv(v0Y2m|R4HzvI5gPpxoUJ4As z1aY*F=N;nvAsV5FcKdyDbWV>4q~J1aU1LFI=pJbFA(;@p^Z~n9+QTk-fYRq4>Q*hd(lt@XKsn4C*__-AA~2-i-1L)3U#d(YWIb-q z&~m)qt|+yKPnId34<0!+HG!2ZU!Af@Z@A(6s3jhq_tPgZ<3_+gAtx-pF#C_Fxpv$i zuPb|Od%2F=>a2V=EjG#0eC`=!X~W=04AT$eCcJuR0dRrp1^AJ)Q_ji9+u%pe3ex-Q z%mXRF3G;-w{gpcDCo6CptE;OXm}uR+-r2BG0?s}<%!Y5eYt}l4h_9P<8!*6hU`X!k zmCLoY9s~5#F40Ib<~eFq?&n>gx%3)Yf2I>rb5A?gyH?1UeX?@Ge*WCar0?c3ZxT$+ zOqQm#{}AGt;oqfc^@e`VvDLv@HN~?r)Z$i|bUWp5Hmi){S-EJU4NrB_;~yey}rmnXtXK!a5?2h8T$nXS9|wt#lvW}{+`>N z#UGBn)Gzc!I%rg*(W^w~CIcW0+Oql|;VaWdH^J2o>$PtBOpAw+h6u&~CZBSSqF4kQPD2<()LyVzzsX43^s@NO7 ztiIMW?eCT_m>*^%&`R|Tw@L_8U;yLco{GdcKfAV$?d8nu)61B>+vg7KWh^{)gvKal2>^RGBuzdw9N^w(LKo~|@L#7Id$>G)2A=)KpOPTd-HytDV=~$n+C#E&9 zk>gkK|D(UnbytOik^mQ3EHrR-xI=2BO>HnVSq3h^w^uJ+a8MQ`S(v`(%I$-2dd>3p z$dGxOk$K){?y7qMnr^-^ebAEbv~B}Q`#R}uc}1yfCt(NC$u^<6nLfmn~*I7 zbAw@O(X1IGAvP-j+LHhmtf5Ouy$fiy<}3gzq17N33T`{v)GSiTYS;tK?S2`u*+*Nm z4#m6#rRFZOIdS&#EmXUbZKOx^GHRA52m0&LRLFM-;48e>y2U3;$_PfYEW9gilh$UJ z_Dsr|5-4jCoQ56-vqWFN`7AsTY9(|VE6HFc^Nq0siNbc=77xy5y0BRMkj2BF>RmEN zzwaZsiuS?_eSxZ_uXY?{K!~h^4_@wWi<|Xl-dc?CQz`Wy?WL%+FM8;9I}2$+Tg?BY3JAf69l&R)w7dLb_6 z@aFi#A3T!5uQN`*m|Qn6gb&~McltO37$NmRLytdv3Q>=Tmt71~ay9euNkZhI@Tv4X zVhP&$N#TYHVG62qNj?%klSp!1W^!MmhN{vmc6k%cUOzO7U>>S$1de%dT7T6Y4!uuG#HFB+6QA z3H48UeT-x0qdKVjBb`&3Ru3Nr$wKT#m)CV+y)4YG+6<7Ye1UOA;@ky@G8G&2hpuLyz-#^+s$cA@aZU1pv%j!R^RT0t z0qF7JkHxnAAsrSI0nN*%SmEJKspxTJT3nj@}o)#^a@g-NFyu>?4nqF&nlNEfEJ7pXD;=GGtMa7-OKQX z{(|2mj_}`D6v5M8p^z4%f4z-vfS^Z6XWwQSZ4pm9tKQvTQ>;9lNqworJ6aDS@4teR zvw`S8>Z;zcgL9+sp&w<64{>z;f&rM3k#Tz=b`$biwARv|-Vv~sX?{#$hD0k|!}n(W zQ_TV%ezJykNCCzRKxHi1dwy|v`=%fcj9La*!49Dd5jH5M5Ta5@hBhEsE-*aa1GvpSxzZKh9RDB`d=Urf?n zv|<#xB&P~`PbNpyy7v!veET{vvnjzjw?=W%0oR(Va`2b@b9)aPr%w-tzRC!3>gdJr z2PVBiOVM+r8J#(W)Vn}%kGPMEK{{9V<&EqmY@yTpOz~9r!Bq(`2lsg&?%DCO{ec8q zO)l{)tTmT5?}Df>XZ{Ym?=r|~MBHLKr%F8MVY%@FKV}yQfgOPhcIC1${>9FA;XL!< zJmcX!+r*{#!X;m~$z?Xf1H+6$tca#=!QIDtc)sslJv;8a{VAPlp-OG*KP?i4Y@EFy z-6L?Os5!USUOZ2n?r$rRqBUH_0RoArxp}ObVJcF#mWI7Yi6v#=Gu`7M4^DYYDaC^f z1R-+}zui5QuVYh2I2t66yUP26ohR5I!0hLLg7yaj`w<@{@Vtwu@)6Yrq*L zY3^sIt+t!En~ND-e_3bn8^<45*~DQoPw$B4C@@JffEmNV+Dk7a$2&;>*DO265Wswb zD=aDk4NHIK>^_9AO&ujgOO&nu2Zmcn%-FAvQx&-4Q>ZDdtWbdAfD7b^c1a>F0CQ2z z>h2o`i>u)EK#ASu^qVJozgODNF22TML!>ZmJsq8fD)iaw4Fa=fMf31ufvH?6i(ZTj zcIL#Bi|mk7?2wb73`(aXeJ?LF*bjv8hggL<53<_d>VlsNoen!#b;o>Y7EJXY=14f` zNv63k7(c{_BA3furywVA_*bwq=)eOszI9tH#7Vwbap+Q^KVH}l6WrJg7eG)JZ}d$o z45wQRz^snZ>DGQ^wv)GWh~9G-Sf~-iiqu_bj~HP6-pKBBX)bfIxxYTxfjkO;fn5+k z;roO49Q`y@APK?I-KG_1ph$SElJ+n=e&2onWgUGO0hTOyLTh_5f}u5P9ZYTiSkJUR zv%KD6o+fvhs3t;R80$8vFv0 zPn0UaK>g@RZ{{^o)^Q{>EDtGM8!8GM|3VyLBNv^ z&knMJCFD5#Wt9Sd2|L)gOk9cUOu#7zLDxGol`Q%^Z-nj0SK}QjW&w|#t5+O2Qh3yg z(OmH1qq{qkbgEeC+l53{ZJ!tMv%52N>@1LP6^%cj7GG?Ggg3TGo+Oc3*q3Bv+mU>o z1L|~NC}eH~^LSeOCcWxd$>PB#_Uw0w`*|rfJ-Er~*?K-h?g4PH>IkyBQ4KI&(_Vif zP(0BBqcK7x?8JS)$xZiI8Z;@6+257BdoXxYhI2@-oFb-KB9YU* zaNeb|Tg&SaHH&uybL+apH4jzEVx!SW5!hM=*p{a`Zib(JYrH(+J~pj-JJz0|f6Ri| z30*BYBf9TM0opkW`?~#gczbXEIJ24`IrHP=jCat%V89i`#C#xxIQUqU)5ny~8shvQGM4bmLm*3rAtkjtZEK-5~@> zlMoAyuI~kqUu6YYfre--jr5k2A$%d$(rxEDL3~!}bD6jZnES_N9#rm`F+fZ-kumYZ zRf*^$0@7i;RG|stb?P~J8ThC(0%PeifSfhfqyzxkuNxbI62)$7F4E!Q$KHWljfQw4 zhIq!g7)ETb35IOPpPQ2yo(x@7XWqFbzid@f#oma?lGj=tN4{F8So`w}93_|5Pn+;T zl3b@$+Q1AXu*q;y>TnKN?$W!7MTN=W4h;Q?YT*npxes7X$2ElpPE}Ez$c2a;4z7Dv z4Wi_bF&`qn%LS&048kdAC?!an6mUdaG&RnF7%VmWkx047S6DIHV`UjK46nHL@I|wt z_Z-m70KL3GcgK_*okp)tP-9M-4-aZ6YYro|bs7kADE7e)P`FJ@7?vf0@fA>og7K(^?-@I9{i)@V9}4!GRxQ~=ob1871IuZ ztSIY9w4{SsZ`i-@7;sIr6=(2#ISI%Iya9#m>0zBw_vrd&`6wE%UjV=VvXecH`vI1Y zY&^=4&~?!N42-Y!#x=_W2P7!YnuaWMQWK(ofSmKzf%4uUyR#e20mg_-&?e@+$jq9~ zbY@3o_Dt_J2}uHBcP}bqL;qW5MK`h`&NgdG_>p*mFKvClM{k)sH>rPM01P;{&EjN- z7Q@{XfIl5mkUWeR^u@YEn9GP8``FHU#O~|tvqrjTfcV}Lbiv5zHH5CP+7#LrIkOvm zx}QI4-cUDM{Iv=pI2E)9psl>fh(z^||X`sVjOZcFH zde*Wp%~9_?j^^nv`Cu2)s4-H9Uz@H2m1?0DDFpS5eWX~toIs7yDCI~2JUiEkU=xzC z+(iY4Z#pIoTuyK`ZkRLoZ^#W@2ySD1mKwH; zrDXR6=2XR&p?@#I{C9>NOjE2m+Yq!0;dI<(2j_$+{b&^TTwHU)G4e0h3u~55>tkmM z{p!t7r{xV@NX9>GH4|hAR7evK$?vuF795Kr44ZE6{10(|hdVKP#n(F%?ieRVH4&%8 z`Y-@cD}GR`IiWnF%~jmDRb+>^k|xDB-GWl zW&^5|s&N{1sS2otSbH0m!VX9^SFk&W9g z(UQHw_5mymIAr(Zh5%+PU6syzV+8ZsGi3 z(##i!flc@NPaWDE?EWmlXb%LMvh+>pB+{Yu%bGm-mayfAh+Gpc98LY+5?fA;c%;Mf z^HwxPhwc5ncS!`NBFYI8EN349|xdqUIxHrAFeFdi<((GXaLy;19}R->3f zJKz|Q7W-Jv%gC#5(i;FVIGZVdOp)a>V*;7XgMnGT3||Lf)^>IoH%XR-1NbE1=tJ2{ z*mud`CmX-zO-{sFVclrUEKh9Z@WL6|DoTIMn2}0)LQSB%1g+ zTqru8h#z)Rj(b@)onmliUEXJwVzV38QqzbH>47Pr7z`2&AqibgBK8J3FzlYFeLx#j zud1ui$1Ig7A(jCMkhfVl_zs~9tX$3cyQrr$;gvE3fTbWJZ=!iJl6f)~=2yI5DYwg! zq;JQYacWSS%zkQ}szGFyX^aM|kFdShS+q^0GXJ~;JH0pz3gghCj~L~mKTQL1zkoJv zwgjn^EEi5!pnr?tr^dDDTcFEsP=fWZ>)J`?sxxQ|0Ev?o4z8aPi}K-2Rk%`s2*!3wsfP?BHM0s0fV}713KDv4t>l zn5os`+jwUhR5;Hv>YD5%+TbJ&FUgdYrgLYmvM`d-G}3}J=s^x41cx@5RsX0qZq zAeaq(GrnG;>NrlbCDw~U5NhdCiJfWCzJzFBdetSnSXgl)o;(R55FRz$zuhK1> zEO0$KR0QguzkF59ki~3~tnBoukQFzufG3S8?q8lxjSo7q6E|TxDTh5p9@9X~xD{pC zb<-F``*s>Gn}i=lCZM`9baOl@@XWfK7zzacV+N&ak`Y3thVHa7!8&zX-Vx6}%>ERJ zu3Z;~5fGcDQz%5Sthdj}_jEgAR4K zug4UWlTo2v4WlgIi%zNT-kFF$XAF=eI-O8Cdx1js%C*#Q@~GTCqk&OE_ws^{E~$S~ z!LN_(iIfj_L*7qkrW7+UHjD&}&FDW6M7%c^F>xjH*?kk$+KM7q4g+CMeGLjgqAIG199W@x*M;{G%yuuZlQk?Ghk?Ygz9&~2Q2 zTHP{MSN<9eKb|WA<&Enaop19d@d6C67RTPhev^x;*7mV)-5lZ5XKLNBR9y0t1w#XI zES%|EYxT5v;uGJrYD-r>Rj9xx<~PES-|XO~&tZ~ot%;+2Km1;i~O%a4VYHPw>F66SRoo6 zHxJCLA@GQYznt(y05S0dUq$SZzaU-dK2h0km^*8#LUL1EW&nQT&UQH+%~mWW6g|2M zF?XZWU&w1fm;=7>1iQOfQz5h{M{Q0OBk^l3-$U|~G2Rupg+{3Jzkt3Y)-RWYkbg_o z13JAl?X%;_3jjx#qBTtp2Mg`D>ka_IJE+0XpNUv-nKfioP*dC%55df#u(Git-ck$w zteS$&d46}SdWEj##Ba$FA?l&s)zow+?^^S-g4@|_y}jn@Fx2l+^IR&brzf9<_gG(6 z6)asYG=IvfX{@=vN5{WWuyTd%+$2HHBTu5$H+S_xjD)|Uy);q$iN&&NYk4+mx$)U7 z>|P!m!0A1`sn#X-iSNpxx#}w`B!U5s`?KmERT|M|qTfBmm11*lU^qtETv5#TtW;25 zXUIn=gOY!JZC}$EIVJy(Ib%5!;Z`u<2NS#Uc|twL0Yf*GcNT!^9ZSZkI#0=lo|E`1 z-HMF&;q3|vm*^e36W*?<1ZVK2+g+&ufLjhoT_2g=P^uFRnivt9_(rqO_NKER;MjYN zblJi-bRS$85JTFkb&RHHp{Kh!LL|Z=ZJ3lirbH)?&A1!BnFWQ*1GfMAWvV}6@-MnQ zEQD~nf*>Z1MgdBx`WPemBS9hpx>LFRJf9ZR7~y*WLa9`!BAm2Kc_{`Uy$ApqC_$43 z^kyx1{rI1xULXObV=1N?v^(HIo67F4nskEFMPrf}NGq@cRQVB_%kGqq{DwRMX>ifl#4MTWjbpA^T# zg@ll*(6t<#EGWAta+7N>U6`YLQGA0X-7t}q$)LDGf^^VjcUy<5%qiy+6R|p!RRW{4 z7oT!dbdaVBNq=Zf@!A^HTwa%8&8YWSW1-?)hjmV9Y6Ez2F95hly@f%l&RyoC$LYqs z?oihzqEP_5leuT{cmBefu<_VykZy>L9B)@jK317wi;pK^>S&dBmTwTKzpBf=5?En~ z_oQN5pf(>qUM7EVk}xU*R%k9_%;~SI>MERXZn$FSORO3=il~Ag5_zK^&)SrvIDJwT zgrIg&mDgg+nMcW%;ZBnddi_-`uZ7sUMBE5F7C|U16cP~oZ0Q1rJ8j1^x*^cpPmdxA zz8rQhfO*<1JVZ$w`f@F03zwZKgPIbgyZ<}Ek_|$@L-LoBC(efY^i4bG-g+{WHKIE~ zmEkMFl9z*FmuSVL@7U8sP0LX*=g$xC=dsUZe(24!G0Z zFP3WwX8CK7i>DHxzjIDJl#g4b9gN#gD=uCHc93dlDRxf7JUXZD_9>bdcU|QIeExjb z=h5&8YRRi-DaIp4WKRhW@dH_6&C{ieR>d*>0g+0gU(}DpPx7S}#UMzk&c_zw9Wt$l z2t{+TPHG70RZEu?b_;`I0cm(GYEhG%xS=KpW39e?Wd$ryeozTuzc=Hs=Lv@@ft-7y0CY;DZO!VpXv&K4XR%Yy1eAGd)H zghH2Nvq>IRu$99mD#a@fub7$VmNvL4cDfajyBzg4QPVqN>Q$IzD+#i-K!`Yu|M`>i zFjJxCs+#m^eO02VkD;yMktjPk%{(wId|}n5^xdZqzWP<7{aC5;(z2jd>8)2!rBi%3`*QUts91oK|)v?0NSd0Y6Yz|cWq>#mAF)X@+MpvIIXBHdI_YagXPPGxwI?;Id zyEvJ$RkIng98t4KY_nhz1zTHSDZe{B`}r)%7BYEvTT2;1iw-8O)xwE`)JX&Y9K6a%UZs9uvA$Hg?|}Uf=*Y zgi}2TU;-f(Ve!HStWba86N6uEG~l62mDB08yb;V&sUyjS*-dvI41VSAY$R!+xWJ<8 zlmYAHZ2;#jKX=IqxD-7JWSYn_rkMrMorN|5Rjg(+Z@T@y9?NF(2ji-G7Jrjv zo{or$yG5_5xA?kc#UOg3;LtHly_MO4vohiQXMIW zB;O9Gx^yT2*^T3s(D;S%2pwQ~LM&rIBwQ^H@ ziM|P>MkQs_V(Ppx813+K5K5>X+S@B*Eku@@=maLoXvcuKAnax?v_3+z#o|a zo3ts1CFX_~JcRMZJ7Rw1a0ZIWeQXWpf#x4x6wJiREEk%JgdB&pQv zLB&u#q38G{F*`^5`U9WkBOmwP99xwA*RQp^9c;g!c|oVHfL{mtcJSb#qhaFz{EVP} z7e^YK_^g?EiSNSx;8u}6W^LTlsT@WIA3|Czn*57t0;zK+n#2I`9SQ$>NFd-FwAjX} z$!?;mp%o)IvXgFtAWMDtR{z)~@j8~kJ&2|E@wKPYM&a^&rqk@E1QS!3lq7VA%V}!g z<#dU3xP#AolSyi}ES&msBsMNIjR-6|c}&f#)0+8bYpf0Yh=XWCxPZT>ZNjYsda4Z& zYpxSm10}x*j!k|8a2qHW=Ew$H$UZ;p^pB66`&H8X7MmN*f|){*P78?2?9Q#d2I*cK z`;?ffl1s`uEe@v@{Dh*g3p*XW%4+BmVb1MYCBN&GWCCkwcpRe{#n$Ve(uhwn;X+`~ z^2$K>i}IY*lVBqMN5~TRRNHpfzUxr4&dgek|J&#i z)%LNj1>pUyMPdujJd@!i5ha(kazPFKunR+VVtgxCMP3J$)RQAEH^G+b5q%{)&q535 z>ohEGZB;hUY^oC*oKw~nbGt)Gf1NhkW`Gs>&QlS6O@v6!wH57xZp88kr8px50~WUy z-H}~I46w2qT!-LWDebV9sEeyY`A#j|0(z2{gw;TgL!rRr@KG_!KfYi0P?fM?_ zZa}76Ki({oHb;c<-&6&blnOQOzYfwpP$^I&!g%PxO9!h|9Lbz7_>iU59ew2uLh@E+ z%EHQ?l*nu)U1UxHuGA{Bxzu`l3<4rYsYFm@AQ}k)s!~Sn@Er&Am}nrTr@<O$B+U?C~We=-?Ymd^tRa@{LRVGZyQx8*QiLNK+0q&XUjm#4jK~N5m}N4&aH`W zmZgbr2F;Ogs>tb+3*^lUD71-uRNI2Ia1fmLIu`CcLjntgu!!YA51m$)QIrEc$M_y& z(3r-~;bM)%1Oz=BToU8*05x97^##5CZ^Vo`@t`_H+G%j@yAG)q5uv5boeS+pPA6XH zH$fJs1y?VrjGoGx5@+_nWQwlMHT)IQRA+bWDWci2bY`b^)t46!k2o26Oq)c<8#=my z8-@2hctvjB=nGN|e|Co-OQK`^VV3(mGC0O|BtX_PJH~Xq(bo^hJ6q&BmMYJxm&TQ1TWJ)zc-H=~J=CQ;h2OF=rrmG0rB8I8dURJGcl~3Rm1+ zZ6>t$DPi06lOFP!XJ4WQf-$gA)Z>io2_te(#3?l6!V6N!wML!xIjJ^eHh0qPB|}h0 z>L0%p8o*PxL^U;kL?1m{R&>{CrdL;IzWiwW_`bCLc@q=oG4DT^L@7{H7Okd*o;hhI zC+Y|tRki?GB2Y1{@o;XWZ_dA13c(wn+z4j;B&^n{+kL6fV4SHk?37oCR9B2Dq=7{U znxI&5Y->@|Nx^DR@g0o_3#dTBNybTl8{1n1Q`4Z?(O}`T0l;hrtfo$-Af3>;5*q+* z$4EwI021sHXb89Uns8inNU#2|5u`p{!JkjXAE~o*kvO#5Ah<3;hMQyq&c>@dg)}x+ z+OD>!-j=s!Aa0|D^iHiu+}F^p)zaZMAd5b5G;4dtP21sT>iW*Wep3!M3x>D~a#Iqi z9L;i>uJw-LIiAl4BXeaV6yrZq`vvoH zo&3!snFqs43%lJqxl#kut&HEchIN8eef${mSABRUz>BY|3?5iTW7N|_S08B)9TtzL zLGsd|xM0jp-!*>yDl!Gd9fCZt<>52Bkp7#zjf`MN&Le6D7Mq}*0&lV*o#2RTn6o`q zRZ3ron3ai=TmHDsMrLZ$_y-}ki z4E@=rQX06s#+eYAyGXD^ZYmT(PvgZhy;kpL3&)|x7>o5xZ`3nydE(uxWJdWUKHZK@ z_Vgvs`ua?(BuvPGE~J&=ZEAM&9|3Fe1;HvJngbmVg~dI}plg|X+so*f@8_W_HhlY^ zZ(K0-Rh5iDR>!NghHSo^!V~4vkdgtIZ&9PA+XNgI_z^(wO?X@>GnnT?`@XAtS~&en zB-$CSp3p8rL~b^#zp5b#!-~7zv{H`uN<8uxVh}NV*;&f(g?$Fs9>@y_d=Kk2wCiN4 zgf^titl9-2sX?n5@wQtkS0ABWN1_|m{2S?mu)#!7v+n$@SATG%rdSkIwG%H(s0GMB zuTA{irrb7sOfbBt{uWeXb#5HF)D2SY3&K4RUI7*kx>EfcIoqu3!IAf=>~Y&=^>L;~ zPfRAJyE+yJ7NO2#X>N5`74DTS=5Voxx{&;5h+R9PQqD_8EK;pGDym|&T>CDgsZMY4fH|SBDIQ7n&m6&mcUE^44h&h?wh2x_*bR0wt*z($V&M+RpjfUaoUV-Vo$?Yp zpB7c;i4w6*F%+?+uS{1AklKEPRQ6`W+r2`N=&x-?lxpXdMnjx z^ZRaMp>`1S%3A#g;}89&FDS}(DMXJaWGy#o%M%MxklaO_ zfHj_@<8aDdn8JPhI1_J({UlSk|Evj_Ya}-k*@_Wqu!mV=_i5YH%9pLBL-in%9`&RbjZs-Ti{#| zzhkfA*LCDu++4&6${T3cMsON`yTn{Ohhd24&~SV%0l;M-Q(9@X>{G+nxyd~`E>GWs zGn6*;7jRmd9IVOub_qJC$#|&_wT$4(fpcIIhF5`&bkUOa^XT#{=%lkUX4E z$$0-TmEzoiB(4?X#R)zLND+6FTTW;i`n_sq=pK!zGEtyIq$&_hO*0b(lq+_jR z*V(f)*14%ooB%$)`cmfZ%Zc*EUat#|C0*yUSa@vmDR#%5<)!1~a2R;J{TMWc{`r@E zd2!fSj*wPP?dWoX^&Y=cK6nB=w6#s)X?XBB9Jv@CySPd)Gq{s8J@8AGXY<$>y(~$> zz-B<&{w=>cffI3^r1q<72s(T{|1@^H?@QQDlEdf94C*qgv@l$tDvy`ww!L9xQKHmI zFfeygD6^Am%Unq~SaOQco8RJ4+v)maFBcytC-k8k4jrZS@X~t^zKPyg?`myx$4;DUMK-$SX4K zxyEsb*=n*Dk(9cN^u+UmuR*n$!lv8GHjG>smoO(wfl4SwR@6KR@l)K697 zEAHOf83u6jH2lt7r=5f12&F#@KqTfXFhr>^D5#Kgct1%l@if_*nvdhd7tItKFn>fJFBMJoz8L>ZlpD4xM>t?! zqJ>FWg0isHqOfk78M*KG@v^;J>Ux7r&ur;VSm3`>z_!^8_GqaOGvBr9h+Bm)ye%e0 zd>Mud%DXGmMczDCh_f9jvS1UN*0c@B;@Hm0Q-^>a|KS&xzciGEIL3% zkZF8MmMyzcv4YgU8~v7Q*M?eV?&!B!lim!dHSW{$t0SteS8kUK`J=K&!>+YBRkqty zvzlK<9t@Px$%RAhD71&k)LEG8Ua3VncOfVWvaN}^&F73Yv1;=}4ROqIP_#m{Asu-@ zeGHo}wr&tvR}dGFwauTLyCFD^p%^^>1b?GTKK)xwg6DP*=ht zTPgdqspk`ym0Efd)*7U=P+X=Ohvr$_(R2{gISd;zjC4K#o{Yg z?o$E`gw^uB3zLP~R=(v!@h75`)EQ>C(BUDl_2?+j@;=6KSW080o6?W^xKXq(99rI} z31p1b!v=|+?5oJWn0@SA;E<+aFz~6OkDXR)x>7;aYyZ`CL>_EAyl_pQy8h3tCcc;g}cRyLT;Wt)s=+ zHkZz^7XgH$uRE+I&+7u$ZVZ7y0`pkj?#}(jFl$zt0Q5Y z%Q~LOUOBt#1UTwhm?5Ji96hPsqJ{sOfS_zSr3X@V>z}J_K%rL79zF%DJYgsRwY#3% zJSG_CF$kD)Jz{h`W_bTQ8LU)2cW`>zC53No>)=&id}?IOrO5YDeDTY>4X>0h-58W| zdy;wMeat{cjy9fd!%ehh6uUzFy+po?Aj(=_nz6or$rz4RLQv*>Tbo~{0=5sli0d|d zxpj;^lkwI#A#Yur#3pl%b*eBtwh}KYK|&cxL?|KAB@}X#Wo}Cnvdiraa3SI}2!DzK z$I`|c0_Dkxch%VN$m#OQ>F3ooJiQno1}mXLs@WsbtbI9TyevD)K2!XThsm*4&N3fD z$ettBQrTmPqa&<|Zt8@OPpQ>5`%2Xb?lHQn5*9d|F>hCnw1S0wcd zvC_}}ebP}FIv3IQCLuATDfTZ`)r^czt!y!2nqjyyE{zb4X5(84PRs&@ZOHgt`>wgC z$tsynxu+~z0P)sr*FhqMiF-rLG(oYMt`rUZ3Xwj(s7ZT|Qwvh(s6~U#6vFqr$+fe^QCgiBm@6VyFg7wc3`VRP{<*S8N?JGS30j^6{s=q?Yp zuS>4WmtuV3Ae`F`F#PAek{!kmAd#Zt^8OsdSe9~yV>N^V>}?-ryuIHY> zo>LQ7A>?b<#SEVJW))%fvMihSuI>VIJrIuR@-XrSxGFN##f zgRkUUAa3dw?V=%Zxx)Uxp|(1Xi3S^K2Z1c`d#5YV1O}umOFKol>}uA>ZDgYMH7~{P z{`o|JQo~8bV-p&$4#^X_WdmhKt^M6MjGJYlA`R?eh+0Ycnn*!a++A!r1NM=QE_g?q zQ0-TnT1)lhSJSiYBlyWCd&ne$R*jj%Q{QPT&X#u#4}$oPc;ozVZxPDKXVgY}qX2M% z46oxVln2PU7$!TT8^O5CaEDV6r(21rPmSkP3~IdfkLP<#Y$@cC3`5Vts)@IhTuRoB zssE#-$af{@r42G*~ax2X$?#YOem;HEW--@7Pv~c!#-x00&k9=`jG?f{?-(f6=AB%>JO4G zbY?D+qSLFx6*FneYDF(cl`8^&LBGd3IeWu`?q~AZ)=*YW8_VzbzADyhjzsT~N=lMq z#XCxn>-}M$c{rzYSO=WfeC614xEtA`Yu^YLinTMaEIo!94{*OY$mGbj$TJ-0AuY^L zQO7FVsFQTsq4}k8(X9lMUc^%|OQ@fZyzh0!rDt5WwdMSbziZZIk7l%cW~fZ>z!shN z&ZqyiE^^~;awoGBteqmDvaZy_)pW_#~Dyjcf|jJUS=TiJ!nZw{x_ZyT@x}; z4Sep=MNiMd*?x$;#(UqpraA1DbC@q5Qn*k1`!a zc*^Gb=A64|BV3Jh+u2AC%M#qVBH`r5bI+%Xpo(cAR6-v<`v&snDwmHcI48*fBF!s- zZl^EZH*U#2b4dEe-@PZYL3Ni(`}$6N?I=F(-y+zovamo0NA>M40MtLVRQ zXu3Eh?v9_|&)p@g^+wzuDj;%?m}U;=@CNF}#hlE;JJ^L}eO4lVMI&)iKc66j=Q=kw ztF`Oa+*T5J{^mXBDzlsLTt}A;3kje4gpYSa;yfa!p;Rp;G%eD8qyg?H zNMY_fEsg+o-Id#lt0F=O9RBJ5w{o`kPTBF#{)pvl?V+U`ynN;0Li@@wCi6ag#>h45 z4nv*Zc^*;-EjJqUoEBLovRXM~f-=smlBwQq^Igt3zQA2>A`@g)@$5f2%bKhGp+ zo!hF6QRWg1FRDctc>NJxX?Um*BjIFCF_N2-#&}awJ{vywYjr2hS=MFnl`W(eoZ1ED z?kG3Q?j6X;Gn#O1MqO}B40ub+x)zWhqsXP?xOKDa~No()XUH%q-z~3Pni&-g#2z zvYN8$JiA}nJWGw9ROVSG>`O{kd$x6!)p???^2^p&VVzF%oUN;c3}bfZ=-L=2;!^e2 zw4}en=Q`kd3N75IQqVxb=c?qKEsh6e0+r@Gl{ufda}IWVY;R}YRr0vK*;nTuI=)(m z^xKb$1Y(xJfF#f(35-|*rIM5Bwlg7sk!o<9zp}`3j#x-_yH!%%u1qhfPOqF&z$sP- zY-IpVb}gy4^0CzI-EE`?=>(aa?`2ATXK{OlMRnA%U<%g19r3J>EZvaOtD<|`A_G^h z?C>k6R!u6wV3lUo7QMS{t3kDILhe97Y~k;iZBHsuPy-`tdY>>Rqy-6xt%D+0kN7Z( z+Azzuec~hPL%g^3DA@L52%@kJg|GE)3k!D}-LXc8`7wq)%BJTj>*BnQ6IZ76*x^X$ z`x(8Gdef6j&T2~cNBl|Zd&pdv=j#{WzOuLsT%##k2zO?AG6^Ne6mElk5hcdm_Nl13 zk2LCCu8;fb>2Y^z1sEu$SjyAAT&`bec604g?V$IDViYWQeIyiOI@kK_Fkaw&AF)Qk z>_(=CE(*o*x6x2Cn>si4T*Z}+C+6qZ?ycR+PWhr%_x^w*yy>_l49*QNb7c++wK4Zk^+i0mWsmH(L`JLV%Jwm4`1aEmm9_tWC(S!`tte#7pZq@yLlh};BGa?yLR4tU%-cn2i~6VQO{9ksVemx{OtaU4&rtZ z&Y%Hu7Yzt1VqC}~MnW2~Lw5^9bg01<28taR$jP>Wb%bR8# zg0xTmI(!Wby}rli1IqT|Ca9Z6cp-c~2|Mk+-m&I`A@<+RE9Tof-i*&a%TvplRTmZB zwCBp-z2l8f0dwMpLv^4$r$1*CCcZo?ie=Z?Vp>{rju+3 zc()Qt7pwG8z+F(Dgp8tbZ(6!7SJHXNH=baWrTkku3K_&h`O0hHSJ%Scy^4w@z(dfH zvui2sl*O=(UIVv+1wswgCeCx#^V?S2Ui;oAv)eY7lFFrFDmk1ja4&v)$jmtCxqh3V z^kH*N<0xvaEVESehc5(nt~8LheMaQb{Hbf8jJ9%Tlgu0S|MwY*?{*m8U7oek`%+W# zT?&@zov!+j_G9k=-Q>L-lRIPlk`WTBefD*mEg!u%&6HdSn{ZDKcs@wK$d_T^-KbqV z*eZpT%NgaFLwAjY8*^d)i`hP+D`AP`278~+xCr8YGUS0RVQo=0MaN_6r>8Hf%*WfO zN4UeDN}=J?h?=Ewl6(ov_T&Tn{>cKq|3Sn|pxByQe_3?LOq_hmWuxbOkpNOZ6=x@~ zMo*sNU5VI`g!e(Q**Uit39$XM9LiK-E(S^OMs<26^oThnHV0U?0^Ib(Lx~xZnfWJ% z?l2>rjSMveGH2U5(T3K$NEZ1UwM~8jwiOX zYEqvOB`Ohh>hFhq$KlV)?n`yenTeFEt-w%>&pFxvAshkRuVj)bS+(9SKdrOEzNYn=AGWLM02BFCnGgQIJZv9 zb4#Sflya;sTZT(_OK^K>N|Q<_Q~Nf6m}#>y&nPOlygMVE%ekG8%tYt% z3jHs=u<`!_H%NR10C?JCU}Rum0OGdWT6OXKHeVU!IT%3TlDoDjh`v?!!IXjF9|H>m z8;HxnzyzWI4LAt00C?JCU}RumWB7XmM1lYd0|O%i3SeXd05~cE?|9m!Qo#|!FbI>9 zUKZ*KU7`DEv<%cCLhAa?mw;eR5)CQu_NAm}G}L&!yFn=qGfh448M8pB}gn+3L9wyW$s>`vL|IWRc{IV^Bwa*T3(;uPex%UQ{JiVL4hnJa^9lj|cl zC$}~3T<&@9*F0Q2&Ur?7e(-AYX7irsBj?lO%j4VQC*jxO_sHMEe}Vs}fTlo(z_P$M zL3u$hf&+qEfDLqtTxw1^ux;FE|C5q~13B8?)WBAX)D zM81nMh$@NN67?bKL$p)$jOZCLMlnlbj>Hdfy^}@HD`67ylAw^S7b~61`;Szr7YEX+1!;>XXI{b3aXddSyQXG1i3?= zoT2{CzwSMkmUM8)t7w(SqMHZ0=&;t(U9AzDIAvu8HPQAM_xDhg?lEi&tNu}G;WBiX zC7;8Z+(>OpoeSpGSflpo$tGH??P(TqOQu2B>R#?2tn-TS0C?JM(N}DZVHm*i|D)sR zQlop&mZJN-XScP^X?yIwx6(Jwqg15$guAX9zA3d&LMYT-$Mh8#kJs$DKF% z^2__>%lm)cd~~3F{aMRe{XS36>BE6^nF~FbS6kiIgbmB+=4Yx=2^)CNUB# zaS|^Hk|;@%EGd#I-KB@5NjgCU6GA8!Iub@W5kwM2C!*<07rN4o7-ESdo&*v}BAFCY z=}r&QNGF4y^dghq^r0_VWRpWKdE`@o6@v{s4xG4f z%n*h$jNy!6B%>J37{)S=@l0SMlbFmDrZSD`%wQ(7n9Ur@B}000lnrd;2K)HPCU&u% z103g=^kN(DSPVkGL{N@O!c)&eQGnaYnrh-RQa-WAh<1tTo z$|tIL$#Y(ChH8GWhc~?9H8p(U8(W!AEelvk9rYZdfkiaZL^CZcW(iCA%rchK$_iGo zlB*nM4XfM!=Q_Ufook%s9M^fvJLxM~k}WxsD|wPH1!5H=HnEFCoSf$Zm$||nE^>*x zZ04l6xXCSXi-#RjC`D2nT3y%LSYs?L^|e;3wN(ALx2bm3p*mHU>Q+5!q3TtAYKdB= z`U4uPs$HX9qg|t2qg|t2qg|t2qg|t2qg|t2qxUn~H`;frUY*0M-}!V7pU&ZHKi}3i zxN20JYF8bqQ+26s)uaA9&l}L_xyFQ7)mFDORaTTY*92bK`~jW*;IfvchW3rq-+nK@ zFEB@&w!f0r-rxWL0C?Kl!T7&*17k0P_XduDh>eVleUTg8*t8=QHwZ*}Zx9IrG8!Uf zH?V2PL@;b%RB+wEtnIRaNx^j!qX3gOn8OU@FmXdTj2l>>N>~+KcQLTk|7T#*-pK4$ Y1{7ffs$=DbaU(Z~XafK`X(Q$U08SQm`v3p{ literal 0 HcmV?d00001 diff --git a/cmd/magneticow/data/static/scripts/common.js b/cmd/magneticow/data/static/scripts/common.js index 7c7a0bf15..a0625b43b 100644 --- a/cmd/magneticow/data/static/scripts/common.js +++ b/cmd/magneticow/data/static/scripts/common.js @@ -32,6 +32,22 @@ function humaniseDate(unixTime) { }); } +// a fetch() that errs on anything but HTTP 2XX +// Source: https://github.com/github/fetch/issues/155#issuecomment-108288863 +function myFetch(url, options) { + if (options == null) options = {} + if (options.credentials == null) options.credentials = 'same-origin' + return fetch(url, options).then(function(response) { + if (response.status >= 200 && response.status < 300) { + return Promise.resolve(response) + } else { + var error = new Error(response.statusText || response.status) + error.response = response + return Promise.reject(error) + } + }) +} + /** * Returns the ISO 8601 week number for this date. * diff --git a/cmd/magneticow/data/static/scripts/torrent.js b/cmd/magneticow/data/static/scripts/torrent.js index 4be0c8d5c..23a253935 100644 --- a/cmd/magneticow/data/static/scripts/torrent.js +++ b/cmd/magneticow/data/static/scripts/torrent.js @@ -8,7 +8,7 @@ "use strict"; -window.onload = function() { +window.onload = function () { let infoHash = window.location.pathname.split("/")[2]; fetch("/api/v0.1/torrents/" + infoHash).then(x => x.json()).then(x => { @@ -16,7 +16,7 @@ window.onload = function() { const template = document.getElementById("main-template").innerHTML; document.querySelector("main").innerHTML = Mustache.render(template, { - name: x.name, + name: x.name, infoHash: x.infoHash, sizeHumanised: fileSize(x.size), discoveredOnHumanised: humaniseDate(x.discoveredOn), @@ -35,11 +35,24 @@ window.onload = function() { tree.add({ id: pathElems.slice(0, i + 1).join("/"), parent: i >= 1 ? pathElems.slice(0, i).join("/") : undefined, - label: pathElems[i] + ( i === pathElems.length - 1 ? " " + fileSize(e.size) + "" : ""), + label: pathElems[i] + (i === pathElems.length - 1 ? " " + fileSize(e.size) + "" : ""), opened: true, }); } } }); + + myFetch("/api/v0.1/torrents/" + infoHash + "/readme") + .then(response => { + return response.text(); + }) + .then(x => { + const readme = document.getElementById("readme"); + readme.innerText = x; + }) + .catch(err => { + const readme = document.getElementById("readme"); + readme.innerText = err; + }); }); }; diff --git a/cmd/magneticow/data/static/styles/torrent.css b/cmd/magneticow/data/static/styles/torrent.css index 610ac6cfe..563b23d7b 100644 --- a/cmd/magneticow/data/static/styles/torrent.css +++ b/cmd/magneticow/data/static/styles/torrent.css @@ -77,4 +77,19 @@ th { tt { font-style: italic; font-size: smaller; -} \ No newline at end of file +} + +@font-face { + font-family: 'PxPlus-IBM-VGA8'; + src: URL('/static/fonts/PxPlus_IBM_VGA8/pxplus_ibm_vga8-webfont.woff') format('woff'); +} + +#readme { + padding: 1em; + display: inline-block; + background-color: black; + color: white; + font-family: 'PxPlus-IBM-VGA8', monospace; + line-height: 1em; + letter-spacing: -0.5px; +} diff --git a/cmd/magneticow/data/templates/torrent.html b/cmd/magneticow/data/templates/torrent.html index 102a2ee0b..444aa2074 100644 --- a/cmd/magneticow/data/templates/torrent.html +++ b/cmd/magneticow/data/templates/torrent.html @@ -13,8 +13,6 @@ - - @@ -56,5 +57,8 @@

Better Files

+ + + \ No newline at end of file diff --git a/cmd/magneticow/main.go b/cmd/magneticow/main.go index fd05785cd..a539c029f 100644 --- a/cmd/magneticow/main.go +++ b/cmd/magneticow/main.go @@ -102,6 +102,12 @@ func main() { } }() + apiReadmeHandler, err := NewApiReadmeHandler() + if err != nil { + zap.L().Fatal("Could not initialise readme handler", zap.Error(err)) + } + defer apiReadmeHandler.Close() + router := mux.NewRouter() router.HandleFunc("/", BasicAuth(rootHandler, "magneticow")) @@ -114,6 +120,8 @@ func main() { BasicAuth(apiTorrent, "magneticow")) router.HandleFunc("/api/v0.1/torrents/{infohash:[a-f0-9]{40}}/filelist", BasicAuth(apiFilelist, "magneticow")) + router.Handle("/api/v0.1/torrents/{infohash:[a-f0-9]{40}}/readme", + apiReadmeHandler) router.HandleFunc("/feed", BasicAuth(feedHandler, "magneticow")) @@ -171,7 +179,6 @@ func main() { templates["feed"] = template.Must(template.New("feed").Funcs(templateFunctions).Parse(string(mustAsset("templates/feed.xml")))) templates["homepage"] = template.Must(template.New("homepage").Funcs(templateFunctions).Parse(string(mustAsset("templates/homepage.html")))) - var err error database, err = persistence.MakeDatabase(opts.Database, logger) if err != nil { zap.L().Fatal("could not access to database", zap.Error(err)) @@ -190,7 +197,7 @@ func main() { // TODO: I think there is a standard lib. function for this func respondError(w http.ResponseWriter, statusCode int, format string, a ...interface{}) { w.WriteHeader(statusCode) - w.Write([]byte(fmt.Sprintf(format, a...))) + _, _ = w.Write([]byte(fmt.Sprintf(format, a...))) } func mustAsset(name string) []byte { diff --git a/go.mod b/go.mod index f38420811..adca2b74a 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( go.uber.org/zap v1.10.0 golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f golang.org/x/sys v0.0.0-20190516110030-61b9204099cb + golang.org/x/text v0.3.0 ) go 1.13