From 25aac19cfb7a96a640285b8650d261735981e972 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 20:33:42 -0600 Subject: [PATCH 01/81] Replaced procfile with heroku.yml, added heroku-only Dockerfile and updated app.json --- Dockerfile.heroku | 1 + Procfile | 1 - app.json | 1 + heroku.yml | 3 +++ 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.heroku delete mode 100644 Procfile create mode 100644 heroku.yml diff --git a/Dockerfile.heroku b/Dockerfile.heroku new file mode 100644 index 0000000..c09b831 --- /dev/null +++ b/Dockerfile.heroku @@ -0,0 +1 @@ +FROM tzahi12345/youtubedl-material:nightly \ No newline at end of file diff --git a/Procfile b/Procfile deleted file mode 100644 index dc14c0b..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: npm start --prefix backend \ No newline at end of file diff --git a/app.json b/app.json index 74ee445..30a7d86 100644 --- a/app.json +++ b/app.json @@ -2,6 +2,7 @@ "name": "YoutubeDL-Material", "description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.", "repository": "https://github.com/Tzahi12345/YoutubeDL-Material", + "stack": "container", "logo": "https://i.imgur.com/GPzvPiU.png", "keywords": ["youtube-dl", "youtubedl-material", "nodejs"] } \ No newline at end of file diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000..52c590e --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + web: Dockerfile.heroku \ No newline at end of file From 08027a5c0b9c91351ddda4dd26ae8795695bdfac Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 20:49:38 -0600 Subject: [PATCH 02/81] Added run statement to heroku.yml --- heroku.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/heroku.yml b/heroku.yml index 52c590e..e72d2b2 100644 --- a/heroku.yml +++ b/heroku.yml @@ -1,3 +1,5 @@ build: docker: - web: Dockerfile.heroku \ No newline at end of file + web: Dockerfile.heroku + run: + web: npm start \ No newline at end of file From 32b68033e89885df762641fc1c1a9f7af6e0efc9 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 21:01:01 -0600 Subject: [PATCH 03/81] Removed stack field from app.json --- app.json | 1 - 1 file changed, 1 deletion(-) diff --git a/app.json b/app.json index 30a7d86..74ee445 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,6 @@ "name": "YoutubeDL-Material", "description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.", "repository": "https://github.com/Tzahi12345/YoutubeDL-Material", - "stack": "container", "logo": "https://i.imgur.com/GPzvPiU.png", "keywords": ["youtube-dl", "youtubedl-material", "nodejs"] } \ No newline at end of file From d90b2d3687a930102f1a6dce7f38c574278adac0 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 21:01:53 -0600 Subject: [PATCH 04/81] Added back stack field in app.json --- app.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app.json b/app.json index 74ee445..30a7d86 100644 --- a/app.json +++ b/app.json @@ -2,6 +2,7 @@ "name": "YoutubeDL-Material", "description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.", "repository": "https://github.com/Tzahi12345/YoutubeDL-Material", + "stack": "container", "logo": "https://i.imgur.com/GPzvPiU.png", "keywords": ["youtube-dl", "youtubedl-material", "nodejs"] } \ No newline at end of file From 02e683add9159fd5167a892101b2025d9225ee5d Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 21 Sep 2021 22:35:49 -0600 Subject: [PATCH 05/81] Cleaned up unused files --- armhf.Dockerfile | 49 ------------------------ chrome-extension.pem | 28 -------------- youtubedl-material-chrome-extension.crx | Bin 9092 -> 0 bytes 3 files changed, 77 deletions(-) delete mode 100644 armhf.Dockerfile delete mode 100644 chrome-extension.pem delete mode 100644 youtubedl-material-chrome-extension.crx diff --git a/armhf.Dockerfile b/armhf.Dockerfile deleted file mode 100644 index 7f192be..0000000 --- a/armhf.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM alpine:3.12 as frontend - -RUN apk add --no-cache \ - npm \ - curl - -RUN npm install -g @angular/cli - -WORKDIR /build - -RUN curl -L https://github.com/balena-io/qemu/releases/download/v3.0.0%2Bresin/qemu-3.0.0+resin-arm.tar.gz | tar zxvf - -C . && mv qemu-3.0.0+resin-arm/qemu-arm-static . - -COPY [ "package.json", "package-lock.json", "/build/" ] -RUN npm install - -COPY [ "angular.json", "tsconfig.json", "/build/" ] -COPY [ "src/", "/build/src/" ] -RUN ng build --prod - -#--------------# - -FROM arm32v7/alpine:3.12 - -COPY --from=frontend /build/qemu-arm-static /usr/bin - -ENV UID=1000 \ - GID=1000 \ - USER=youtube - -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ - ffmpeg \ - npm \ - python2 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley - -WORKDIR /app -COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install && chown -R $UID:$GID ./ - -COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] -COPY --chown=$UID:$GID [ "/backend/", "/app/" ] - -EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "node", "app.js" ] diff --git a/chrome-extension.pem b/chrome-extension.pem deleted file mode 100644 index 19f4917..0000000 --- a/chrome-extension.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMX9Wk5SM5cIfY -6ReKX3ybY1rsbNbOzG8ceN7yyeXB0mor8pVsX1MOna2HewOyBuaaYNJRO4tJBxic -7a8zQErfgHL/i/QrVvVCpfJ7xKvq6zij5NYoqd/FBUwawqjeH5/voIcAp9z5Vmsr -kL0sxJUKy6b4IWNp3noU7Nvq2RwxnXQbKDhz8FrX6oQAnDC6gsG5a2OSPsaE4oqw -6nmonORJypmpP5hqyHY8ffXBT2lAxjHT7OnYbaCBe2TQP8+rH6rDBOhjVNtUJ089 -ocTQL6LtQEPkcF4yKJmtcOwHl8OPGZs5l9i8xb4j9RuSPkm2lbzZX8sOsdGGoqJZ -q68nYhsHAgMBAAECggEAXmtKEzfPObq88B/kAcgSk+FngMHZzcmR7bgD3GwdSxnQ -dkRI9zvk7eQ35tcUwntAr4Lat6/ILjFqlBmVLxrdXHuF5Xz9jcZLYgKzz61xdYM9 -dC6FKF0u5eGIIvbauGAo7jaeGFX1F3Zu5b4lP9kEOGwU1B7sxF0FzsQM5+dtCJgv -We/hWQeF+9gtoVnkCSS/Mq2p0UomXXHW0Bz4+HuHlTR9aiYbviYnotABiLUhZyzt -v5yUaktb9qniBfdLpRlq8cp06xYlTEA9gJpa4Pnok8OWUsbAiW6EiXUSaZ/cchVa -AnO8WWYvVOnnt6WHI3+QdFTnqVjE5TBX4N/7bVhHGQKBgQD0dtbFqp7vZK/jVYvE -z0WPdySOg2ZDmoSfk5ZlR1+Y9zWToHv0qu8zqoOjL8Ubxrh9fGlOow+cCVdkEuaa -jWC2AWetuRvW0Z5A3XMXr0/N/1fgOkTqtp3WNrUPjVJahEg3lN+90opgFoT8swSi -s1oxW0oLcVIlrjhGBXAPCfsAuQKBgQDWBLRhHsRAvGcK5wGuVnxVApTIyBOermsW -3bJt+7+UI+4sYrBAwkWdQG93IG0cQtn48TEPBgmR2fjRF5IFT9M4/u+QOeeByT7I -we7nVtHgSY5ByC9N0mjWbcmSg8fktz/LonjldNC4kWdOFb75fxGf8kOGS5rUaMA4 -zHucfB6ZvwKBgQCPHJrysMXGY21MaqIeHzEboaX3ABl37hdBzAa5V6UxSVdGCydF -vmO2HVZey/JaJmWOoKyNaowSzq0oWqBBTg6VvhDR9JHFmoVId9uOvAS+FYN+Mt5x -gWK5KuGoLxVNBC+6yh6JY526TrSfsrU+Aj0Es+qO9FIg2PL8muZVB4S3kQKBgH/5 -CDMaxpc/EQ5/2413wZjDllwI51J3USm3Hz6Mzp2ybnSz/lh60k2Zfg1polTH1Lb6 -4i7tmUNRZ2sAARyUAuWN64n+VeRRhe1dqZFDZPQMh7fmEAMk0fOGaoXlrt2ghdEq -Mchi9Xun1nHmpu9hgBR4NNBU3RwuFuLfwvprbZDZAoGAWa62QJChE86xQGP1MrL2 -SbIzw3cfeP5xdQ3MKldJiy5IkbMR7Z13WZ7FwvPTy0g/onLHD1rqlm1kUMsGRHpD -5vH06PNpKXQ6x8BYaRGtE6P39jLycO/X+WK/lYTrWo1bR+mGCebDh4B5XrwT3gI6 -x4Gvz134pZCTyQCf5JCwbQs= ------END PRIVATE KEY----- diff --git a/youtubedl-material-chrome-extension.crx b/youtubedl-material-chrome-extension.crx deleted file mode 100644 index d2a9e1d727a976cebb8d6d0a22b95563abf0eddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9092 zcma)?Wl$a6wyqcMPVnHa3wH?+Jh;0pTo&%`?hxEPxVyU~KyXWNch}3Vb55PTzq+^T zj;{HmyXxt#9%FX*JKxb_j%*xI007`CBmjW<0~)ae5*P?U4n%=PpbwP_y+?t7fPeu& z1wx>@Io{*LcaHw@~xqQzHUgOx|eJcT<8wB?&aFmeR_ zWg8^9=Xqg((zQo*YliqP#=#WCiIN906Uz-x?32}_Wg^yWXF^&Yrwi@HqhLT5usyJ^ z&DtbUXgGK)vi8WMENe%4JiT1_yVa)grVl5Jjqm+3FzpOqvP1JDO1 zs;jCr3WE8AzgP-RMZ|W%`fRl6Rp1l2w1GJMOy0Dm&Y^CKTf#&k>E@KqWrGRSx|z^| z08@NGJ#Z1g1YEdpa*xC4;PA^T9W+ zH%+a(A6WUv{#$f>B0QaK5T?S?V!}{9_TSv{*jTj6vM&!~wUea>AY&$&Q;W$?Q2E?* z$CP2v&#$KM-`IL1TPH-nf=}Dx?#o=OFlH`V&%u~A4)mhLeD2`4a|(j5rW6p#t16Qm zRw?LegJjXYgJ<$sftS#ji0FHeC=|%%KxD{+M1UAJfd($i&**(cZ<*l-bG&r1Z^t0EpZLcSQotPYD`YZUcqQ%ozgl2>GLx zh;(f0`PBF0LY1F3&1q~in%W0FKSDVYQihq!T1;Q|&SZ}ATO=foE?x33^|C%S_>BUH ze5<-T5kXY~D~j=uO6dj;jFf!XWdy$?quHpXkVFSM1FK`j!Z8hfx81c%N60Xa0Cb}h z0=?2MwjwAM<}M|lOG>-X_}!?RT{w)j*DChW4s*!$<87xuXt5Eh>Fb#@^~=^KGE$4? zePJ1@8Sjd>v0=@d28K~LBya*j6TX5OKEB}{=U~`r_pHE+;XK#erqthee>7RS-ms$U zwqIe~9;Rj8gQcE4A96P9`_=P>z*?g#n-Z zSHqj4Li*WZ{`Hbsr7o?*;Y{1IWZE`efe`PPo1`NKE|9N6Dd=3b#3FA^^{3ShPMkEj z*v^r-mz=qCu`}ArohDMc*6v}c%=|bGZ3HcI&)v6!Jx#Es?U6Zy0|OGJK36sXv2jFnw7_@23ZN}6=JdOW z{k}aZ-S{*%)^2V2mp-%FfPg-;0N62N?=1cA(xf)>?Z?i!g3MS;3}|s}$B#p%B^1Yl z7MYpa@su^~?R;#s76lK9%TEcstuS0@Zrxut`tBBdD5lK6O8@GCni-;^QhHPHB6`Vb z=Nnwn90gZYQ~)85j{4bSs|kx3ar{~c^R?NHjbbg4j$dyMt2Mb=iHtk^@H}m-==<*b zLy+XsNytq#U)9yZ1m#T8m*HoHfVG!x)zxQfj*y$6CpVlJ>q2>{ggS=cIhx|pCOXfE zy+f|+(|~alUrDFcuR2An)~2WQ-)d7^+lVY$$wAbcT-;~H9m)J`Z1pvw54?7GF|9Hg zg8N79-r8Y=%laat>3Tj}n4-ujFK`dUL19Y7Gh%=;eHEkd_R+0@wNgeJ-wEoe9e zp@Tz*&mh@YQAET3!!nA-ni&4;Aj6D!vZT)?<2J$!Y~{yRcgH`O1x{w4U>A!q93c6` zSuO3ympVH5TO`zG&Z*{Q?!{bE==#B&F<}1th~-<@NuhXxvy-8(W)mP&e<*t z@jN}^GKcPWq0bIl?C+hqu#v|Cl7v)!o+D{8(p3`%-K}azExEQO?Z5sa& zuu>I0)?jPfX0xKe*tJEX6$zozngCVLVJ43U=!SDS5- zVn@vF>5WAGOtD<6I#l5Hkl_eAXAS9<#R3K?{bjkn=|1lt$@w*U#w_gUZvt}JQVf(V1AyH|^WtggLP*7DJFSVB1?&UJj< zrJl|d@^v*=m=acV1Y3ucj?S}7`_v*)!(sqdBI$)X8Cg?Xw~;0`xc%1{WhoP5EarUU zj;@pMomKsf-F6KwF$DQ7$nU{cD7RKAx1zB{#91)zu~U)~G&te~#bPP-C3kca00sWt zl^kRZSDHqvU4OZFr6F3l;F{t}a>fA0yvZz=aW0wLY%o_j^4`;u?0gLyf)$K#{j~Bl zt}vc+BQj(Jzm9zIa%t;iKg^PiJM^bUFq%DJ1;KSEX~oT;<6F|UPf!ya6_N0Uqgu4d zis|?!476l~{6>SEdObmna?G^arW+(iWs=Vo{Bj}7HOIW66`h5Mn(+~J(IapZ*FfO1 zz@w3U&x1wnubcO1U{WIn>u>m*sL6D0r~={0R_Xryb8BlBq*Y^j-_?ADP8rX2wktHFz=J9YLsvUqRNHx{x-ZNrl|pY7H8pX!<&?C3R}KKZUZc;+QD=y~ zgtp>_ptnbd3PqwTsRSB{g`)34*2H*}#3T!~YCm2E<*Q3J0}0-#KGC`T_Rzq{^i58{EA zQH}7zI$W$i=7t#8G{KrO0{k5?tv6ogZ^7X-@n2SA{JSHJs~aH&b!ENbY}!|| zUJKowIus1hQ4#a43lFW{9e#@Fy>t=XM6|_%Hh$EmI^IKXN-|NX#et_BtLt-#;Us&& zEbD%PTPysBn~Md~F_-znU4;v4>~~O)zMdXD-DVSU{=H77&b{MDM|Ph+rLh0pt05>& z3@h=>NriSxyD5EUqEH?YXN^z~UsCCzVBdvA#OOk*|#ljSUwql7)p1swL|jGB3852C*~S;JHYzICB^^<;p>

f9>%GAXwCw$EGh4psTaj(C>-*~mdjW0xf9hhhAas1YTMj~_}$fZvI#8NV}fIK-o zkId6EA@m}kfTJ{fI);uIqVGOQ9eK1}kxn-Ln_FCl8l|4`9{DYXoDe{t!bgD_5s8>h zons~=PCvmpn$`_ooWZ#~X_$$%XoaN@ks8$!=rDOn#IGuC;ocCY6t7g=ZWgYUl}R9> zjw%gfCwst;HX<@WjMQ;ChSA*n%pjhWxdKNiLfzwgdwZyK2*McP>nUIjzbQ1@GG>`Ea`rS}isJu=^VJe}9`WBeicAd6OfxVQJ zp?Dj)AdQZojXCROEH3*c&$dUw@a};;oUJ%UPrMIeH2(e!TV?Fd+}m-vLTDKrbI>9x>|Udq}ZeV7_}_utb8^W6fSe6Q8A) z=vDg_%YP~`v~BP$+=n)X`fqJ)Yh-6>26A%#P{#IlAVq%r0aEl0id|vSy(KGtv$G{T ztqOWka~>OQWE?o@;7Y@Jvlb zG!hiP72|3c3?p{OvXU2s4l~|EKGPeFPkUuo5 zJ=odO-p+~H!r9iwC4p680EiyqM)?+WiJGb?If7XLqNgtaI#*;p$RH2Lo;anvc`>_2 z(vz|6Y`L9xo9pdNIbJ_Bdui1X_hh$sC-!`5RKjH9Q|yRmZK>7W6tWJsXfmn9=%XPN zSVfkil2+X|KZgHBYrGADiKCb;8lbs5qE-nL*yrGR-#BPHAe_iL&sBAX_qgv-2%>( z&J_jCW!Eh?M2VluQJwTJvnfWCcz-^jteU%J#gU4qI83@Zl&weJc*Okt9p;k+ zKPeP>OUdBxggWog*Nw(ma-P1&QE9^O$bULEq5PQILdrQa6epxXpVk673h0$o_{2O_ z@g_T_lH@eGV^LrAlH~0QA<=#QN`o!l8MI}$JWE}+6cN3GAV~8H&%sKuJ#}N z;fVfHH&|xE{dS7(8ZC|qs7DsUO~eYMkXM^35)B;B4{7776dYn`)O4bo({se@{?-9> z$LfRK*3-Twr_!DC5rlhmzFS$al&Qswxlu~CpqG(H0i!ZQK8)E{*SPMs#MGh0fxRF% zfWY(l9mRao2R7?J+M-=WVE9kJRFn_!6=Q2_d2Vei0;)sGASkh)?wN!9YQ$Hu`Ea)B zASRg+{CCBplv3#^TE}B3TqR&ts)>jh@<i73kMe*7q!Ic<+G!t>;md zu42yy2LdWO0Kka>0MLBY)5G4y*~J)SYQtn}^l+Bh?zKo(XxXQ!j|4j2|1j*s&ZH`DSQ5RGFvKJU=_y zd6*@E^VT1Pb9k6Qkkqs|Yv(kTzBNqgAc05UL{_>U;?w;_Dz${O6Qxu%M9sr7DV@-u z0FEGFX!n@*lQLT-^>Ui$JZ(qI`GdJlq^D60zKu9a{Ji(!Wo5*bVJ!wi!zdN0Y;A2a z7|)ceNr(IEHnhDfbp1xR@18d785Ypl#M0wzQ1Gku7HHBCsM~-XG=8`m3%qv|l!O%g z3_?ZvNf!4^DAu^c-E|Dlz{QU~ZvWuZu3*oTgv2Ns{fk3tvr2>Kv*Ow3xZ+@soI0bS zNI{|DCn?Z7weV!R?R>UlyvH%?*aV}d+hv+Y|I=e&-OK03XbqEDJ|Z?qS>3g-ToPYe zV@;Yv2w9Jd<&#D*9u9$l8F({pYz>~VC@r3I7g$do?Hq>z6SlgQPy7c=l_3Vz#d3mV z43LQ+rI4`4y4Gv)4DFZGK9W+Ahj&4w?n$C)3Y&VrG)TZwo2DwR5l z@q9-Na<>SH{C1?+HU}AeB&}^BS;)1DlKH$+Fcb#e*(=8nBIRd04o6j|U}LzCU!V*ebzX+(njm$_t#_YPCHm46*9z-^g$?ZvwRPBnXVv1)}c*V zGA_#R@S=tfrvrx`o;7+1I+Y2L)u}l1*jCjOwqIQ_*RPn%*n`XdYLkx z%LvzJdH6GHn$u!3Y2Fe=`{orPH#wSZ{qpt>(jI>RCGd_IgX;%GQND{ zIG%VC|GbU%RY~~Df@S*9q%9Oa!%42eWyQpS?Le}fd(QtjlO>*?+fw?;juB6% z?R}#hUy$ninBjDnf9AfhR_*q@0@JKFc*YQ=_p;CPXqb@pMTfOEZ$d^-7BhGRbPgoA2#Rt5E zr=j+1i~zxYUWiolJ$yAEaUg?A`)|vM`(t2spIRvz++E!G)bkx*o6v$XG@bAyIGteJ z&fT4O^Ys+(-DRt6SZy#T4jol|e-Kx+Re6q&{X4k}KZ%Ies(pQkUMZ^6yD9Ed zJ3XPQta|=xpSZQM?B0yEP@W-PFU2F>r}GToXqp~VF6y!sH=mo2ZfI09WLlWkz?bi@ z-KV1bHCTY8vkQ2Sd|_xm7&Q$iJ1(9nN4n6r@1CQ`kMB9)G3x_dv)_$HY<>gAXL{wZ zndXY8M$(rUh5E*?OKMjtwL@$T--?{sCThLLbMrC;tkL zG>p}!{U_#03j(}GH+`emI&_m9^;SmapYFu(>z>fu^);t>e}?ny=E-kza5U4|I$m72 z6MVGqli|Md6-(=Ev?`3>PksJ!Lr=S19NKbP`aE9=OBk@oJ_-r1wrUC4VHv&1zlhvcX}iJjL2B@W)2x)B({(pVJnTqh7lI)42yeiKL9g zPPwZ~5|i0)x#w!nwi214U5%=QiG#=*A2O+CG-9VXEuM>qyRFBofI3fmMP}KysT_%O zy}`Xi-N`M(SDH^=u-3)Mw80BNBS12&jQK4YOf zos93$+Y%|8vMv!x;-+h>ocwcckd^G%4lfSAPn-g$Kc|D%DQ7-=cXoD=J{@g4Z6ZZj zrJlV$38+}n40{59LI2kr{4X><$GA^rHWThdp5{{o4-hH%Vm1{|I|r0vw#_ZGG7jei zP?^>q{v%fV0uRt%Vtpd7z{R4he#b)jMRO*${H<7?Z_!B+Uxq%u-Khx`i5m`{*=~&C zVW@3AFh{>t!SP$ZzT`cIGOVaz6$<5XP8&c3$D*$x$x2(#-wVA3s%Bp6lEY+_3Ys~r z-;+D{oK5y%sFm0#bk94~aUKzjc^N!!;@;BxtB%xN8e$;JI8p>7J(FIXdSQDt`;U!K zKcv~fN9#m{T(Z5-X+m;fp66-Rwg9J`+8=O}vSflTaQkwP(9|ScgSl%1;~J!Cudgqz zE&hB1x`!sh9G?qy2@sBj(bjj_S>J%2kKaqe_2pQbJ1f3tft0SmJ(M-dDiDh;RD%cv zl1FHKiji(GUnw{gtP`z|kB=pNt4rIdJp!t6GPO9e{Z4;krs1EEoFY`c9qALEwdoKt zEBU~E*Md8ws2J{xUU#{= z?d+aR=0_J>?73vc2*!qV+goN(#8PpShDj^PDi}o9-_O ziZn@#1*07Mdtr0bpJCNC&g(#|cVhJY^{1h;4s!frzSdV0$(<*tyc$+KmHus_>SxTO zD4~&tuT|+4wEK-COk{NQb97p?gO>H05Flq)LRFn@4T9NvYcbn&aHErI`*GJ3zOLK_ zVeXY0)&z@!%lps1-9e}s-^)Tz5E*_w;c}IF7=Vp#myy_&+Y`pvaWwK06DHNW_jcTy zz@-QGkY?Y;lz`<#Yc>u+dfN}aavuOHrl!`P4>m2Df@?Y98lpp(!TCHP$C2ec{@OsUbXW zf>6lB^9Otqp0K5jdq7`V+#m6dY9oHby|Vk!4qN*KDRN;th5ihe2(9k=QF2L4@|#B< zSv2kE?GqR9PSQgBCvlCRE6r=8!A5 z(RN(i{+ONi$ZDP*H_ZpqbOJ)xVlq*Kp#>=eO>@>0cZ*O0?wP|5?y`C*+vod56cCM9 zuS0k#I>Kc?EVP;mVjN5!#M3G(p!N%vyVQ_zNZfu^{QkRSq!8EQJd=yekwG#tPA87f zk{8qScPMFI1BUOcJC6L(`Hw!n+?tnoUD3%p1%zDX;J1#mSIRb1Er&huBifTxnr)dc@n>M%^i`ZAvTF)n#9i!V%ie@A7HBuW|yDw2THR77oPG9lTs!`8eNnD6A;@ zxs8Fqiis>W>}{j?dDyF zwfF9U5#1-I@kBn_bbbMl#$MzpX^TW-=%lA)1yze){*p&BmRa~TnLRg1YK85wBBIz?YP!k&k#D) zDsXd_8Cl^(kGxtnb7nMopL|lHsmp!OWV;o0;)&VU8}E;D4#9*1B&R9w?W9|k?XFRa zzoI&i2Hq9zWHl9YUFYaxKJ|AUGRNyshcdN*>7dKs_*~lbTs<`g|`M8zs4+%%1Fz!i&3W7lEw)M+(}ppcP8gVl#}9u!yS%gC>%5|eGz zFcg~uoR=Saw*RA#w+o{a`!243?@K>E)1B;LR$VPi%wm*Pgdv@UScv&0Lm=`CkBFfA z9hP~SFz#>2^GY>T&5}%LH>GG2kp)dws0w{v9^)!9m()+xpHs$a0F*~)FbUhsRc}`f ze0A+1^N1n$(M6SFBe2PoRfi?w+kb|3*sC5{rkylNL|tIZVK-Bx$+k+ zsF!Rnojx0tH;{KapffcShj;(?jt#v~v9dR%SLW?q739kI!B_Rzzaz-+?aw`t1E5ao z+fCUa5TDlyImdh8osOl}nOfHa-0SB10h=JY`=f@QnXts(gCUD%&nGhwQtumDX7J5V zc1m2Qo4|5}C#QQ7MOlcCrThQ8QUBp906sjU|BnA?+y4{&XD9i8AOIla;|%}SSNPqWyn+Fp9D;u>XQ!KQ`BoTP-E|*WUjDi`eRk From 960c545f375077f7f37491409b7e3e84fd9bbe1d Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 05:14:31 +0200 Subject: [PATCH 06/81] Dockerfile uses Ubuntu 20.04, fix obtain ffmpeg --- Dockerfile | 41 +++++++++++++++++++++-------------------- docker-build.sh | 7 ++++++- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3a9d9e3..bd9166f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,19 @@ -FROM alpine:latest AS ffmpeg +FROM ubuntu:20.04 AS ffmpeg COPY docker-build.sh . RUN sh ./docker-build.sh -FROM alpine:latest as frontend +FROM ubuntu:20.04 as frontend -RUN apk add --no-cache \ - npm - -RUN npm install -g @angular/cli +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get -y install \ + wget \ + gnupg && \ + curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ + apt-get -y install \ + nodejs \ + npm && \ + npm install -g @angular/cli WORKDIR /build COPY [ "package.json", "package-lock.json", "/build/" ] @@ -20,37 +25,33 @@ RUN npm run build #--------------# -FROM alpine:latest +FROM ubuntu:20.04 ENV UID=1000 \ GID=1000 \ - USER=youtube + USER=youtube \ + NO_UPDATE_NOTIFIER=true -ENV NO_UPDATE_NOTIFIER=true +RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ + apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/main/ \ - musl + atomicparsley WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 -RUN npm install pm2 -g -RUN npm install && chown -R $UID:$GID ./ +RUN npm install pm2 -g && \ + npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] +# ENTRYPOINT [ "/app/entrypoint.sh" ] CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/docker-build.sh b/docker-build.sh index 5876372..e7ca0ed 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,7 +23,12 @@ case $(uname -m) in esac echo "Architecture: $ARCH" -wget "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -O ffmpeg.txz +curl --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + --retry-delay 0 \ + --retry-max-time 40 \ + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 7874f1b71ab113b2e3a6d2a3091ec21cc6df75e5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 06:29:54 +0200 Subject: [PATCH 07/81] curl is in fact missing in focal, my bad --- Dockerfile | 1 + docker-build.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index bd9166f..3f7dcf8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ wget \ + curl \ gnupg && \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ diff --git a/docker-build.sh b/docker-build.sh index e7ca0ed..a492c69 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -23,12 +23,14 @@ case $(uname -m) in esac echo "Architecture: $ARCH" +apt-get -y install curl curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz +apt-get remove curl mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg From 5ac5fca48268382998719642284f7f1d62f184ef Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 06:37:12 +0200 Subject: [PATCH 08/81] adapt postbuild.mjs to postbuild.js --- package.json | 2 +- src/{postbuild.mjs => postbuild.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{postbuild.mjs => postbuild.js} (100%) diff --git a/package.json b/package.json index 43dd6cb..990a4d0 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "ng": "ng", "start": "ng serve", "build": "ng build --configuration production", - "prebuild": "node src/postbuild.mjs", + "prebuild": "node src/postbuild.js", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", diff --git a/src/postbuild.mjs b/src/postbuild.js similarity index 100% rename from src/postbuild.mjs rename to src/postbuild.js From aea4f522673cdc1a11bc255d096debdb59c007e7 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 07:12:00 +0200 Subject: [PATCH 09/81] revert postbuild.mjs file-extension change --- package.json | 2 +- src/{postbuild.js => postbuild.mjs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{postbuild.js => postbuild.mjs} (100%) diff --git a/package.json b/package.json index 990a4d0..43dd6cb 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "ng": "ng", "start": "ng serve", "build": "ng build --configuration production", - "prebuild": "node src/postbuild.js", + "prebuild": "node src/postbuild.mjs", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", diff --git a/src/postbuild.js b/src/postbuild.mjs similarity index 100% rename from src/postbuild.js rename to src/postbuild.mjs From 0a8aba54d238937874f57c34760127dc71df120f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 09:17:23 +0200 Subject: [PATCH 10/81] Fix for #480 - existing DLs still getting queued --- backend/subscriptions.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/subscriptions.js b/backend/subscriptions.js index dcad973..e14f121 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -141,6 +141,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) { if (sub.archive && (await fs.pathExists(sub.archive))) { const archive_file_path = path.join(sub.archive, 'archive.txt'); // deletes archive if it exists + // TODO: Keep entries in blacklist_video.txt by moving them to a global blacklist if (await fs.pathExists(archive_file_path)) { await fs.unlink(archive_file_path); } @@ -379,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de if (useArchive && !redownload) { if (sub.archive) { archive_dir = sub.archive; - archive_path = path.join(archive_dir, 'archive.txt') + if (sub.type && sub.type === 'audio') { + archive_path = path.join(archive_dir, 'merged_audio.txt'); + } else { + archive_path = path.join(archive_dir, 'merged_video.txt'); + } } downloadConfig.push('--download-archive', archive_path); } From 2527051eab74bfd2ed29dddc1383a737e55c9ee4 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 09:35:04 +0200 Subject: [PATCH 11/81] fix pipefail MIA in ubuntu without specifying bash --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index a492c69..62b8832 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -4,7 +4,7 @@ # and also optimizing some code with this commit. # xoxo :D -set -xeuo pipefail +bash | set -xeuo pipefail case $(uname -m) in x86_64) From c0fb838931f80a5eab7cbef0ea94262d7ff7c918 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:11:32 +0200 Subject: [PATCH 12/81] fix docker-build.sh for ubuntu, what a ride --- docker-build.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docker-build.sh b/docker-build.sh index 62b8832..dd195a5 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -4,8 +4,6 @@ # and also optimizing some code with this commit. # xoxo :D -bash | set -xeuo pipefail - case $(uname -m) in x86_64) ARCH=amd64;; @@ -22,17 +20,24 @@ case $(uname -m) in exit 1 esac -echo "Architecture: $ARCH" -apt-get -y install curl -curl --connect-timeout 5 \ +echo "(INFO) Architecture detected: $ARCH" +echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" +apt-get -y install curl xz-utils +echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" +curl -o ffmpeg.txz \ + --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ - "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" -o ffmpeg.txz -apt-get remove curl + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" mkdir /tmp/ffmpeg tar xf ffmpeg.txz -C /tmp/ffmpeg +echo "(3/5) CLEANUP - Remove temp dependencies from ffmpeg obtain layer" +apt-get -y remove curl xz-utils +apt-get -y autoremove +echo "(4/5) PROVISION - Provide ffmpeg and ffprobe from ffmpeg obtain layer" cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe +echo "(5/5) CLEANUP - Remove temporary downloads from ffmpeg obtain layer" rm -rf /tmp/ffmpeg ffmpeg.txz \ No newline at end of file From fe91484f2418ea4c3cc441d4e5319831340ee745 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:40:19 +0200 Subject: [PATCH 13/81] I did warn you I will test docker builds this way --- docker-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-build.sh b/docker-build.sh index dd195a5..2a81d43 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -22,7 +22,7 @@ esac echo "(INFO) Architecture detected: $ARCH" echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" -apt-get -y install curl xz-utils +apt-get update && apt-get -y install curl xz-utils echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" curl -o ffmpeg.txz \ --connect-timeout 5 \ From 493e876a97c6bac0430480da85256bc009bd4e12 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:48:27 +0200 Subject: [PATCH 14/81] syntax fixes are fun --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3f7dcf8..9f3b9b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,8 +35,8 @@ ENV UID=1000 \ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ - apt-get update && apt-get -y install \ +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - +RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ From 0329cd97184d756f34b42598bf6af7d3163e5bfb Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:51:20 +0200 Subject: [PATCH 15/81] don't think we need to install curl twice lol --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9f3b9b9..dbe5558 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,6 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm \ python2 \ python3 \ atomicparsley From 80fcecdaeafc922f6cb03a9753c5479258a8e177 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 10:57:21 +0200 Subject: [PATCH 16/81] it's a learning experience --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index dbe5558..9f3b9b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,6 +37,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ + npm \ python2 \ python3 \ atomicparsley From 3bcbe0d3e7e0f226ea96554e918f0f6c78398e0c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:04:59 +0200 Subject: [PATCH 17/81] fix dependency node-gyp (>= 3.6.2~) needed --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 9f3b9b9..d1c8e99 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,7 @@ RUN apt-get update && apt-get -y install \ apt-get -y install \ nodejs \ npm && \ + node-gyp && \ npm install -g @angular/cli WORKDIR /build From 7aa5c1bf7f9009bac98fe9a595ab835857e7cc6c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:21:45 +0200 Subject: [PATCH 18/81] syyyyntax --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d1c8e99..5c84989 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm && \ + npm \ node-gyp && \ npm install -g @angular/cli From 958f80e20003f92ac36e6347018019ce9d6f20f9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:28:34 +0200 Subject: [PATCH 19/81] the good? I learn a lot about Docker building --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5c84989..2cab91a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,8 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm \ - node-gyp && \ + npm && \ + apt-get install -f && \ npm install -g @angular/cli WORKDIR /build @@ -38,7 +38,6 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm \ python2 \ python3 \ atomicparsley From 60f2ab449f42733c1210ba996a77bd9725f7cbe5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:31:53 +0200 Subject: [PATCH 20/81] yea --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 2cab91a..e84d95c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ + npm\ python2 \ python3 \ atomicparsley From 39ddefab5c0ce5f1c257cceba9a18f34432526d5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:37:39 +0200 Subject: [PATCH 21/81] fix dependencies needed for our apt packages --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e84d95c..2f89e6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,8 @@ RUN apt-get update && apt-get -y install \ npm\ python2 \ python3 \ - atomicparsley + atomicparsley && \ + apt-get install -f WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg From efaecaa059662c1e4f7a730e0fa63629aeb2366e Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:48:12 +0200 Subject: [PATCH 22/81] use yarn in apt installs instead of npm --- Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2f89e6f..492891e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,9 @@ RUN apt-get update && apt-get -y install \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ apt-get -y install \ nodejs \ - npm && \ + # YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + yarn && \ apt-get install -f && \ npm install -g @angular/cli @@ -38,7 +40,9 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm\ + # YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + yarn\ python2 \ python3 \ atomicparsley && \ From 777aebe5082cde8e4d71eff74decc07eb3a938a8 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:52:35 +0200 Subject: [PATCH 23/81] apparently we still need npm in the last stretch.. --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 492891e..e060a28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,9 +40,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - # YARN: brings along npm, solves dependency conflicts, - # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 - yarn\ + npm python2 \ python3 \ atomicparsley && \ From d5ab0d7b9614d154195479f1b4780e38243edfdb Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 11:54:19 +0200 Subject: [PATCH 24/81] I'm getting sleepy, why am I still pushing through --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e060a28..f06e28b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,7 +40,7 @@ RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ - npm + npm \ python2 \ python3 \ atomicparsley && \ From bd1ed2b7056212d332ae7076ce1f028d6de65cf0 Mon Sep 17 00:00:00 2001 From: "dejan.petrov@dapmn.com" Date: Sun, 1 May 2022 18:02:46 +0200 Subject: [PATCH 25/81] Clean up docker image Added some commands to clean up the image after apt-get does its thing. It should shave off a couple of megabytes, nothing to big though. --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f06e28b..2b62a15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,7 +44,11 @@ RUN apt-get update && apt-get -y install \ python2 \ python3 \ atomicparsley && \ - apt-get install -f + apt-get install -f && \ + apt autoremove --purge && \ + apt autoremove && \ + apt clean && \ + rm -rf /var/lib/apt WORKDIR /app COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg From 2cdc1cee98fcb831ce74ef377846de16809ca5ca Mon Sep 17 00:00:00 2001 From: "dejan.petrov@dapmn.com" Date: Sun, 1 May 2022 18:14:27 +0200 Subject: [PATCH 26/81] Fix for #585 Added the DEBIAN_FRONTEND=noninteractive variable to all stages. This should stop the build from failing. Also added --no-install-recommends to install only the requested packages. This might break stuff, but I'm not sure though. --- Dockerfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2b62a15..209e986 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,14 @@ FROM ubuntu:20.04 AS ffmpeg +ENV DEBIAN_FRONTEND=noninteractive + COPY docker-build.sh . RUN sh ./docker-build.sh FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get -y install \ +RUN apt-get update && apt-get --no-install-recommends -y install \ wget \ curl \ gnupg && \ @@ -36,10 +38,12 @@ ENV UID=1000 \ USER=youtube \ NO_UPDATE_NOTIFIER=true +ENV DEBIAN_FRONTEND=noninteractive + RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - -RUN apt-get update && apt-get -y install \ +RUN apt-get update && apt-get --no-install-recommends -y install \ npm \ python2 \ python3 \ From 2a4102825378f6b889c231a47b4e0b34b2ac58f8 Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sun, 1 May 2022 20:42:45 +0200 Subject: [PATCH 27/81] Update Dockerfile --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 209e986..9521c9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ RUN sh ./docker-build.sh FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get --no-install-recommends -y install \ +RUN apt-get update && apt-get -y install \ wget \ curl \ gnupg && \ @@ -43,15 +43,15 @@ ENV DEBIAN_FRONTEND=noninteractive RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - -RUN apt-get update && apt-get --no-install-recommends -y install \ +RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ atomicparsley && \ apt-get install -f && \ - apt autoremove --purge && \ - apt autoremove && \ - apt clean && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ rm -rf /var/lib/apt WORKDIR /app From 9c0733453a86c9ea5c60e8833fb03f557f9d42df Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Sun, 1 May 2022 23:00:01 +0200 Subject: [PATCH 28/81] removing strict SSL from npm config --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9521c9a..c108068 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,7 @@ RUN apt-get update && apt-get -y install \ # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 yarn && \ apt-get install -f && \ + npm config set strict-ssl false && \ npm install -g @angular/cli WORKDIR /build @@ -59,7 +60,8 @@ COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 -RUN npm install pm2 -g && \ +RUN npm config set strict-ssl false && \ + npm install pm2 -g && \ npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] From d5626f1dae295dd20891f8a6be5375f530abcf5e Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Sun, 1 May 2022 23:29:51 +0200 Subject: [PATCH 29/81] Dockerfile: wget not needed --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c108068..3b8ec2c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,6 @@ FROM ubuntu:20.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ - wget \ curl \ gnupg && \ curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ From 754d8370595b523f794a521a0ee0de8238094ad1 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:09:37 +0200 Subject: [PATCH 30/81] adding docker-pr-check.yml --- .github/workflows/docker-pr-check.yml | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/docker-pr-check.yml diff --git a/.github/workflows/docker-pr-check.yml b/.github/workflows/docker-pr-check.yml new file mode 100644 index 0000000..54e618d --- /dev/null +++ b/.github/workflows/docker-pr-check.yml @@ -0,0 +1,42 @@ +name: docker-pr-check + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: setup platform emulator + uses: docker/setup-qemu-action@v1 + - name: setup multi-arch docker build + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: build & push images + uses: docker/build-push-action@v2 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm,linux/arm64/v8 + push: false + tags: tzahi12345/youtubedl-material:nightly-pr From f5f00e1732c6a507a9f39added542c7877b338fc Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:12:10 +0200 Subject: [PATCH 31/81] fix name --- .github/workflows/{docker-pr-check.yml => docker-pr.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{docker-pr-check.yml => docker-pr.yml} (98%) diff --git a/.github/workflows/docker-pr-check.yml b/.github/workflows/docker-pr.yml similarity index 98% rename from .github/workflows/docker-pr-check.yml rename to .github/workflows/docker-pr.yml index 54e618d..1a2c5ab 100644 --- a/.github/workflows/docker-pr-check.yml +++ b/.github/workflows/docker-pr.yml @@ -1,4 +1,4 @@ -name: docker-pr-check +name: docker-pr on: pull_request: From 0abe252d1e24d5b46749238dfd1fd966ba29e53a Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 02:59:25 +0200 Subject: [PATCH 32/81] we need to find a different build check solution --- .github/workflows/docker-pr.yml | 42 --------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/docker-pr.yml diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml deleted file mode 100644 index 1a2c5ab..0000000 --- a/.github/workflows/docker-pr.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: docker-pr - -on: - pull_request: - branches: [master] - -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - name: checkout code - uses: actions/checkout@v2 - - name: Set hash - id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - - name: Get current date - id: date - run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - name: create-json - id: create-json - uses: jsdaniell/create-json@1.1.2 - with: - name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' - dir: 'backend/' - - name: setup platform emulator - uses: docker/setup-qemu-action@v1 - - name: setup multi-arch docker build - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: build & push images - uses: docker/build-push-action@v2 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm,linux/arm64/v8 - push: false - tags: tzahi12345/youtubedl-material:nightly-pr From 3a48ff2d50db08ce20a19b701bdee4cca48c90f4 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:11:01 -0400 Subject: [PATCH 33/81] docker build and push action now uses secrets for DockerHub username, repo, and tag --- .github/workflows/docker.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3fd4ab2..0782193 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -21,7 +21,7 @@ jobs: uses: jsdaniell/create-json@1.1.2 with: name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + json: '{"type": "docker", "tag": "${{secrets.DOCKERHUB_MASTER_TAG}}", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: setup platform emulator uses: docker/setup-qemu-action@v1 @@ -39,4 +39,8 @@ jobs: file: ./Dockerfile platforms: linux/amd64,linux/arm,linux/arm64/v8 push: true - tags: tzahi12345/youtubedl-material:nightly + # Defaults: + # DOCKERHUB_USERNAME : tzahi12345 + # DOCKERHUB_REPO : youtubedl-material + # DOCKERHUB_MASTER_TAG: nightly + tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} From 2981f843c3356fa4a98e59587da607013004b084 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:11:21 -0400 Subject: [PATCH 34/81] Added docker build PR check --- .github/workflows/docker-pr.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/docker-pr.yml diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml new file mode 100644 index 0000000..9aebc2b --- /dev/null +++ b/.github/workflows/docker-pr.yml @@ -0,0 +1,27 @@ +name: docker-pr + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: Build docker images + run: docker-compose build \ No newline at end of file From 4c06c430eb702fc05b9fa27c11baf45d69ee2eb6 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 21:21:39 -0400 Subject: [PATCH 35/81] Converted docker-compose build to docker build for docker-pr GH action --- .github/workflows/docker-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 9aebc2b..0e566ea 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -24,4 +24,4 @@ jobs: json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: Build docker images - run: docker-compose build \ No newline at end of file + run: docker build . -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} \ No newline at end of file From 77e8cbc6b5ca5d7b6b3dee49b20949436f43b50b Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 04:21:12 +0200 Subject: [PATCH 36/81] Adding ignore parameters to docker build-and-push --- .github/workflows/docker.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3fd4ab2..abf93a5 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,6 +3,16 @@ name: docker on: push: branches: [master] + paths-ignore: + - '.github/**' + - '.vscode/**' + - 'chrome-extension/**' + - 'releases/**' + - '**.crx' + - '**.pem' + - '**.md' + - '.dockerignore' + - '.gitignore' jobs: build-and-push: From 9f9054ed9df364e66059b924214cd684849163ee Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 22:59:55 -0400 Subject: [PATCH 37/81] Removed secrets from docker-pr.yml --- .github/workflows/docker-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 0e566ea..2fcf807 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -24,4 +24,4 @@ jobs: json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: Build docker images - run: docker build . -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} \ No newline at end of file + run: docker build . -t tzahi12345/youtubedl-material:nightly-pr \ No newline at end of file From dab0b7a8b62b57c9440ca8d22bdd5d92058db4f2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:13:00 -0400 Subject: [PATCH 38/81] Updated Angular version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15b12b8..bf4c4f2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub issues badge](https://img.shields.io/github/issues/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/issues) [![License badge](https://img.shields.io/github/license/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/blob/master/LICENSE.md) -YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 11](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. +YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 13](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. Now with [Docker](#Docker) support! From a68726e7cbf087a1784aecaee33bfb6f7bb2ddd9 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:13:11 -0400 Subject: [PATCH 39/81] Removed deprecated armhf.Dockerfile --- armhf.Dockerfile | 49 ------------------------------------------------ 1 file changed, 49 deletions(-) delete mode 100644 armhf.Dockerfile diff --git a/armhf.Dockerfile b/armhf.Dockerfile deleted file mode 100644 index 7f192be..0000000 --- a/armhf.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM alpine:3.12 as frontend - -RUN apk add --no-cache \ - npm \ - curl - -RUN npm install -g @angular/cli - -WORKDIR /build - -RUN curl -L https://github.com/balena-io/qemu/releases/download/v3.0.0%2Bresin/qemu-3.0.0+resin-arm.tar.gz | tar zxvf - -C . && mv qemu-3.0.0+resin-arm/qemu-arm-static . - -COPY [ "package.json", "package-lock.json", "/build/" ] -RUN npm install - -COPY [ "angular.json", "tsconfig.json", "/build/" ] -COPY [ "src/", "/build/src/" ] -RUN ng build --prod - -#--------------# - -FROM arm32v7/alpine:3.12 - -COPY --from=frontend /build/qemu-arm-static /usr/bin - -ENV UID=1000 \ - GID=1000 \ - USER=youtube - -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID - -RUN apk add --no-cache \ - ffmpeg \ - npm \ - python2 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley - -WORKDIR /app -COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install && chown -R $UID:$GID ./ - -COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] -COPY --chown=$UID:$GID [ "/backend/", "/app/" ] - -EXPOSE 17442 -ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "node", "app.js" ] From 8a323f028da2aa460ff89dd929fca58955690ea2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:15:09 -0400 Subject: [PATCH 40/81] Fixed bug where subscription avatars were missing --- src/app/app.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app.component.html b/src/app/app.component.html index f1270c7..278b8fe 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -51,7 +51,7 @@ - {{subscription.name}} + {{subscription.name}} From 88c16d71953b6a82d9736ce2d8227359d126403f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:23:19 -0400 Subject: [PATCH 41/81] All setIntervals on the frontend are now properly destroyed --- .../concurrent-stream/concurrent-stream.component.ts | 5 +++++ src/app/components/twitch-chat/twitch-chat.component.ts | 3 ++- src/app/subscription/subscription/subscription.component.ts | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/components/concurrent-stream/concurrent-stream.component.ts b/src/app/components/concurrent-stream/concurrent-stream.component.ts index 6c2cc67..e99108b 100644 --- a/src/app/components/concurrent-stream/concurrent-stream.component.ts +++ b/src/app/components/concurrent-stream/concurrent-stream.component.ts @@ -42,6 +42,11 @@ export class ConcurrentStreamComponent implements OnInit { } + ngOnDestroy(): void { + if (this.check_timeout) { clearInterval(this.check_timeout); } + if (this.update_timeout) { clearInterval(this.update_timeout); } + } + startServer() { this.started = true; this.server_started = true; diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index d2e0aa0..e4ec4c7 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit { this.getFullChat(); } - ngAfterViewInit() { + ngOnDestroy(): void { + if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); } } private isUserNearBottom(): boolean { diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index dcb6c5c..967b5bd 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -52,6 +52,8 @@ export class SubscriptionComponent implements OnInit, OnDestroy { this.route.params.subscribe(params => { this.id = params['id']; + if (this.sub_interval) { clearInterval(this.sub_interval); } + this.postsService.service_initialized.subscribe(init => { if (init) { this.getConfig(); From a36761e96a3da59c28accc6022f6bcd6198cae64 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 May 2022 23:24:15 -0400 Subject: [PATCH 42/81] Fixed frontend build error --- src/app/components/twitch-chat/twitch-chat.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index e4ec4c7..bbeb7de 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { PostsService } from 'app/posts.services'; @Component({ @@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services'; templateUrl: './twitch-chat.component.html', styleUrls: ['./twitch-chat.component.scss'] }) -export class TwitchChatComponent implements OnInit, AfterViewInit { +export class TwitchChatComponent implements OnInit, OnDestroy { full_chat = null; visible_chat = null; From 1bb4d9dbf63ca1ba3a27c25057a88080d9bed228 Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Mon, 2 May 2022 07:22:05 +0200 Subject: [PATCH 43/81] Deleted translation using Weblate (Basa (Cameroon)) --- src/assets/i18n/messages.bas.xlf | 2634 ------------------------------ 1 file changed, 2634 deletions(-) delete mode 100644 src/assets/i18n/messages.bas.xlf diff --git a/src/assets/i18n/messages.bas.xlf b/src/assets/i18n/messages.bas.xlf deleted file mode 100644 index 1e080e4..0000000 --- a/src/assets/i18n/messages.bas.xlf +++ /dev/null @@ -1,2634 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 75 - - Dark mode toggle label - - - Settings - - - src/app/app.component.html - 28 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 15 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Multi-download Mode - - - src/app/main/main.component.html - 70,71 - - Multi-download Mode checkbox - - - Cancel - - - src/app/main/main.component.html - 84,85 - - Cancel download button - - - Advanced - - - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Custom args - - - src/app/main/main.component.html - 115 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - - src/app/main/main.component.html - 118,119 - - Custom Args input hint - - - Use custom output - - - src/app/main/main.component.html - 126,127 - - Use custom output checkbox - - - Custom output - - - src/app/main/main.component.html - 130 - - Custom output placeholder - - - Documentation - - - src/app/main/main.component.html - 132 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 125 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 133 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint - - - Crop file - - - src/app/main/main.component.html - 155,156 - - Crop video checkbox - - - Crop from (seconds) - - - src/app/main/main.component.html - 159 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 164 - - Crop to placeholder - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 140,141 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 144 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 149 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 10 - - YT Password placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - src/app/create-playlist/create-playlist.component.html - 6 - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 5 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 18 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - Subscription custom name placeholder - - - Download all uploads - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - - - Subscribe - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - Subscribe button - - - Download videos uploaded in the last - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - - - Type: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 13 - - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - - Subscription ID property - - - Close - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 17 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 59 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 1 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 31 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - Name: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 6 - - Video name property - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - Register a user - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 - - Register user dialog title - - - User name - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 - - User name placeholder - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 35 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 - - Cookies upload warning - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 464 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - Normal order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 - - Normal order - - - Reverse order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - No videos found. - - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - Playlist edit button - - - Delete - - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 33 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - Delete playlist - - - Info - - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - Delete and blacklist video button - - - views - - - src/app/player/player.component.html - 15 - - View count label - - - The download was successful - - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - - src/app/subscriptions/subscriptions.component.html - 27 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 24 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 33 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 43 - - No playlist subscriptions text - - - Main - - - src/app/settings/settings.component.html - 12 - - Main settings label - - - Downloader - - - src/app/settings/settings.component.html - 102 - - Downloader settings label - - - Extra - - - src/app/settings/settings.component.html - 185 - - Extra settings label - - - Database - - - src/app/settings/settings.component.html - 284 - - Database settings label - - - Advanced - - - src/app/settings/settings.component.html - 320 - - Host settings label - - - Users - - - src/app/settings/settings.component.html - 403 - - - src/app/settings/settings.component.html - 403 - - Users settings label - - - Logs - - - src/app/settings/settings.component.html - 451 - - - src/app/settings/settings.component.html - 451 - - Logs settings label - - - {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - - - src/app/settings/settings.component.html - 467 - - Settings cancel and close button - - - URL this app will be accessed from, without the port. - - - src/app/settings/settings.component.html - 19 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 24 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 25 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 34 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 38 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 39 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 48 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 52 - - Subscriptions base path input setting placeholder - - - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 53 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 58 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 59 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 63 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 72 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 74 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 80 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 89 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 109 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 110 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 116 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 117 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 123 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 126 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 133 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 134 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 144 - - Categories - - - With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 158 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 166 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 170 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 174 - - Include metadata setting - - - Kill all downloads - - - src/app/settings/settings.component.html - 178 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 191 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 196 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 199 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 202 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 205 - - Download only mode setting - - - Allow multi-download mode - - - src/app/settings/settings.component.html - 208 - - Allow multi-download mode setting - - - Enable Public API - - - src/app/settings/settings.component.html - 216 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 221 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 222 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 226 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 226 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 235 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 239 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 240 - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 244 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 251 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 252 - - Twitch API Key setting hint AKA preamble - - - Auto-download Twitch Chat - - - src/app/settings/settings.component.html - 247 - - Auto download Twitch Chat setting - - - Click here - - - src/app/settings/settings.component.html - 262 - - - src/app/settings/settings.component.html - 268 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Chrome ext click here - - - to download the official YoutubeDL-Material Chrome extension manually. - - - src/app/settings/settings.component.html - 262 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 263 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 268 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 269 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 269 - - Firefox setup suffix - - - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - - - src/app/settings/settings.component.html - 274 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 275 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 290 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 291 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 299 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 300 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 304 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 308 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 312 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 326 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 335 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 339 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 353 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 365 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 376 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 384 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 385 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 397 - - Restart server button - - - Allow user registration - - - src/app/settings/settings.component.html - 407 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 411 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 413 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 416 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 423 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 428 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 433 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 438 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 443 - - Search Filter - - - About YoutubeDL-Material - - - src/app/dialogs/about-dialog/about-dialog.component.html - 1 - - About dialog title - - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 12 - - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Found a bug or have a suggestion? - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - About bug prefix - - - to create an issue! - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - About bug suffix - - - Checking for updates... - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Select a version: - - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Session ID: - - - src/app/components/downloads/downloads.component.html - 5 - - Session ID - - - Clear all downloads - - - src/app/components/downloads/downloads.component.html - 18 - - clear all downloads action button - - - (current) - - - src/app/components/downloads/downloads.component.html - 6 - - Current session - - - No downloads available! - - - src/app/components/downloads/downloads.component.html - 25 - - No downloads label - - - Your Profile - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Delete and redownload - - - src/app/components/unified-file-card/unified-file-card.component.html - 28 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - - src/app/components/unified-file-card/unified-file-card.component.html - 31 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Length: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - From 01fd2fb99076d984c4ad83a3fd5e2cdc8d19cd76 Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Mon, 2 May 2022 07:24:10 +0200 Subject: [PATCH 44/81] Deleted translation using Weblate (Hindi) --- src/assets/i18n/messages.hi.xlf | 3040 ------------------------------- 1 file changed, 3040 deletions(-) delete mode 100644 src/assets/i18n/messages.hi.xlf diff --git a/src/assets/i18n/messages.hi.xlf b/src/assets/i18n/messages.hi.xlf deleted file mode 100644 index 29f68db..0000000 --- a/src/assets/i18n/messages.hi.xlf +++ /dev/null @@ -1,3040 +0,0 @@ - - - - - - About - - - src/app/app.component.html - 32 - - About menu label - - - Profile - - - src/app/app.component.html - 19 - - Profile menu label - - - Dark - - - src/app/app.component.html - 23 - - - src/app/settings/settings.component.html - 67 - - Dark mode toggle label - - - Home - - - src/app/app.component.html - 43 - - Navigation menu Home Page title - - - Login - - - src/app/app.component.html - 44 - - - src/app/components/login/login.component.html - 34 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - - Navigation menu Login Page title - - - Subscriptions - - - src/app/app.component.html - 45 - - Navigation menu Subscriptions Page title - - - Downloads - - - src/app/app.component.html - 46 - - Navigation menu Downloads Page title - - - Settings - - - src/app/app.component.html - 49 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - - - Download for has been queued! - - - src/app/main/main.component.ts - 469 - - - - Only Audio - - - src/app/main/main.component.html - 65,66 - - Only Audio checkbox - - - Download - - - src/app/main/main.component.html - 79,80 - - Main download button - - - Quality - - - src/app/main/main.component.html - 19,20 - - Quality select label - - - Use URL - - - src/app/main/main.component.html - 51 - - YT search Use URL button for searched video - - - View - - - src/app/main/main.component.html - 55,56 - - YT search View button for searched video - - - Autoplay - - - src/app/main/main.component.html - 70,71 - - Autoplay checkbox - - - Cancel - - - src/app/main/main.component.html - 84,85 - - Cancel download button - - - Advanced - - - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Replace args - - - src/app/main/main.component.html - 116,117 - - Replace args - - - Custom args - - - src/app/main/main.component.html - 120 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - - src/app/main/main.component.html - 123,124 - - Custom Args input hint - - - Use custom output - - - src/app/main/main.component.html - 131,132 - - Use custom output checkbox - - - Custom output - - - src/app/main/main.component.html - 135 - - Custom output placeholder - - - Documentation - - - src/app/main/main.component.html - 137 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 - - - src/app/settings/settings.component.html - 117 - - Youtube-dl output template documentation link - - - Path is relative to the config download path. Don't include extension. - - - src/app/main/main.component.html - 138 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint - - - Crop file - - - src/app/main/main.component.html - 160,161 - - Crop video checkbox - - - Simulated command: - - - src/app/main/main.component.html - 102,103 - - Simulated command label - - - Use authentication - - - src/app/main/main.component.html - 145,146 - - Use authentication checkbox - - - Username - - - src/app/main/main.component.html - 149 - - YT Username placeholder - - - Password - - - src/app/main/main.component.html - 154 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 10 - - YT Password placeholder - - - Crop from (seconds) - - - src/app/main/main.component.html - 164 - - Crop from placeholder - - - Crop to (seconds) - - - src/app/main/main.component.html - 169 - - Crop to placeholder - - - Create a playlist - - - src/app/create-playlist/create-playlist.component.html - 1 - - Create a playlist dialog title - - - Name - - - src/app/create-playlist/create-playlist.component.html - 6 - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 5 - - Playlist name placeholder - - - Type - - - src/app/create-playlist/create-playlist.component.html - 11 - - Type select - - - Audio - - - src/app/create-playlist/create-playlist.component.html - 12 - - Audio - - - Video - - - src/app/create-playlist/create-playlist.component.html - 13 - - Video - - - Audio files - - - src/app/create-playlist/create-playlist.component.html - 19 - - Audio files title - - - Videos - - - src/app/create-playlist/create-playlist.component.html - 20 - - - src/app/subscription/subscription/subscription.component.html - 29 - - Videos title - - - Subscribe to playlist or channel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 1 - - Subscribe dialog title - - - URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 8 - - - src/app/settings/settings.component.html - 10 - - Subscription URL input placeholder - - - The playlist or channel URL - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 9 - - Subscription URL input hint - - - Custom name - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 19 - - Subscription custom name placeholder - - - Download all uploads - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/confirm-dialog/confirm-dialog.component.html - 16 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/settings/settings.component.html - 490 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - - - Subscribe - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 - - Subscribe button - - - Download videos uploaded in the last - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - - - Type: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 5 - - Subscription type property - - - URL: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 9 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 9 - - Subscription URL property - - - ID: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 13 - - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - - Subscription ID property - - - Close - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 17 - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 70 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button - - - Export Archive - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 24 - - Export Archive button - - - Unsubscribe - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 26 - - Unsubscribe button - - - (Paused) - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 1 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 34 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix - - - Archive: - - - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 - - Subscription ID property - - - Name: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 6 - - Video name property - - - Uploader: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 13 - - Video ID property - - - File size: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 17 - - Video file size property - - - Path: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 21 - - Video path property - - - Upload Date: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 25 - - Video upload date property - - - Category: - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 29 - - Category property - - - Modify youtube-dl args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 - - Modify args title - - - Simulated new args - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 - - Simulated args title - - - Add an arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 - - Add arg card title - - - Search by category - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 - - Search args by category button - - - Use arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 - - Use arg value checkbox - - - Add arg - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 - - Search args by category button - - - Modify - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 - - Arg modifier modify button - - - Arg value - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 - - Arg value placeholder - - - Updater - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 - - Update progress dialog title - - - Register a user - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 - - Register user dialog title - - - User name - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 - - User name placeholder - - - Register - - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 - - - src/app/components/login/login.component.html - 38 - - Register user button - - - Upload new cookies - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 - - Cookies uploader dialog title - - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 - - Cookies upload warning - - - Drag and Drop - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 - - Drag and Drop - - - Modify playlist - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 - - Modify playlist dialog title - - - Save - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 487 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save - - - Randomize order when playing - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 - - Randomize order when playing checkbox label - - - Add content - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 - - Add content - - - Normal order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 - - Normal order - - - Reverse order  - - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - File type - - - src/app/components/recent-videos/recent-videos.component.html - 52 - - File type - - - Both - - - src/app/components/recent-videos/recent-videos.component.html - 54 - - Both - - - Video only - - - src/app/components/recent-videos/recent-videos.component.html - 55 - - Video only - - - Audio only - - - src/app/components/recent-videos/recent-videos.component.html - 56 - - Audio only - - - No videos found. - - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 43 - - Playlist edit button - - - Delete - - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - - src/app/components/unified-file-card/unified-file-card.component.html - 45 - - Delete playlist - - - Info - - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 40 - - Delete and blacklist video button - - - views - - - src/app/player/player.component.html - 16 - - View count label - - - The download was successful - - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - - src/app/subscriptions/subscriptions.component.html - 30 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 27 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - - src/app/subscriptions/subscriptions.component.html - 36 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - - src/app/subscriptions/subscriptions.component.html - 46 - - No playlist subscriptions text - - - You must enable multi-user mode to access this tab. - - - src/app/settings/settings.component.ts - 48 - - - - Main - - - src/app/settings/settings.component.html - 4 - - Main settings label - - - Downloader - - - src/app/settings/settings.component.html - 94 - - Downloader settings label - - - Extra - - - src/app/settings/settings.component.html - 198 - - Extra settings label - - - Database - - - src/app/settings/settings.component.html - 303 - - Database settings label - - - Advanced - - - src/app/settings/settings.component.html - 339 - - Host settings label - - - Logs - - - src/app/settings/settings.component.html - 476 - - - src/app/settings/settings.component.html - 476 - - Logs settings label - - - URL this app will be accessed from, without the port. - - - src/app/settings/settings.component.html - 11 - - URL setting input hint - - - Port - - - src/app/settings/settings.component.html - 16 - - Port input placeholder - - - The desired port. Default is 17442. - - - src/app/settings/settings.component.html - 17 - - Port setting input hint - - - Multi-user mode - - - src/app/settings/settings.component.html - 26 - - Multi user mode setting - - - Users base path - - - src/app/settings/settings.component.html - 30 - - Users base path placeholder - - - Base path for users and their downloaded videos. - - - src/app/settings/settings.component.html - 31 - - Users base path hint - - - Allow subscriptions - - - src/app/settings/settings.component.html - 40 - - Allow subscriptions setting - - - Subscriptions base path - - - src/app/settings/settings.component.html - 44 - - Subscriptions base path input setting placeholder - - - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 45 - - Subscriptions base path setting input hint - - - Check interval - - - src/app/settings/settings.component.html - 50 - - Check interval input setting placeholder - - - Unit is seconds, only include numbers. - - - src/app/settings/settings.component.html - 51 - - Check interval setting input hint - - - Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads tooltip - - - Redownload fresh uploads - - - src/app/settings/settings.component.html - 55 - - Redownload fresh uploads - - - Theme - - - src/app/settings/settings.component.html - 64 - - Theme select label - - - Default - - - src/app/settings/settings.component.html - 66 - - Default theme label - - - Allow theme change - - - src/app/settings/settings.component.html - 72 - - Allow theme change setting - - - Language - - - src/app/settings/settings.component.html - 81 - - Language select label - - - Audio folder path - - - src/app/settings/settings.component.html - 101 - - Audio folder path input placeholder - - - Path for audio only downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 102 - - Aduio path setting input hint - - - Video folder path - - - src/app/settings/settings.component.html - 108 - - Video folder path input placeholder - - - Path for video downloads. It is relative to YTDL-Material's root folder. - - - src/app/settings/settings.component.html - 109 - - Video path setting input hint - - - Default file output - - - src/app/settings/settings.component.html - 115 - - Default file output placeholder - - - Path is relative to the above download paths. Don't include extension. - - - src/app/settings/settings.component.html - 118 - - Custom Output input hint - - - Global custom args - - - src/app/settings/settings.component.html - 125 - - Custom args input placeholder - - - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - - - src/app/settings/settings.component.html - 126 - - Custom args setting input hint - - - Categories - - - src/app/settings/settings.component.html - 136 - - Categories - - - With this setting enabled, if a single video matches a category, the entire playlist will receive that category. - - - src/app/settings/settings.component.html - 150 - - Allow playlist categorization setting tooltip - - - Allow playlist categorization - - - src/app/settings/settings.component.html - 150 - - Allow playlist categorization setting label - - - Use youtube-dl archive - - - src/app/settings/settings.component.html - 158 - - Use youtubedl archive setting - - - Include thumbnail - - - src/app/settings/settings.component.html - 162 - - Include thumbnail setting - - - Include metadata - - - src/app/settings/settings.component.html - 166 - - Include metadata setting - - - Max concurrent downloads - - - src/app/settings/settings.component.html - 175 - - Max concurrent downloads - - - Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. - - - src/app/settings/settings.component.html - 176 - - Max concurrent downloads input hint - - - Download rate limit - - - src/app/settings/settings.component.html - 181 - - Download rate limit input placeholder - - - Rate limits your downloads to the specified amount. Ex: 200K - - - src/app/settings/settings.component.html - 182 - - Download rate limit input hint - - - Kill all downloads - - - src/app/settings/settings.component.html - 191 - - Kill all downloads button - - - Top title - - - src/app/settings/settings.component.html - 204 - - Top title input placeholder - - - File manager enabled - - - src/app/settings/settings.component.html - 209 - - File manager enabled setting - - - Downloads manager enabled - - - src/app/settings/settings.component.html - 212 - - Downloads manager enabled setting - - - Allow quality select - - - src/app/settings/settings.component.html - 215 - - Allow quality seelct setting - - - Download only mode - - - src/app/settings/settings.component.html - 218 - - Download only mode setting - - - Allow autoplay - - - src/app/settings/settings.component.html - 221 - - Allow autoplay setting - - - Enable Public API - - - src/app/settings/settings.component.html - 229 - - Enable Public API key setting - - - Public API Key - - - src/app/settings/settings.component.html - 234 - - Public API Key setting placeholder - - - View documentation - - - src/app/settings/settings.component.html - 235 - - View API docs setting hint - - - This will delete your old API key! - - - src/app/settings/settings.component.html - 239 - - delete api key tooltip - - - Generate - - - src/app/settings/settings.component.html - 239 - - Generate key button - - - Use YouTube API - - - src/app/settings/settings.component.html - 248 - - Use YouTube API setting - - - Youtube API Key - - - src/app/settings/settings.component.html - 252 - - Youtube API Key setting placeholder - - - Generating a key is easy! - - - src/app/settings/settings.component.html - 253 - - - src/app/settings/settings.component.html - 265 - - Youtube API Key setting hint - - - Use Twitch API - - - src/app/settings/settings.component.html - 257 - - Use Twitch API setting - - - Twitch API Key - - - src/app/settings/settings.component.html - 264 - - Twitch API Key setting placeholder - - - Also known as a Client ID. - - - src/app/settings/settings.component.html - 265 - - Twitch API Key setting hint AKA preamble - - - Enables a button to skip ads when viewing supported videos. - - - src/app/settings/settings.component.html - 269 - - SponsorBlock API tooltip - - - Use SponsorBlock API - - - src/app/settings/settings.component.html - 269 - - Use SponsorBlock API setting - - - Generates NFO files with every download, primarily used by Kodi. - - - src/app/settings/settings.component.html - 272 - - Generate NFO files tooltip - - - Generate NFO files - - - src/app/settings/settings.component.html - 272 - - Generate NFO files setting - - - Auto-download Twitch Chat - - - src/app/settings/settings.component.html - 260 - - Auto download Twitch Chat setting - - - Click here - - - src/app/settings/settings.component.html - 281 - - - src/app/settings/settings.component.html - 287 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - Chrome ext click here - - - to download the official YoutubeDL-Material Chrome extension manually. - - - src/app/settings/settings.component.html - 281 - - Chrome click here suffix - - - You must manually load the extension and modify the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 282 - - Chrome setup suffix - - - to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - - - src/app/settings/settings.component.html - 287 - - Firefox click here suffix - - - Detailed setup instructions. - - - src/app/settings/settings.component.html - 288 - - Firefox setup prefix link - - - Not much is required other than changing the extension's settings to set the frontend URL. - - - src/app/settings/settings.component.html - 288 - - Firefox setup suffix - - - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - - - src/app/settings/settings.component.html - 293 - - Bookmarklet instructions - - - Generate 'audio only' bookmarklet - - - src/app/settings/settings.component.html - 294 - - Generate audio only bookmarklet checkbox - - - Database location: - - - src/app/settings/settings.component.html - 309 - - Database location label - - - Records per table - - - src/app/settings/settings.component.html - 310 - - Records per table label - - - MongoDB Connection String - - - src/app/settings/settings.component.html - 318 - - MongoDB Connection String - - - Example: - - - src/app/settings/settings.component.html - 319 - - MongoDB Connection String setting hint AKA preamble - - - Test connection string - - - src/app/settings/settings.component.html - 323 - - Test connection string button - - - Transfer DB to - - - src/app/settings/settings.component.html - 327 - - Transfer DB button - - - Database information could not be retrieved. Check the server logs for more information. - - - src/app/settings/settings.component.html - 331 - - Database info not retrieved error message - - - Select a downloader - - - src/app/settings/settings.component.html - 345 - - Default downloader select label - - - Use default downloading agent - - - src/app/settings/settings.component.html - 354 - - Use default downloading agent setting - - - Select a download agent - - - src/app/settings/settings.component.html - 358 - - Custom downloader select label - - - Log Level - - - src/app/settings/settings.component.html - 372 - - Log Level label - - - Login expiration - - - src/app/settings/settings.component.html - 384 - - Login expiration select label - - - Allow advanced download - - - src/app/settings/settings.component.html - 395 - - Allow advanced downloading setting - - - Use Cookies - - - src/app/settings/settings.component.html - 403 - - Use cookies setting - - - Set Cookies - - - src/app/settings/settings.component.html - 404 - - Set cookies button - - - Restart server - - - src/app/settings/settings.component.html - 416 - - Restart server button - - - Users - - - src/app/settings/settings.component.html - 425 - - Users settings label - - - Allow user registration - - - src/app/settings/settings.component.html - 431 - - Allow registration setting - - - Auth method - - - src/app/settings/settings.component.html - 435 - - Auth method select - - - Internal - - - src/app/settings/settings.component.html - 437 - - Internal auth method - - - LDAP - - - src/app/settings/settings.component.html - 440 - - LDAP auth method - - - LDAP URL - - - src/app/settings/settings.component.html - 447 - - LDAP URL - - - Bind DN - - - src/app/settings/settings.component.html - 452 - - Bind DN - - - Bind Credentials - - - src/app/settings/settings.component.html - 457 - - Bind Credentials - - - Search Base - - - src/app/settings/settings.component.html - 462 - - Search Base - - - Search Filter - - - src/app/settings/settings.component.html - 467 - - Search Filter - - - About YoutubeDL-Material - - - src/app/dialogs/about-dialog/about-dialog.component.html - 1 - - About dialog title - - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 12 - - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Installation type: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Installation type - - - Commit hash: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 31 - - Commit hash - - - Build date: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 33 - - Build date - - - Found a bug or have a suggestion? - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug prefix - - - to create an issue! - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug suffix - - - Checking for updates... - - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Docker tag: - - - src/app/dialogs/about-dialog/about-dialog.component.html - 28 - - Docker tag - - - Select a version: - - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Creating download - - - src/app/components/downloads/downloads.component.ts - 58 - - - - Getting info - - - src/app/components/downloads/downloads.component.ts - 59 - - - - Downloading file - - - src/app/components/downloads/downloads.component.ts - 60 - - - - Complete - - - src/app/components/downloads/downloads.component.ts - 61 - - - - Clear finished downloads - - - src/app/components/downloads/downloads.component.ts - 129 - - - - Would you like to clear your finished downloads? - - - src/app/components/downloads/downloads.component.ts - 130 - - - - Clear - - - src/app/components/downloads/downloads.component.ts - 131 - - - - Error for - - - src/app/components/downloads/downloads.component.ts - 238 - - - - Copy to clipboard - - - src/app/components/downloads/downloads.component.ts - 240 - - - - Close - - - src/app/components/downloads/downloads.component.ts - 241 - - - - Copied to clipboard! - - - src/app/components/downloads/downloads.component.ts - 249 - - - - Date - - - src/app/components/downloads/downloads.component.html - 7 - - Date - - - Title - - - src/app/components/downloads/downloads.component.html - 13 - - Title - - - Subscription - - - src/app/components/downloads/downloads.component.html - 23 - - Subscription - - - Stage - - - src/app/components/downloads/downloads.component.html - 36 - - Stage - - - Progress - - - src/app/components/downloads/downloads.component.html - 42 - - Progress - - - Actions - - - src/app/components/downloads/downloads.component.html - 55 - - Actions - - - Clear - - - src/app/components/downloads/downloads.component.html - 68 - - - src/app/components/downloads/downloads.component.html - 68 - - Clear - - - Pause - - - src/app/components/downloads/downloads.component.html - 59 - - - src/app/components/downloads/downloads.component.html - 59 - - Pause - - - Resume - - - src/app/components/downloads/downloads.component.html - 60 - - - src/app/components/downloads/downloads.component.html - 60 - - Resume - - - Watch content - - - src/app/components/downloads/downloads.component.html - 64 - - - src/app/components/downloads/downloads.component.html - 64 - - Watch content - - - Show error - - - src/app/components/downloads/downloads.component.html - 65 - - - src/app/components/downloads/downloads.component.html - 65 - - Show error - - - Restart - - - src/app/components/downloads/downloads.component.html - 66 - - Restart - - - Pause all downloads - - - src/app/components/downloads/downloads.component.html - 83 - - Pause all downloads - - - Resume all downloads - - - src/app/components/downloads/downloads.component.html - 84 - - Resume all downloads - - - Clear finished downloads - - - src/app/components/downloads/downloads.component.html - 85 - - Clear finished downloads - - - No downloads available! - - - src/app/components/downloads/downloads.component.html - 90 - - No downloads label - - - Your Profile - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Add to playlist - - - src/app/components/unified-file-card/unified-file-card.component.html - 26 - - Add to playlist menu item - - - Delete and redownload - - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Skip ad - - - src/app/components/skip-ad-button/skip-ad-button.component.html - 1 - - Skip ad button - - - Length: - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 3 - - Video duration label - - - - From 7bfb441a0040c22b6990fad7fc91250b5e11611b Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Mon, 2 May 2022 01:44:43 -0400 Subject: [PATCH 45/81] Fixed bug where files couldn't be deleted with archive mode enabled fixes #487 --- backend/db.js | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/db.js b/backend/db.js index 7cab07d..64d2a64 100644 --- a/backend/db.js +++ b/backend/db.js @@ -497,6 +497,7 @@ exports.deleteFile = async (uid, uuid = null, blacklistMode = false) => { let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { + const usersFileFolder = config_api.getConfigItem('ytdl_users_base_path'); const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`); // get ID from JSON From b3342d89c1d344f9a3da6e7f856fb9bd5df4c51f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Mon, 2 May 2022 01:46:25 -0400 Subject: [PATCH 46/81] Fixed #563 where empty languages existed in language select --- src/app/settings/locales_list.ts | 2 +- src/assets/i18n/messages.nb.json | 222 ------------------------------- src/postbuild.mjs | 13 +- 3 files changed, 13 insertions(+), 224 deletions(-) delete mode 100644 src/assets/i18n/messages.nb.json diff --git a/src/app/settings/locales_list.ts b/src/app/settings/locales_list.ts index 9235937..7d5687a 100644 --- a/src/app/settings/locales_list.ts +++ b/src/app/settings/locales_list.ts @@ -445,7 +445,7 @@ export const isoLangs = { 'name': 'Navajo, Navaho', 'nativeName': 'Diné bizaad, Dinékʼehǰí' }, - 'nb': { + 'nb-NO': { 'name': 'Norwegian Bokmål', 'nativeName': 'Norsk bokmål', 'ngID': 'nb' diff --git a/src/assets/i18n/messages.nb.json b/src/assets/i18n/messages.nb.json deleted file mode 100644 index 120f171..0000000 --- a/src/assets/i18n/messages.nb.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Opprett en spilleliste", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Navn", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Lyd", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Lydfiler", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videoer", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Endre youtube-dl-argumenter", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulerte nye argumenter", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Legg til argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Søk etter kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Bruk argument-verdi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-verdi", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Legg til argument", - "d7b35c384aecd25a516200d6921836374613dfe7": "Avbryt", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Endre", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalitet", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Bruk nettadresse", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Vis", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Kun lyd", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-nedlastingsmodus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Last ned", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Avbryt", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avansert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulert kommando:", - "4e4c721129466be9c3862294dc40241b64045998": "Bruk egendefinerte argumenter:", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Egendefinerte argumenter", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter skilles ved bruk av to komma, slik: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Bruk defendefinert utdata", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Egendefinert utdata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasjon", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Sti er relativ til oppsettsnedlastingsstien. Ikke inkluder utvidelse.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Bruk identitetsbekreftelse", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Brukernavn", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passord", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Navn:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Nettadresse:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Opplaster:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Filstørrelse:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Sti:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Opplastingsdato:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Lukk", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Endre spilleliste", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Legg til mer innhold", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Lagre", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Antall:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Rediger", - "826b25211922a1b46436589233cb6f1a163d89b7": "Slett", - "321e4419a943044e674beb55b8039f42a9761ca5": "Info", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Slett og svartelist", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Last opp nye kaker", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Dra og slipp", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Merk: Oppasting av nye kaker overskriver tidligere. Merk deg også at kaker gjelder for hele instansen, ikke per bruker.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Innstillinger", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Nettadresse", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "Nettadressen dette programmet nås fra, uten porten.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Ønsket port. Forvalet er 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-brukermodus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Bruker-basissti", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basissti for brukere og deres nedlastede videoer.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Tillat abonnementer", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements-basissti", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basissti for videoer fra dine abonnementskanaler og spillelister. Den er relativ til YTDL-Material sin rotmappe.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Sjekkintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "I sekunder, kun tall.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Drakt", - "ff7cee38a2259526c519f878e71b964f41db4348": "Forvalg", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Mørk", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Tillat draktendring", - "fe46ccaae902ce974e2441abe752399288298619": "Språk", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Generelt", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Lydmappe", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Sti for lydbaserte nedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomappe", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Sti for videonedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Egendefinerte argumenter for nedlastninger på hjemmesiden for hele programmet. Argumenter skilles med to komma, slik: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Bruk youtube-dl-arktivet", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inkluder miniatyrbilde", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inkluder metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Drep alle nedlastinger", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Nedlaster", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Topptittel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Filbehandler påskrudd", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Nedlastingsbehandler påskrudd", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Tillat kvalitetsvalg", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modus kun for nedlasting", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Tillat multi-nedlastingsmodus", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Skru på offentlig API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Offentlig API-nøkkel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Vis dokumentasjon", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generer", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dette vil slette din gamle API-nøkkel!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Bruk YouTube-API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-API-nøkkel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Å generere en nøkkel er lett!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikk her", - "7f09776373995003161235c0c8d02b7f91dbc4df": "for å laste ned den offisielle Chrome-utvidelsen for YouTubeDL-Material selv.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Du må manuelt laste ned utvidelsen og endre dens innstillinger for å sette skjermflate-nettadresse.", - "9a2ec6da48771128384887525bdcac992632c863": "for å installere den offisielle Firefox-utvidelsen for YouTubeDL-Material rett fra Firefox sin utvidelsesside.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaljert oppsettsinstruks", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Ikke mye kreves annet enn å endre utvidelses innstillinger for å sette skjermflate-nettadresse.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Dra lenken nedenfor til bokmerker. Naviger til YouTube-videoen du ønsker å laste ned og klikk på bokmerket.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genrer \"kun lyd\"-bookmerke", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Bruk forvalgt nedlastingsagent", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Velg en nedlaster", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Loggingsnivå", - "db6c192032f4cab809aad35215f0aa4765761897": "Innloggingsutløp", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Tillat avansert nedlasting", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Bruk kaker", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Sett kaker", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avansert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Tillat brukerregistrering", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentiseringsmetode", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-nettadresse", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "BIND-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "BIND-identitetsdetaljer", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Søkebase", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Søkefilter", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Brukere", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logger", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Om YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "er en fri YouTube-nedlaster bygd i henhold til Google sine Materielle spesifikasjoner. Du kan sømløst laste ned dine favorittvideoer som video- eller lydfiler, og tilogmed abonnere på dine favorittkanaler og spillelister for å holde deg oppdatert med nye videoer.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "har noen flotte funksjoner inkludert. Et vidtfavnende API, Docker-støtte, og lokalisering (oversettelser)-støtte. Les om alle støttede funksjoner ved å klikke på GitHub-ikonet ovenfor.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installert versjon:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Ser etter oppdateringer …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Oppdatering tilgjengelig", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Du kan oppdatere fra innstillingsmenyen.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Funnet en feil eller har et forslag å komme med?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "for å opprette en feilrapport.", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Din profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Opprettet:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Du er ikke innlogget.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Logg inn", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Logg ut", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Opprett administratorkonto", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Fant ingen administratorkonto. Dette vil opprette og sette passord for en slik konto med brukernavn som «admin».", - "70a67e04629f6d412db0a12d51820b480788d795": "Opprett", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Om", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Hjem", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementer", - "822fab38216f64e8166d368b59fe756ca39d301b": "Nedlastinger", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Del spilleliste", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Del video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Del lyd", - "1f6d14a780a37a97899dc611881e6bc971268285": "Skru på deling", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Bruk tidsstempel", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunder", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopier til utklippstavle", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Lagre endringer", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Nedlastet", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "En feil inntraff", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detaljer", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "En feil har inntruffet:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Nedlastingsstart:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Nedlastingsslutt:", - "ad127117f9471612f47d01eae09709da444a36a4": "Filsti(er):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonner på en spilleliste eller kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Spilleliste- eller kanal-nettadressen", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Egendefinert navn", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Last ned alle opplastinger", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Last ned videoer oppdatert siste", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Kun lyd-modus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Kun strømming-modus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Disse legges til etter standard-argumentene.", - "98b6ec9ec138186d663e64770267b67334353d63": "Egendefinert filutdata", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arkiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Eksporter arkiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Opphev abonnement", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Dine abonnementer", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanaler", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Navn ikke tilgjengelig. Henter kanal …", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Du har ingen kanalabonnementer.", - "47546e45bbb476baaaad38244db444c427ddc502": "Spillelister", - "2e0a410652cb07d069f576b61eab32586a18320d": "Navn ikke tilgjengelig. Henter spilleliste …", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Du har ingen spillelisteabonnement.", - "3697f8583ea42868aa269489ad366103d94aece7": "Redigering", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Søk", - "2054791b822475aeaea95c0119113de3200f5e1c": "Lengde:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Slett og last ned igjen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Slett for alltid", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Oppdaterer", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Velg en versjon:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Regustrer", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Økt-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(nåværende)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Tøm alle nedlastinger", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Ingen nedlastninger tilgjengelige!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrer en bruker", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Brukernavn", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Håndter bruker", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Bruker-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nytt passord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Sett nytt passord", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Bruk rolle-forvalg", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nei", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Håndter rolle", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Brukernavn", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Handlinger", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Rediger bruker", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Slett bruker", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Legg til brukere", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rediger rolle", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linjer:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Tøm logger", - "ccf5ea825526ac490974336cb5c24352886abc07": "Åpne fil", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Åpne fil i ny fane", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Gå til abonnement", - "d02888c485d3aeab6de628508f4a00312a722894": "Mine videoer" -} \ No newline at end of file diff --git a/src/postbuild.mjs b/src/postbuild.mjs index ff20b87..8bc6d71 100644 --- a/src/postbuild.mjs +++ b/src/postbuild.mjs @@ -33,7 +33,18 @@ async function createLocalizationJSON() { for (let i = 0; i < files.length; i++) { const file = path.basename(files[i]); const file_parts = file.split('.'); - locales.push(file_parts[1]); + if (file_parts.length !== 3 || file_parts[1] === 'en') continue; + try { + const locale_json = fs.readJSONSync(files[i]); + const locale_json_keys = Object.keys(locale_json); + let has_defined_keys = false; + for (let i = 0; i < locale_json_keys.length; i++) { + if (locale_json[locale_json_keys[i]] !== '') has_defined_keys = true; + } + if (has_defined_keys) locales.push(file_parts[1]); + } catch (err) { + console.error(err); + } } fs.unlinkSync('src/assets/i18n/messages.en.json'); From 93ce498e94ca56d7007b1af15fb08b2f796b1368 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 08:20:48 +0200 Subject: [PATCH 47/81] switch to ubuntu 21.10 as we wait for nodesource --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3b8ec2c..24ac0d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM ubuntu:20.04 AS ffmpeg +FROM ubuntu:21.10 AS ffmpeg ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh -FROM ubuntu:20.04 as frontend +FROM ubuntu:21.10 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ @@ -31,7 +31,7 @@ RUN npm run build #--------------# -FROM ubuntu:20.04 +FROM ubuntu:21.10 ENV UID=1000 \ GID=1000 \ From 4d4bc765491589b54363543533a0414d781afbf9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 12:59:34 +0200 Subject: [PATCH 48/81] Use Ubuntu 22.04, use nodejs from ubuntu repo --- Dockerfile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24ac0d0..24b7185 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,25 @@ -FROM ubuntu:21.10 AS ffmpeg +FROM ubuntu:22.04 AS ffmpeg ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh -FROM ubuntu:21.10 as frontend +FROM ubuntu:22.04 as frontend ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get -y install \ curl \ - gnupg && \ - curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ - apt-get -y install \ + gnupg \ + # Ubuntu 22.04 ships Node.JS 12 by default :) nodejs \ # YARN: brings along npm, solves dependency conflicts, # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 yarn && \ apt-get install -f && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ npm config set strict-ssl false && \ npm install -g @angular/cli @@ -31,7 +33,7 @@ RUN npm run build #--------------# -FROM ubuntu:21.10 +FROM ubuntu:22.04 ENV UID=1000 \ GID=1000 \ @@ -42,7 +44,6 @@ ENV DEBIAN_FRONTEND=noninteractive RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get update && apt-get -y install \ npm \ python2 \ From 9f740020af9611bd6e98d260492afc04c284cd6f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 13:14:57 +0200 Subject: [PATCH 49/81] possible fix --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24b7185..038a57d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,9 +13,9 @@ RUN apt-get update && apt-get -y install \ gnupg \ # Ubuntu 22.04 ships Node.JS 12 by default :) nodejs \ - # YARN: brings along npm, solves dependency conflicts, + # needed on 21.10 and before, maybe not on 22.04 YARN: brings along npm, solves dependency conflicts, # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 - yarn && \ + npm && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 44c1a34c67eee21cfb8b19e432caa9382f754e77 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Mon, 2 May 2022 13:33:20 +0200 Subject: [PATCH 50/81] Permissions fix for ffmpeg executable --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 038a57d..6fb263b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ FROM ubuntu:22.04 AS ffmpeg -ENV DEBIAN_FRONTEND=noninteractive +ENV UID=1000 \ + GID=1000 \ + USER=youtube \ + DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh From c33e8010b38fb62bec41217c8d695dda8c677ca2 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 3 May 2022 00:34:36 -0400 Subject: [PATCH 51/81] Additional args now replace existing ones intelligently --- backend/consts.js | 79 +++++++++++++++++++++++++++++++++++++++++++ backend/downloader.js | 2 +- backend/test/tests.js | 7 ++++ backend/utils.js | 33 ++++++++++++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/backend/consts.js b/backend/consts.js index 849fa4c..9bd2905 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -222,4 +222,83 @@ exports.AVAILABLE_PERMISSIONS = [ exports.DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details' +// args that have a value after it (e.g. -o or -f ) +const YTDL_ARGS_WITH_VALUES = [ + '--default-search', + '--config-location', + '--proxy', + '--socket-timeout', + '--source-address', + '--geo-verification-proxy', + '--geo-bypass-country', + '--geo-bypass-ip-block', + '--playlist-start', + '--playlist-end', + '--playlist-items', + '--match-title', + '--reject-title', + '--max-downloads', + '--min-filesize', + '--max-filesize', + '--date', + '--datebefore', + '--dateafter', + '--min-views', + '--max-views', + '--match-filter', + '--age-limit', + '--download-archive', + '-r', + '--limit-rate', + '-R', + '--retries', + '--fragment-retries', + '--buffer-size', + '--http-chunk-size', + '--external-downloader', + '--external-downloader-args', + '-a', + '--batch-file', + '-o', + '--output', + '--output-na-placeholder', + '--autonumber-start', + '--load-info-json', + '--cookies', + '--cache-dir', + '--encoding', + '--user-agent', + '--referer', + '--add-header', + '--sleep-interval', + '--max-sleep-interval', + '-f', + '--format', + '--merge-output-format', + '--sub-format', + '--sub-lang', + '-u', + '--username', + '-p', + '--password', + '-2', + '--twofactor', + '--video-password', + '--ap-mso', + '--ap-username', + '--ap-password', + '--audio-format', + '--audio-quality', + '--recode-video', + '--postprocessor-args', + '--metadata-from-title', + '--fixup', + '--ffmpeg-location', + '--exec', + '--convert-subs' +]; + +// we're using a Set here for performance +exports.YTDL_ARGS_WITH_VALUES = new Set(YTDL_ARGS_WITH_VALUES); + exports.CURRENT_VERSION = 'v4.2'; diff --git a/backend/downloader.js b/backend/downloader.js index 108501b..99ed686 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -485,7 +485,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f } if (options.additionalArgs && options.additionalArgs !== '') { - downloadConfig = downloadConfig.concat(options.additionalArgs.split(',,')); + downloadConfig = utils.injectArgs(downloadConfig, options.additionalArgs.split(',,')); } const rate_limit = config_api.getConfigItem('ytdl_download_rate_limit'); diff --git a/backend/test/tests.js b/backend/test/tests.js index 9ae95a8..ec18dd5 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -386,6 +386,13 @@ describe('Downloader', function() { assert(fs.existsSync(nfo_file_path), true); fs.unlinkSync(nfo_file_path); }); + + it('Inject args', async function() { + const original_args = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; + const new_args = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + const updated_args = utils.injectArgs(original_args, new_args); + assert(updated_args, ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']); + }); }); describe('Tasks', function() { diff --git a/backend/utils.js b/backend/utils.js index a6eaf7e..b456659 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -415,6 +415,38 @@ async function fetchFile(url, path, file_label) { }); } +// adds or replaces args according to the following rules: +// - if it already exists and has value, then replace both arg and value +// - if already exists and doesn't have value, ignore +// - if it doesn't exist and has value, add both arg and value +// - if it doesn't exist and doesn't have value, add arg +function injectArgs(original_args, new_args) { + try { + for (let i = 0; i < new_args.length; i++) { + const new_arg = new_args[i]; + if (!new_arg.startsWith('-') && !new_arg.startsWith('--')) continue; + + if (CONSTS.YTDL_ARGS_WITH_VALUES.has(new_arg)) { + if (original_args.includes(new_arg)) { + const original_index = original_args.indexOf(new_arg); + original_args.splice(original_index, 2); + } + + original_args.push(new_arg, new_args[i + 1]); + } else { + if (!original_args.includes(new_arg)) { + original_args.push(new_arg); + } + } + } + } catch (err) { + logger.warn(err); + logger.warn(`Failed to inject args (${new_args}) into (${original_args})`); + } + + return original_args; +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -458,5 +490,6 @@ module.exports = { wait: wait, checkExistsWithTimeout: checkExistsWithTimeout, fetchFile: fetchFile, + injectArgs: injectArgs, File: File } From ec1ccf6888fd8ffec51ac2ae6614a8441e366392 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Tue, 3 May 2022 00:35:02 -0400 Subject: [PATCH 52/81] Fixed bug that incorrectly told the UI that DB transfer failed --- backend/db.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/db.js b/backend/db.js index 64d2a64..17c2e5a 100644 --- a/backend/db.js +++ b/backend/db.js @@ -85,8 +85,6 @@ exports.initialize = (input_db, input_users_db) => { } exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => { - using_local_db = config_api.getConfigItem('ytdl_use_local_db'); // verify - if (using_local_db && !custom_connection_string) return; const success = await exports._connectToDB(custom_connection_string); if (success) return true; From 8e4a3119ab0ebc1cff470bcd663ca8b6d69c3e43 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:25:38 +0200 Subject: [PATCH 53/81] =?UTF-8?q?=F0=9F=9A=80=20bye=20unnecessary=20build?= =?UTF-8?q?=20cleanups=20(not=20last=20stage)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6fb263b..343dba0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,9 +20,6 @@ RUN apt-get update && apt-get -y install \ # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 npm && \ apt-get install -f && \ - apt-get autoremove --purge && \ - apt-get autoremove && \ - apt-get clean && \ npm config set strict-ssl false && \ npm install -g @angular/cli From 06ca9cbe76af1deecc4f51679b834f4a9405d636 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:26:37 +0200 Subject: [PATCH 54/81] build excludes: now matches ANY *.md :) --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 165b51b..6cd9cc6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,9 +8,9 @@ on: - '.vscode/**' - 'chrome-extension/**' - 'releases/**' + - '**/**.md' - '**.crx' - '**.pem' - - '**.md' - '.dockerignore' - '.gitignore' From 849c1927d336aac0a89d542861002823c01650dd Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:27:42 +0200 Subject: [PATCH 55/81] Add fix script for interactive permission fixing. --- fix-scripts/001 - fix_download_permissions.sh | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 fix-scripts/001 - fix_download_permissions.sh diff --git a/fix-scripts/001 - fix_download_permissions.sh b/fix-scripts/001 - fix_download_permissions.sh new file mode 100644 index 0000000..6f7bad1 --- /dev/null +++ b/fix-scripts/001 - fix_download_permissions.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M +# Date: 2022-05-03 + +# If you want to run this script on a bare-metal installation instead of within Docker +# make sure that the paths configured below match your paths! (it's wise to use the full paths) + +# User defines / Docker env defaults +PATH_SUBS=/app/subscriptions +PATH_AUDIO=/app/audio +PATH_VIDS=/app/video + +echo "\n" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." +echo "This script will set YTDL-M's download paths' owner to ${USER} (${UID}:${GID})" +echo "and permissions to the default of 644." +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "\n" + +# check whether dirs exist +i=0 +[ -d $PATH_SUBS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Subscriptions directory at ${PATH_SUBS}" +[ -d $PATH_AUDIO ] && i=$((i+1)) && echo "✔ (${i}/3) Found Audio directory at ${PATH_AUDIO}" +[ -d $PATH_VIDS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Video directory at ${PATH_VIDS}" + +# Ask to proceed or cancel, exit on missing paths +case $i in + 0) + echo "\nCouldn't find any download path to fix permissions for! \nPlease edit this script to configure!" + exit 2;; + 3) + echo "\nFound all download paths to fix permissions for. \nProceed? (Y/N)";; + *) + echo "\nOnly found ${i} out of 3 download paths! Something about this script's config must be wrong. \nProceed anyways? (Y/N)";; +esac +old_stty_cfg=$(stty -g) +stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty +if echo "$answer" | grep -iq "^y" ;then + echo "\n Running jobs now... (this may take a while)\n" + [ -d $PATH_SUBS ] && chown "$UID:$GID" -R $PATH_SUBS && echo "✔ Set owner of ${PATH_SUBS} to ${USER}." + [ -d $PATH_SUBS ] && chmod 644 -R $PATH_SUBS && echo "✔ Set permissions of ${PATH_SUBS} to 644." + [ -d $PATH_AUDIO ] && chown "$UID:$GID" -R $PATH_AUDIO && echo "✔ Set owner of ${PATH_AUDIO} to ${USER}." + [ -d $PATH_AUDIO ] && chmod 644 -R $PATH_AUDIO && echo "✔ Set permissions of ${PATH_AUDIO} to 644." + [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." + [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." + echo "\n✔ Done." + exit +else + echo "\nOkay, bye." +fi From 713a97f75ab92f29dedc8954b353d4af8551cf88 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 08:44:55 +0200 Subject: [PATCH 56/81] reintegrate suexec --- Dockerfile | 2 +- backend/entrypoint.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 343dba0..26f1d76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,5 +68,5 @@ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/ COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 -# ENTRYPOINT [ "/app/entrypoint.sh" ] +ENTRYPOINT [ "/app/entrypoint.sh" ] CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 5074353..e563fb9 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -11,7 +11,7 @@ fi # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec su-exec "$UID:$GID" "$0" "$@" + exec /usr/lib/apache2/suexec-custom "$UID:$GID" "$0" "$@" fi exec "$@" From d0f5518d31e84ce571c8668719599277e87038c2 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Tue, 3 May 2022 09:44:43 +0200 Subject: [PATCH 57/81] suexec needs to be installed --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 26f1d76..fedfe72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,8 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - atomicparsley && \ + atomicparsley \ + apache2-suexec-custom && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 726824269179993f6958eeade42de229a6e06c03 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 2 May 2022 05:26:43 +0000 Subject: [PATCH 58/81] Translated using Weblate (Chinese (Simplified)) Currently translated at 83.7% (253 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/zh_Hans/ --- src/assets/i18n/messages.zh.xlf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/i18n/messages.zh.xlf b/src/assets/i18n/messages.zh.xlf index 7de9a79..be003db 100644 --- a/src/assets/i18n/messages.zh.xlf +++ b/src/assets/i18n/messages.zh.xlf @@ -1,4 +1,4 @@ - + @@ -902,8 +902,8 @@ Video path setting input hint - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - 开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + 开始页面上用于下载的全局自定义参数。(单独为每个订阅设置订阅参数!) 参数由两个逗号分隔:,, app/settings/settings.component.html 146 From c5eacbb70ccb77e5729c7f13b06ce732e2dae6c1 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Mon, 2 May 2022 09:24:13 +0000 Subject: [PATCH 59/81] Translated using Weblate (Dutch) Currently translated at 100.0% (302 of 302 strings) Translation: YoutubeDL-Material/ytdl-material Translate-URL: https://hosted.weblate.org/projects/youtubedl-material/ytdl-material/nl/ --- src/assets/i18n/messages.nl.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 3d6b59f..03cb155 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -1545,8 +1545,8 @@ Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + Algemene aanvullende opties voor downloads op de overzichtspagina. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,, src/app/settings/settings.component.html 134 From 8cc5c4f733dcf6195af6415e62a752d6e5185f0c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 10:16:49 +0200 Subject: [PATCH 60/81] no need for suexec anymore apparently --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index fedfe72..26f1d76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,8 +48,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - atomicparsley \ - apache2-suexec-custom && \ + atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ apt-get autoremove && \ From 7aca8ab060fb954ca65138feda466b1bfb485eaa Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 10:18:06 +0200 Subject: [PATCH 61/81] entrypoint updated for su --- backend/entrypoint.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index e563fb9..b804e66 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -3,15 +3,10 @@ set -eu CMD="pm2-runtime pm2.config.js" -# if the first arg starts with "-" pass it to program -if [ "${1#-}" != "$1" ]; then - set -- "$CMD" "$@" -fi - # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec /usr/lib/apache2/suexec-custom "$UID:$GID" "$0" "$@" + su -c "$0" "$(id -un $UID)" "$@" fi exec "$@" From 6a56b5b065cf7a205e61e6f566a2880ecfdc248c Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 11:59:45 +0200 Subject: [PATCH 62/81] add fix-scripts to docker image --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 26f1d76..2977041 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,6 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] +COPY --chown=$UID:$GID [ "/fix-scripts/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 8336d886e98bbe72ca5a2e5bb806bd24e8a6b78e Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 12:16:58 +0200 Subject: [PATCH 63/81] fix-scripts need to be owned and run by root --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2977041..5cb2ac6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID [ "/fix-scripts/", "/app/" ] +COPY --chown=root:root [ "/fix-scripts/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From a54f07e93a34ebf0e6939c278f5c4fff39f8d4bf Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 12:19:05 +0200 Subject: [PATCH 64/81] remove white spaces from script & add usage instr. --- ...download_permissions.sh => 001-fix_download_permissions.sh} | 3 +++ 1 file changed, 3 insertions(+) rename fix-scripts/{001 - fix_download_permissions.sh => 001-fix_download_permissions.sh} (95%) diff --git a/fix-scripts/001 - fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh similarity index 95% rename from fix-scripts/001 - fix_download_permissions.sh rename to fix-scripts/001-fix_download_permissions.sh index 6f7bad1..c64ab05 100644 --- a/fix-scripts/001 - fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -5,6 +5,9 @@ # If you want to run this script on a bare-metal installation instead of within Docker # make sure that the paths configured below match your paths! (it's wise to use the full paths) +# USAGE: within your container's bash shell: +# su root +# ./fix-scripts/001-fix_download_permissions.sh # User defines / Docker env defaults PATH_SUBS=/app/subscriptions From e290dc0a25cc4f24e0599acc44fec7f4604363af Mon Sep 17 00:00:00 2001 From: Glassed Silver Date: Wed, 4 May 2022 15:11:35 +0200 Subject: [PATCH 65/81] Fixing permissions of ffmpeg and ffprobe Since we didn't specify UID and GID in copy command before, they were run as root causing permissions conflicts The ffmpeg stage doesn't need the env variables henceforth --- Dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5cb2ac6..769f72d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,12 @@ FROM ubuntu:22.04 AS ffmpeg -ENV UID=1000 \ - GID=1000 \ - USER=youtube \ - DEBIAN_FRONTEND=noninteractive +ENV DEBIAN_FRONTEND=noninteractive COPY docker-build.sh . RUN sh ./docker-build.sh +#--------------# Stage 2 + FROM ubuntu:22.04 as frontend ENV DEBIAN_FRONTEND=noninteractive @@ -31,7 +30,7 @@ COPY [ "angular.json", "tsconfig.json", "/build/" ] COPY [ "src/", "/build/src/" ] RUN npm run build -#--------------# +#--------------# Final Stage FROM ubuntu:22.04 @@ -56,8 +55,8 @@ RUN apt-get update && apt-get -y install \ rm -rf /var/lib/apt WORKDIR /app -COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg -COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffmpeg", "/usr/local/bin/ffmpeg" ] +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffprobe", "/usr/local/bin/ffprobe" ] COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] ENV PM2_HOME=/app/pm2 RUN npm config set strict-ssl false && \ From 5b919b2b189e435fe6e5896e5f78fbf72bb8d053 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 16:55:22 +0200 Subject: [PATCH 66/81] Fix scripts folder: copy content AND parent folder --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5cb2ac6..c8fd040 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=root:root [ "/fix-scripts/", "/app/" ] +COPY --chown=root:root [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 84d33b0f8227aba87788a50fcae6fdd963693c20 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:21:06 +0200 Subject: [PATCH 67/81] fix missing execution permission for fix scripts --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 05a5bed..3869435 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=root:root [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID --chmod=+x [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From a94b8f376e7a8b3242826fd9f99f44105e4cab86 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:22:21 +0200 Subject: [PATCH 68/81] permission needs to be set with octal notation --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3869435..bbb424e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID --chmod=+x [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID --chmod=755 [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 7c31a104981bd7d873d6ac96e734bf46ee75def5 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 17:23:04 +0200 Subject: [PATCH 69/81] ux/guidance improvements --- fix-scripts/001-fix_download_permissions.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fix-scripts/001-fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh index c64ab05..45a96aa 100644 --- a/fix-scripts/001-fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -14,6 +14,7 @@ PATH_SUBS=/app/subscriptions PATH_AUDIO=/app/audio PATH_VIDS=/app/video +clear -x echo "\n" printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." @@ -49,6 +50,8 @@ if echo "$answer" | grep -iq "^y" ;then [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." echo "\n✔ Done." + echo "\n If you noticed file access errors those MAY be due to currently running downloads." + echo " Feel free to re-run this script, however download parts should have correct file permissions anyhow. :)" exit else echo "\nOkay, bye." From 336d7a09bddac5c13b57bdc4d3afed69ffb3d029 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 18:31:28 +0200 Subject: [PATCH 70/81] set fix-scripts folder permissions more reliably --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index bbb424e..6922d0b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,7 +65,8 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID --chmod=755 [ "/fix-scripts", "/app/" ] +COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] +RUN chmod -R +x /app/fix-scripts EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 31b4fcb9fcf32204d85aea0636e52bb62b887af6 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 19:58:00 +0200 Subject: [PATCH 71/81] We're now using gosu to switch our user down :) --- Dockerfile | 1 + backend/entrypoint.sh | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6922d0b..a6f2838 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,6 +47,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ + gosu &\ atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index b804e66..59ffdb6 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -3,10 +3,15 @@ set -eu CMD="pm2-runtime pm2.config.js" +# if the first arg starts with "-" pass it to program +if [ "${1#-}" != "$1" ]; then + set -- "$CMD" "$@" +fi + # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - su -c "$0" "$(id -un $UID)" "$@" + exec gosu "$UID:$GID" "$0" "$@" fi exec "$@" From acca2d0de2470d48f631ea49f03c02b89e9982c9 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:19:52 +0200 Subject: [PATCH 72/81] syntax devil struck again --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a6f2838..2420d4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,7 +47,7 @@ RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - gosu &\ + gosu \ atomicparsley && \ apt-get install -f && \ apt-get autoremove --purge && \ @@ -67,7 +67,7 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] -RUN chmod -R +x /app/fix-scripts +RUN chmod -R 755 /app/fix-scripts/ EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From ce3e6451294be3a7ac4a62e5b3a594f634f1148b Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:54:21 +0200 Subject: [PATCH 73/81] for now: user has to DIY chmod +x fix-scripts --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2420d4b..1dddfde 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,7 +67,6 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] -RUN chmod -R 755 /app/fix-scripts/ EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] From 17fdd0d788b10b2ae6ab41bced01b5615494f932 Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 20:57:13 +0200 Subject: [PATCH 74/81] update usage instr. for fix-script in comment --- fix-scripts/001-fix_download_permissions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fix-scripts/001-fix_download_permissions.sh b/fix-scripts/001-fix_download_permissions.sh index 45a96aa..cd6cc42 100644 --- a/fix-scripts/001-fix_download_permissions.sh +++ b/fix-scripts/001-fix_download_permissions.sh @@ -6,7 +6,7 @@ # If you want to run this script on a bare-metal installation instead of within Docker # make sure that the paths configured below match your paths! (it's wise to use the full paths) # USAGE: within your container's bash shell: -# su root +# chmod -R +x ./fix-scripts/ # ./fix-scripts/001-fix_download_permissions.sh # User defines / Docker env defaults From 3e7ef766dee3b459be2464aa518bf3e9b133574f Mon Sep 17 00:00:00 2001 From: GlassedSilver Date: Wed, 4 May 2022 23:40:42 +0200 Subject: [PATCH 75/81] =?UTF-8?q?Best=20to=20just=20put=20fix-scripts=20in?= =?UTF-8?q?=20/backend=20=F0=9F=91=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 1 - .../fix-scripts}/001-fix_download_permissions.sh | 0 2 files changed, 1 deletion(-) rename {fix-scripts => backend/fix-scripts}/001-fix_download_permissions.sh (100%) diff --git a/Dockerfile b/Dockerfile index 1dddfde..73112d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,6 @@ RUN npm config set strict-ssl false && \ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] -COPY --chown=$UID:$GID [ "/fix-scripts", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/fix-scripts/001-fix_download_permissions.sh b/backend/fix-scripts/001-fix_download_permissions.sh similarity index 100% rename from fix-scripts/001-fix_download_permissions.sh rename to backend/fix-scripts/001-fix_download_permissions.sh From 9515d5a1b00f544a5339b8d19883dcd46eba360e Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 4 May 2022 22:01:51 -0400 Subject: [PATCH 76/81] Fixed issue where additional args wouldn't properly inject --- backend/test/tests.js | 16 ++++++++++++---- backend/utils.js | 9 +++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/backend/test/tests.js b/backend/test/tests.js index ec18dd5..0a05f6b 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -388,10 +388,18 @@ describe('Downloader', function() { }); it('Inject args', async function() { - const original_args = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; - const new_args = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; - const updated_args = utils.injectArgs(original_args, new_args); - assert(updated_args, ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']); + const original_args1 = ['--no-resize-buffer', '-o', '%(title)s', '--no-mtime']; + const new_args1 = ['--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + const updated_args1 = utils.injectArgs(original_args1, new_args1); + const expected_args1 = ['--no-resize-buffer', '--no-mtime', '--age-limit', '25', '--yes-playlist', '--abort-on-error', '-o', '%(id)s']; + assert(JSON.stringify(updated_args1), JSON.stringify(expected_args1)); + + const original_args2 = ['-o', '%(title)s.%(ext)s', '--write-info-json', '--print-json', '--audio-quality', '0', '-x', '--audio-format', 'mp3']; + const new_args2 = ['--add-metadata', '--embed-thumbnail', '--convert-thumbnails', 'jpg']; + const updated_args2 = utils.injectArgs(original_args2, new_args2); + const expected_args2 = ['-o', '%(title)s.%(ext)s', '--write-info-json', '--print-json', '--audio-quality', '0', '-x', '--audio-format', 'mp3', '--add-metadata', '--embed-thumbnail', '--convert_thumbnails', 'jpg']; + console.log(updated_args2); + assert(JSON.stringify(updated_args2), JSON.stringify(expected_args2)); }); }); diff --git a/backend/utils.js b/backend/utils.js index b456659..e12fc03 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -421,10 +421,11 @@ async function fetchFile(url, path, file_label) { // - if it doesn't exist and has value, add both arg and value // - if it doesn't exist and doesn't have value, add arg function injectArgs(original_args, new_args) { + const updated_args = original_args.slice(); try { for (let i = 0; i < new_args.length; i++) { const new_arg = new_args[i]; - if (!new_arg.startsWith('-') && !new_arg.startsWith('--')) continue; + if (!new_arg.startsWith('-') && !new_arg.startsWith('--') && i > 0 && original_args.includes(new_args[i - 1])) continue; if (CONSTS.YTDL_ARGS_WITH_VALUES.has(new_arg)) { if (original_args.includes(new_arg)) { @@ -432,10 +433,10 @@ function injectArgs(original_args, new_args) { original_args.splice(original_index, 2); } - original_args.push(new_arg, new_args[i + 1]); + updated_args.push(new_arg, new_args[i + 1]); } else { if (!original_args.includes(new_arg)) { - original_args.push(new_arg); + updated_args.push(new_arg); } } } @@ -444,7 +445,7 @@ function injectArgs(original_args, new_args) { logger.warn(`Failed to inject args (${new_args}) into (${original_args})`); } - return original_args; + return updated_args; } // objects From 692d6eeaac1989362572982f7debd48e59c0d46e Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Wed, 4 May 2022 22:02:43 -0400 Subject: [PATCH 77/81] Added edit button for playlist subscriptions --- src/app/subscriptions/subscriptions.component.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/subscriptions/subscriptions.component.html b/src/app/subscriptions/subscriptions.component.html index be283cf..be9f71c 100644 --- a/src/app/subscriptions/subscriptions.component.html +++ b/src/app/subscriptions/subscriptions.component.html @@ -36,6 +36,9 @@ Name not available. Playlist retrieval in progress. + From 664b63543952e943d0885369d4c2dde698b702ed Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 5 May 2022 00:56:46 -0400 Subject: [PATCH 78/81] Updated English source translation file --- package.json | 3 +- src/assets/i18n/messages.en.xlf | 3464 ++++++++++++++++--------------- 2 files changed, 1803 insertions(+), 1664 deletions(-) diff --git a/package.json b/package.json index 43dd6cb..8571420 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "lint": "ng lint", "e2e": "ng e2e", "electron": "ng build --base-href ./ && electron .", - "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true" + "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true", + "i18n-source": "ng extract-i18n --output-path=src/assets/i18n" }, "engines": { "node": "12.3.1", diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index bab8d85..95f5ddc 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -1,15 +1,7 @@ - - - + + + - - About - - src/app/app.component.html - 32 - - About menu label - Profile @@ -30,6 +22,14 @@ Dark mode toggle label + + About + + src/app/app.component.html + 32 + + About menu label + Home @@ -70,11 +70,19 @@ Navigation menu Downloads Page title + + Tasks + + src/app/app.component.html + 47 + + Navigation menu Tasks Page title + Settings src/app/app.component.html - 49 + 50 src/app/settings/settings.component.html @@ -82,240 +90,893 @@ Settings menu label - - Download for has been queued! + + Date - src/app/main/main.component.ts - 469 + src/app/components/downloads/downloads.component.html + 7 + Date - - Only Audio + + Title - src/app/main/main.component.html - 65,66 + src/app/components/downloads/downloads.component.html + 13 - Only Audio checkbox - - - Download - src/app/main/main.component.html - 79,80 + src/app/components/tasks/tasks.component.html + 6 - Main download button + Title - - Quality + + Subscription - src/app/main/main.component.html - 19,20 + src/app/components/downloads/downloads.component.html + 23 - Quality select label + Subscription - - Use URL + + Stage - src/app/main/main.component.html - 51 + src/app/components/downloads/downloads.component.html + 36 - YT search Use URL button for searched video + Stage - - View + + Progress - src/app/main/main.component.html - 55,56 + src/app/components/downloads/downloads.component.html + 42 - YT search View button for searched video + Progress - - Autoplay + + Actions - src/app/main/main.component.html - 70,71 + src/app/components/downloads/downloads.component.html + 55 - Autoplay checkbox - - - Cancel - src/app/main/main.component.html + src/app/components/tasks/tasks.component.html + 49 + + Actions + + + Pause + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Cancel + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 84,85 - Cancel download button - - - Advanced - src/app/main/main.component.html - 96,97 - - Advanced download mode panel - - - Use custom args - - src/app/main/main.component.html - 110,111 - - Use custom args checkbox - - - Replace args - - src/app/main/main.component.html - 116,117 - - Replace args - - - Custom args - - src/app/main/main.component.html - 120 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 57 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 44 - - Custom args placeholder - - - No need to include URL, just everything after. Args are delimited using two commas like so: ,, - - src/app/main/main.component.html - 123,124 - - Custom Args input hint - - - Use custom output - - src/app/main/main.component.html - 131,132 - - Use custom output checkbox - - - Custom output - - src/app/main/main.component.html - 135 - - Custom output placeholder - - - Documentation - - src/app/main/main.component.html - 137 - - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 69 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 56 + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 47 + 54 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 24 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 51 src/app/settings/settings.component.html - 117 + 492 - Youtube-dl output template documentation link + Cancel - - Path is relative to the config download path. Don't include extension. + + Watch content - src/app/main/main.component.html - 138 + src/app/components/downloads/downloads.component.html + 64 - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 70 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 57 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 48 - - Custom Output input hint + Watch content - - Crop file + + Show error - src/app/main/main.component.html - 160,161 + src/app/components/downloads/downloads.component.html + 65 - Crop video checkbox + Show error - - Simulated command: + + Restart - src/app/main/main.component.html - 102,103 + src/app/components/downloads/downloads.component.html + 66 - Simulated command label + Restart - - Use authentication + + Clear - src/app/main/main.component.html - 145,146 + src/app/components/downloads/downloads.component.html + 68 - Use authentication checkbox + Clear - - Username + + Pause all downloads - src/app/main/main.component.html - 149 + src/app/components/downloads/downloads.component.html + 83 - YT Username placeholder + Pause all downloads - - Password + + Resume all downloads - src/app/main/main.component.html - 154 + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Creating download + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Register + + src/app/components/login/login.component.html + 38 src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 11 + 17 + + Register + + + Lines: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Manage role + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Yes + + src/app/components/manage-role/manage-role.component.html + 9 - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + src/app/components/manage-user/manage-user.component.html + 20 + + Yes + + + No + + src/app/components/manage-role/manage-role.component.html 10 - YT Password placeholder - - - Crop from (seconds) - src/app/main/main.component.html - 164 + src/app/components/manage-user/manage-user.component.html + 21 - Crop from placeholder + No - - Crop to (seconds) + + Close - src/app/main/main.component.html - 169 + src/app/components/manage-role/manage-role.component.html + 18 - Crop to placeholder + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + Close + + + Manage user + + src/app/components/manage-user/manage-user.component.html + 1 + + + src/app/components/modify-users/modify-users.component.html + 70 + + Manage user dialog title + + + User UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Search + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/subscription/subscription/subscription.component.html + 33 + + search field description + + + User name + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Save + + src/app/components/modify-users/modify-users.component.html + 58 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/settings/settings.component.html + 489 + + save user edit action button tooltip + + + Edit user + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + Delete user + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Add Users + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + My videos + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + No videos found. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + File type + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + See more. + + src/app/components/see-more/see-more.component.html + 4,6 + + See more + + + See less. + + src/app/components/see-more/see-more.component.html + 7,9 + + See less + + + Skip ad + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Last ran + + src/app/components/tasks/tasks.component.html + 16 + + Last ran + + + N/A + + src/app/components/tasks/tasks.component.html + 19 + + + src/app/components/tasks/tasks.component.html + 28 + + N/A + + + Last confirmed + + src/app/components/tasks/tasks.component.html + 25 + + Last confirmed + + + Status + + src/app/components/tasks/tasks.component.html + 34 + + Status + + + Busy + + src/app/components/tasks/tasks.component.html + 36 + + Busy + + + Scheduled for + + src/app/components/tasks/tasks.component.html + 38 + + Scheduled + + + Not scheduled + + src/app/components/tasks/tasks.component.html + 42 + + Not scheduled + + + Clear missing files from DB: + + src/app/components/tasks/tasks.component.html + 57 + + Clear missing files from DB + + + Clear duplicate files from DB: + + src/app/components/tasks/tasks.component.html + 60 + + Clear duplicate files from DB + + + Update binary to: + + src/app/components/tasks/tasks.component.html + 63 + + Update binary to + + + Run + + src/app/components/tasks/tasks.component.html + 69 + + Run + + + Schedule + + src/app/components/tasks/tasks.component.html + 72 + + Schedule + + + Restore DB from backup + + src/app/components/tasks/tasks.component.html + 89 + + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 1 + + Restore DB from backup button + + + Reset tasks + + src/app/components/tasks/tasks.component.html + 90 + + Reset tasks button + + + No tasks available! + + src/app/components/tasks/tasks.component.html + 94 + + No tasks label + + + Successfully ran task! + + src/app/components/tasks/tasks.component.ts + 78 + + + + Failed to run task! + + src/app/components/tasks/tasks.component.ts + 79 + + + src/app/components/tasks/tasks.component.ts + 81 + + + + Successfully confirmed task! + + src/app/components/tasks/tasks.component.ts + 89 + + + + Failed to confirm task! + + src/app/components/tasks/tasks.component.ts + 90 + + + src/app/components/tasks/tasks.component.ts + 92 + + + + Reset tasks + + src/app/components/tasks/tasks.component.ts + 132 + + + + Would you like to reset your tasks? All your schedules will be removed as well. + + src/app/components/tasks/tasks.component.ts + 133 + + + + Reset + + src/app/components/tasks/tasks.component.ts + 134 + + + + Tasks successfully reset! + + src/app/components/tasks/tasks.component.ts + 142 + + + + Failed to reset tasks! + + src/app/components/tasks/tasks.component.ts + 144 + + + src/app/components/tasks/tasks.component.ts + 147 + + + + Download Twitch Chat + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Auto-generated + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Info + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Go to subscription + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + Delete + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete video button + + + Delete and blacklist + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + Edit + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button Create a playlist @@ -331,14 +992,14 @@ src/app/create-playlist/create-playlist.component.html 6 - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 8 - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 5 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + Playlist name placeholder @@ -385,6 +1046,578 @@ Videos title + + About YoutubeDL-Material + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Checking for updates... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Installation type: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Docker tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Commit hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + Click here + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + + src/app/settings/settings.component.html + 283 + + + src/app/settings/settings.component.html + 289 + + About bug click here + + + to create an issue! + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Register a user + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Password + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + + src/app/main/main.component.html + 154,156 + + Password placeholder + + + Modify youtube-dl args + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1,6 + + Modify args title + + + Simulated new args + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8,9 + + Simulated args title + + + Add an arg + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34,37 + + Add arg card title + + + Search by category + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60,63 + + Search args by category button + + + Use arg value + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64,66 + + Use arg value checkbox + + + Arg value + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68,69 + + Arg value placeholder + + + Add arg + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73,77 + + Search args by category button + + + Modify + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85,86 + + Arg modifier modify button + + + Upload new cookies + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + Drag and Drop + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Editing category + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Custom file output + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + Category custom file output placeholder + + + Documentation + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/main/main.component.html + 137,138 + + + src/app/settings/settings.component.html + 119 + + Custom output template documentation link + + + Path is relative to the config download path. Don't include extension. + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/main/main.component.html + 138,140 + + Custom Output input hint + + + Editing + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + (Paused) + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/subscription/subscription/subscription.component.html + 5 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + Paused suffix + + + Paused + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Download all uploads + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + Download all uploads subscription setting + + + Download videos uploaded in the last + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + Download time range prefix + + + Audio-only mode + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + Streaming-only mode + + + Max quality + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + Max quality placeholder + + + Streaming-only mode + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + Streaming-only mode + + + Custom args + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/main/main.component.html + 120,122 + + Subscription custom args placeholder + + + These are added after the standard args. + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + Custom args hint + + + Modify playlist + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Randomize order when playing + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Normal order  + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order  + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + Add content + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Restore + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 25 + + Restore button + + + Create admin account + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Share playlist + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Enable sharing + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + Subscribe to playlist or channel @@ -421,122 +1654,6 @@ Subscription custom name placeholder - - Download all uploads - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 23 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 10 - - Download all uploads subscription setting - - - Max quality - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 40 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 32 - - Max quality placeholder - - - Audio-only mode - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 47 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 27 - - Streaming-only mode - - - Streaming-only mode - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 52 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 39 - - Streaming-only mode - - - These are added after the standard args. - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 60 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 47 - - Custom args hint - - - Custom file output - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 66 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 53 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 44 - - Subscription custom file output placeholder - - - Cancel - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 79 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 84 - - - src/app/dialogs/confirm-dialog/confirm-dialog.component.html - 16 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 66 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 54 - - - src/app/settings/settings.component.html - 490 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/modify-users/modify-users.component.html - 61 - - Subscribe cancel button - Subscribe @@ -545,18 +1662,6 @@ Subscribe button - - Download videos uploaded in the last - - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 26 - - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 13 - - Download time range prefix - Type: @@ -583,59 +1688,15 @@ src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 - - src/app/file-card/file-card.component.html - 7 - - - src/app/download-item/download-item.component.html - 4 - Subscription ID property - - Close + + Archive: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 23 - - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 35 - - - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 17 - - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 18 - - - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 40 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 70 - - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 29 - - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 - - - src/app/components/manage-user/manage-user.component.html - 30 - - - src/app/components/manage-role/manage-role.component.html - 18 - - Close subscription info button + Subscription ID property Export Archive @@ -653,49 +1714,97 @@ Unsubscribe button - - (Paused) + + Updater - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html 1 - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - - src/app/subscriptions/subscriptions.component.html - 12 - - - src/app/subscriptions/subscriptions.component.html - 34 - - - src/app/subscription/subscription/subscription.component.html - 5 - - Paused suffix + Update progress dialog title - - Archive: + + Update task schedule - src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html - 17 + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 1 - Subscription ID property + Update task schedule + + + Enabled + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 7 + + Enabled + + + Recurring + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 10 + + Recurring + + + Update + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 52 + + Update button + + + Your Profile + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title Name: - - src/app/dialogs/video-info-dialog/video-info-dialog.component.html - 5 - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 6 - Video name property + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + Name + + + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Logout + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout Uploader: @@ -737,373 +1846,164 @@ Category property - - Modify youtube-dl args + + Quality - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 1 + src/app/main/main.component.html + 19,20 - Modify args title + Quality select label - - Simulated new args + + Use URL - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 8 + src/app/main/main.component.html + 51,53 - Simulated args title + YT search Use URL button for searched video - - Add an arg + + View - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 34 + src/app/main/main.component.html + 55,57 - Add arg card title + YT search View button for searched video - - Search by category + + Only Audio - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 60 + src/app/main/main.component.html + 65,67 - Search args by category button + Only Audio checkbox - - Use arg value + + Autoplay - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 64 + src/app/main/main.component.html + 70,72 - Use arg value checkbox + Autoplay checkbox - - Add arg + + Download - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 73 + src/app/main/main.component.html + 79,82 - Search args by category button + Main download button - - Modify + + Cancel - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 85 + src/app/main/main.component.html + 84,87 - Arg modifier modify button + Cancel download button - - Arg value + + Advanced - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 68 + src/app/main/main.component.html + 96,99 - Arg value placeholder + Advanced download mode panel - - Updater + + Simulated command: - src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html - 1 + src/app/main/main.component.html + 102,104 - Update progress dialog title + Simulated command label - - Register a user + + Use custom args - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 1 + src/app/main/main.component.html + 110,112 - Register user dialog title + Use custom args checkbox - - User name + + Replace args - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 6 + src/app/main/main.component.html + 116,118 - User name placeholder + Replace args - - Register + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, - src/app/dialogs/add-user-dialog/add-user-dialog.component.html - 17 + src/app/main/main.component.html + 123,125 - - src/app/components/login/login.component.html - 38 - - Register user button + Custom Args input hint - - Upload new cookies + + Use custom output - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 1 + src/app/main/main.component.html + 131,133 - Cookies uploader dialog title + Use custom output checkbox - - NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + Custom output - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 20 + src/app/main/main.component.html + 135,136 - Cookies upload warning + Custom output placeholder - - Drag and Drop + + Use authentication - src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html - 11 + src/app/main/main.component.html + 145,147 - Drag and Drop + Use authentication checkbox - - Modify playlist + + Username - src/app/dialogs/modify-playlist/modify-playlist.component.html - 1 + src/app/main/main.component.html + 149,151 - Modify playlist dialog title + YT Username placeholder - - Save + + Crop file - src/app/dialogs/modify-playlist/modify-playlist.component.html - 43 + src/app/main/main.component.html + 160,162 - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 68 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 56 - - - src/app/settings/settings.component.html - 487 - - - src/app/components/modify-users/modify-users.component.html - 58 - - Save + Crop video checkbox - - Randomize order when playing + + Crop from (seconds) - src/app/dialogs/modify-playlist/modify-playlist.component.html - 13 + src/app/main/main.component.html + 164,166 - Randomize order when playing checkbox label + Crop from placeholder - - Add content + + Crop to (seconds) - src/app/dialogs/modify-playlist/modify-playlist.component.html - 24 + src/app/main/main.component.html + 169,171 - Add content + Crop to placeholder - - Normal order  + + Download for has been queued! - src/app/dialogs/modify-playlist/modify-playlist.component.html - 18 + src/app/main/main.component.ts + 403 - Normal order - - - Reverse order  - - src/app/dialogs/modify-playlist/modify-playlist.component.html - 19 - - Reverse order - - - My videos - - src/app/components/recent-videos/recent-videos.component.html - 20 - - My videos title - - - Search - - src/app/components/recent-videos/recent-videos.component.html - 24 - - - src/app/components/modify-users/modify-users.component.html - 7 - - - src/app/subscription/subscription/subscription.component.html - 33 - - Files search placeholder - - - File type - - src/app/components/recent-videos/recent-videos.component.html - 52 - - File type - - - Both - - src/app/components/recent-videos/recent-videos.component.html - 54 - - Both - - - Video only - - src/app/components/recent-videos/recent-videos.component.html - 55 - - Video only - - - Audio only - - src/app/components/recent-videos/recent-videos.component.html - 56 - - Audio only - - - No videos found. - - src/app/components/recent-videos/recent-videos.component.html - 38 - - No videos found - - - Editing - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 1 - - Edit subscription dialog title prefix - - - Paused - - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 7 - - Paused subscription setting - - - Editing category - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 1 - - Editing category dialog title - - - Rules - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 10 - - Rules - - - Add new rule - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 39 - - Add new rule tooltip - - - Download Twitch Chat - - src/app/components/twitch-chat/twitch-chat.component.html - 10 - - Download Twitch Chat button - - - Edit - - src/app/file-card/file-card.component.html - 19 - - - src/app/components/unified-file-card/unified-file-card.component.html - 43 - - Playlist edit button - - - Delete - - src/app/file-card/file-card.component.html - 20 - - - src/app/file-card/file-card.component.html - 25 - - - src/app/components/unified-file-card/unified-file-card.component.html - 39 - - - src/app/components/unified-file-card/unified-file-card.component.html - 45 - - Delete playlist - - - Info - - src/app/file-card/file-card.component.html - 24 - - - src/app/components/unified-file-card/unified-file-card.component.html - 24 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 7 - - Video info button - - - Count: - - src/app/file-card/file-card.component.html - 8 - - Playlist video count - - - Delete and blacklist - - src/app/file-card/file-card.component.html - 26 - - - src/app/components/unified-file-card/unified-file-card.component.html - 40 - - Delete and blacklist video button views @@ -1113,133 +2013,6 @@ View count label - - The download was successful - - src/app/download-item/download-item.component.html - 8 - - - src/app/download-item/download-item.component.html - 8 - - download successful tooltip - - - An error has occurred - - src/app/download-item/download-item.component.html - 9 - - - src/app/download-item/download-item.component.html - 9 - - download error tooltip - - - Details - - src/app/download-item/download-item.component.html - 18 - - Details - - - An error has occurred: - - src/app/download-item/download-item.component.html - 27 - - Error label - - - Download start: - - src/app/download-item/download-item.component.html - 32 - - Download start label - - - Download end: - - src/app/download-item/download-item.component.html - 35 - - Download end label - - - File path(s): - - src/app/download-item/download-item.component.html - 38 - - File path(s) label - - - Your subscriptions - - src/app/subscriptions/subscriptions.component.html - 3 - - Subscriptions title - - - Channels - - src/app/subscriptions/subscriptions.component.html - 8 - - Subscriptions channels title - - - Playlists - - src/app/subscriptions/subscriptions.component.html - 30 - - Subscriptions playlists title - - - Name not available. Channel retrieval in progress. - - src/app/subscriptions/subscriptions.component.html - 14 - - Subscription playlist not available text - - - You have no channel subscriptions. - - src/app/subscriptions/subscriptions.component.html - 27 - - No channel subscriptions text - - - Name not available. Playlist retrieval in progress. - - src/app/subscriptions/subscriptions.component.html - 36 - - Subscription playlist not available text - - - You have no playlist subscriptions. - - src/app/subscriptions/subscriptions.component.html - 46 - - No playlist subscriptions text - - - You must enable multi-user mode to access this tab. - - src/app/settings/settings.component.ts - 48 - - Main @@ -1248,50 +2021,6 @@ Main settings label - - Downloader - - src/app/settings/settings.component.html - 94 - - Downloader settings label - - - Extra - - src/app/settings/settings.component.html - 198 - - Extra settings label - - - Database - - src/app/settings/settings.component.html - 303 - - Database settings label - - - Advanced - - src/app/settings/settings.component.html - 339 - - Host settings label - - - Logs - - src/app/settings/settings.component.html - 476 - - - src/app/settings/settings.component.html - 476 - - Logs settings label - URL this app will be accessed from, without the port. @@ -1349,8 +2078,7 @@ Allow subscriptions setting - Base bath for subscriptions - Base bath for subscriptions + Subscriptions base path src/app/settings/settings.component.html 44 @@ -1358,7 +2086,7 @@ Subscriptions base path input setting placeholder - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html 45 @@ -1429,19 +2157,27 @@ Language select label + + Downloader + + src/app/settings/settings.component.html + 96 + + Downloader settings label + Audio folder path src/app/settings/settings.component.html - 101 + 103 Audio folder path input placeholder - Path for audio only downloads. It is relative to YTDL-Material's root folder. + Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 102 + 104 Aduio path setting input hint @@ -1449,15 +2185,15 @@ Video folder path src/app/settings/settings.component.html - 108 + 110 Video folder path input placeholder - Path for video downloads. It is relative to YTDL-Material's root folder. + Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 109 + 111 Video path setting input hint @@ -1465,15 +2201,15 @@ Default file output src/app/settings/settings.component.html - 115 + 117 Default file output placeholder - Path is relative to the above download paths. Don't include extension. + Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html - 118 + 120 Custom Output input hint @@ -1481,15 +2217,15 @@ Global custom args src/app/settings/settings.component.html - 125 + 127 Custom args input placeholder - + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, src/app/settings/settings.component.html - 126 + 128 Custom args setting input hint @@ -1497,7 +2233,7 @@ Categories src/app/settings/settings.component.html - 136 + 138 Categories @@ -1505,7 +2241,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. src/app/settings/settings.component.html - 150 + 152 Allow playlist categorization setting tooltip @@ -1513,7 +2249,7 @@ Allow playlist categorization src/app/settings/settings.component.html - 150 + 152 Allow playlist categorization setting label @@ -1521,7 +2257,7 @@ Use youtube-dl archive src/app/settings/settings.component.html - 158 + 160 Use youtubedl archive setting @@ -1529,7 +2265,7 @@ Include thumbnail src/app/settings/settings.component.html - 162 + 164 Include thumbnail setting @@ -1537,7 +2273,7 @@ Include metadata src/app/settings/settings.component.html - 166 + 168 Include metadata setting @@ -1545,7 +2281,7 @@ Max concurrent downloads src/app/settings/settings.component.html - 175 + 177 Max concurrent downloads @@ -1553,7 +2289,7 @@ Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. src/app/settings/settings.component.html - 176 + 178 Max concurrent downloads input hint @@ -1561,7 +2297,7 @@ Download rate limit src/app/settings/settings.component.html - 181 + 183 Download rate limit input placeholder @@ -1569,7 +2305,7 @@ Rate limits your downloads to the specified amount. Ex: 200K src/app/settings/settings.component.html - 182 + 184 Download rate limit input hint @@ -1577,15 +2313,23 @@ Kill all downloads src/app/settings/settings.component.html - 191 + 193 Kill all downloads button + + Extra + + src/app/settings/settings.component.html + 200 + + Extra settings label + Top title src/app/settings/settings.component.html - 204 + 206 Top title input placeholder @@ -1593,7 +2337,7 @@ File manager enabled src/app/settings/settings.component.html - 209 + 211 File manager enabled setting @@ -1601,7 +2345,7 @@ Downloads manager enabled src/app/settings/settings.component.html - 212 + 214 Downloads manager enabled setting @@ -1609,7 +2353,7 @@ Allow quality select src/app/settings/settings.component.html - 215 + 217 Allow quality seelct setting @@ -1617,7 +2361,7 @@ Download only mode src/app/settings/settings.component.html - 218 + 220 Download only mode setting @@ -1625,7 +2369,7 @@ Allow autoplay src/app/settings/settings.component.html - 221 + 223 Allow autoplay setting @@ -1633,7 +2377,7 @@ Enable Public API src/app/settings/settings.component.html - 229 + 231 Enable Public API key setting @@ -1641,7 +2385,7 @@ Public API Key src/app/settings/settings.component.html - 234 + 236 Public API Key setting placeholder @@ -1649,7 +2393,7 @@ View documentation src/app/settings/settings.component.html - 235 + 237 View API docs setting hint @@ -1657,7 +2401,7 @@ This will delete your old API key! src/app/settings/settings.component.html - 239 + 241 delete api key tooltip @@ -1665,7 +2409,7 @@ Generate src/app/settings/settings.component.html - 239 + 241 Generate key button @@ -1673,7 +2417,7 @@ Use YouTube API src/app/settings/settings.component.html - 248 + 250 Use YouTube API setting @@ -1681,7 +2425,7 @@ Youtube API Key src/app/settings/settings.component.html - 252 + 254 Youtube API Key setting placeholder @@ -1689,11 +2433,11 @@ Generating a key is easy! src/app/settings/settings.component.html - 253 + 255 src/app/settings/settings.component.html - 265 + 267 Youtube API Key setting hint @@ -1701,15 +2445,23 @@ Use Twitch API src/app/settings/settings.component.html - 257 + 259 Use Twitch API setting + + Auto-download Twitch Chat + + src/app/settings/settings.component.html + 262 + + Auto download Twitch Chat setting + Twitch API Key src/app/settings/settings.component.html - 264 + 266 Twitch API Key setting placeholder @@ -1717,7 +2469,7 @@ Also known as a Client ID. src/app/settings/settings.component.html - 265 + 267 Twitch API Key setting hint AKA preamble @@ -1725,7 +2477,7 @@ Enables a button to skip ads when viewing supported videos. src/app/settings/settings.component.html - 269 + 271 SponsorBlock API tooltip @@ -1733,7 +2485,7 @@ Use SponsorBlock API src/app/settings/settings.component.html - 269 + 271 Use SponsorBlock API setting @@ -1741,7 +2493,7 @@ Generates NFO files with every download, primarily used by Kodi. src/app/settings/settings.component.html - 272 + 274 Generate NFO files tooltip @@ -1749,47 +2501,23 @@ Generate NFO files src/app/settings/settings.component.html - 272 + 274 Generate NFO files setting - - Auto-download Twitch Chat - - src/app/settings/settings.component.html - 260 - - Auto download Twitch Chat setting - - - Click here - - src/app/settings/settings.component.html - 281 - - - src/app/settings/settings.component.html - 287 - - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - Chrome ext click here - to download the official YoutubeDL-Material Chrome extension manually. src/app/settings/settings.component.html - 281 + 283 Chrome click here suffix - You must manually load the extension and modify the extension's settings to set the frontend URL. + You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 282 + 284 Chrome setup suffix @@ -1797,7 +2525,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. src/app/settings/settings.component.html - 287 + 289 Firefox click here suffix @@ -1805,39 +2533,47 @@ Detailed setup instructions. src/app/settings/settings.component.html - 288 + 290 Firefox setup prefix link - Not much is required other than changing the extension's settings to set the frontend URL. + Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 288 + 290 Firefox setup suffix - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html - 293 + 295 Bookmarklet instructions - Generate 'audio only' bookmarklet + Generate 'audio only' bookmarklet src/app/settings/settings.component.html - 294 + 296 Generate audio only bookmarklet checkbox + + Database + + src/app/settings/settings.component.html + 305 + + Database settings label + Database location: src/app/settings/settings.component.html - 309 + 311 Database location label @@ -1845,7 +2581,7 @@ Records per table src/app/settings/settings.component.html - 310 + 312 Records per table label @@ -1853,7 +2589,7 @@ MongoDB Connection String src/app/settings/settings.component.html - 318 + 320 MongoDB Connection String @@ -1861,7 +2597,7 @@ Example: src/app/settings/settings.component.html - 319 + 321 MongoDB Connection String setting hint AKA preamble @@ -1869,7 +2605,7 @@ Test connection string src/app/settings/settings.component.html - 323 + 325 Test connection string button @@ -1877,7 +2613,7 @@ Transfer DB to src/app/settings/settings.component.html - 327 + 329 Transfer DB button @@ -1885,15 +2621,23 @@ Database information could not be retrieved. Check the server logs for more information. src/app/settings/settings.component.html - 331 + 333 Database info not retrieved error message + + Advanced + + src/app/settings/settings.component.html + 341 + + Host settings label + Select a downloader src/app/settings/settings.component.html - 345 + 347 Default downloader select label @@ -1901,7 +2645,7 @@ Use default downloading agent src/app/settings/settings.component.html - 354 + 356 Use default downloading agent setting @@ -1909,7 +2653,7 @@ Select a download agent src/app/settings/settings.component.html - 358 + 360 Custom downloader select label @@ -1917,7 +2661,7 @@ Log Level src/app/settings/settings.component.html - 372 + 374 Log Level label @@ -1925,7 +2669,7 @@ Login expiration src/app/settings/settings.component.html - 384 + 386 Login expiration select label @@ -1933,7 +2677,7 @@ Allow advanced download src/app/settings/settings.component.html - 395 + 397 Allow advanced downloading setting @@ -1941,7 +2685,7 @@ Use Cookies src/app/settings/settings.component.html - 403 + 405 Use cookies setting @@ -1949,7 +2693,7 @@ Set Cookies src/app/settings/settings.component.html - 404 + 406 Set cookies button @@ -1957,7 +2701,7 @@ Restart server src/app/settings/settings.component.html - 416 + 418 Restart server button @@ -1965,7 +2709,7 @@ Users src/app/settings/settings.component.html - 425 + 427 Users settings label @@ -1973,7 +2717,7 @@ Allow user registration src/app/settings/settings.component.html - 431 + 433 Allow registration setting @@ -1981,7 +2725,7 @@ Auth method src/app/settings/settings.component.html - 435 + 437 Auth method select @@ -1989,7 +2733,7 @@ Internal src/app/settings/settings.component.html - 437 + 439 Internal auth method @@ -1997,7 +2741,7 @@ LDAP src/app/settings/settings.component.html - 440 + 442 LDAP auth method @@ -2005,7 +2749,7 @@ LDAP URL src/app/settings/settings.component.html - 447 + 449 LDAP URL @@ -2013,7 +2757,7 @@ Bind DN src/app/settings/settings.component.html - 452 + 454 Bind DN @@ -2021,7 +2765,7 @@ Bind Credentials src/app/settings/settings.component.html - 457 + 459 Bind Credentials @@ -2029,7 +2773,7 @@ Search Base src/app/settings/settings.component.html - 462 + 464 Search Base @@ -2037,694 +2781,24 @@ Search Filter src/app/settings/settings.component.html - 467 + 469 Search Filter - - About YoutubeDL-Material + + Logs - src/app/dialogs/about-dialog/about-dialog.component.html - 1 + src/app/settings/settings.component.html + 478 - About dialog title + Logs settings label - - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + You must enable multi-user mode to access this tab. - src/app/dialogs/about-dialog/about-dialog.component.html - 12 + src/app/settings/settings.component.ts + 48 - About first paragraph - - - has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - - src/app/dialogs/about-dialog/about-dialog.component.html - 15 - - About second paragraph - - - Installed version: - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Version label - - - Installation type: - - src/app/dialogs/about-dialog/about-dialog.component.html - 25 - - Installation type - - - Commit hash: - - src/app/dialogs/about-dialog/about-dialog.component.html - 31 - - Commit hash - - - Build date: - - src/app/dialogs/about-dialog/about-dialog.component.html - 33 - - Build date - - - Found a bug or have a suggestion? - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug prefix - - - to create an issue! - - src/app/dialogs/about-dialog/about-dialog.component.html - 36 - - About bug suffix - - - Checking for updates... - - src/app/dialogs/about-dialog/about-dialog.component.html - 20 - - Checking for updates text - - - Update available - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - View latest update - - - You can update from the settings menu. - - src/app/dialogs/about-dialog/about-dialog.component.html - 21 - - Update through settings menu hint - - - Docker tag: - - src/app/dialogs/about-dialog/about-dialog.component.html - 28 - - Docker tag - - - Select a version: - - src/app/updater/updater.component.html - 3 - - Select a version - - - Enable sharing - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 9 - - Enable sharing checkbox - - - Use timestamp - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 12 - - Use timestamp - - - Seconds - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 14 - - Seconds - - - Copy to clipboard - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 23 - - Copy to clipboard button - - - Share playlist - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 2 - - Share playlist dialog title - - - Share file - - src/app/dialogs/share-media-dialog/share-media-dialog.component.html - 3 - - Share video dialog title - - - Creating download - - src/app/components/downloads/downloads.component.ts - 58 - - - - Getting info - - src/app/components/downloads/downloads.component.ts - 59 - - - - Downloading file - - src/app/components/downloads/downloads.component.ts - 60 - - - - Complete - - src/app/components/downloads/downloads.component.ts - 61 - - - - Clear finished downloads - - src/app/components/downloads/downloads.component.ts - 129 - - - - Would you like to clear your finished downloads? - - src/app/components/downloads/downloads.component.ts - 130 - - - - Clear - - src/app/components/downloads/downloads.component.ts - 131 - - - - Error for - - src/app/components/downloads/downloads.component.ts - 238 - - - - Copy to clipboard - - src/app/components/downloads/downloads.component.ts - 240 - - - - Close - - src/app/components/downloads/downloads.component.ts - 241 - - - - Copied to clipboard! - - src/app/components/downloads/downloads.component.ts - 249 - - - - Date - - src/app/components/downloads/downloads.component.html - 7 - - Date - - - Title - - src/app/components/downloads/downloads.component.html - 13 - - Title - - - Subscription - - src/app/components/downloads/downloads.component.html - 23 - - Subscription - - - Stage - - src/app/components/downloads/downloads.component.html - 36 - - Stage - - - Progress - - src/app/components/downloads/downloads.component.html - 42 - - Progress - - - Actions - - src/app/components/downloads/downloads.component.html - 55 - - Actions - - - Clear - - src/app/components/downloads/downloads.component.html - 68 - - - src/app/components/downloads/downloads.component.html - 68 - - Clear - - - Pause - - src/app/components/downloads/downloads.component.html - 59 - - - src/app/components/downloads/downloads.component.html - 59 - - Pause - - - Resume - - src/app/components/downloads/downloads.component.html - 60 - - - src/app/components/downloads/downloads.component.html - 60 - - Resume - - - Watch content - - src/app/components/downloads/downloads.component.html - 64 - - - src/app/components/downloads/downloads.component.html - 64 - - Watch content - - - Show error - - src/app/components/downloads/downloads.component.html - 65 - - - src/app/components/downloads/downloads.component.html - 65 - - Show error - - - Restart - - src/app/components/downloads/downloads.component.html - 66 - - Restart - - - Pause all downloads - - src/app/components/downloads/downloads.component.html - 83 - - Pause all downloads - - - Resume all downloads - - src/app/components/downloads/downloads.component.html - 84 - - Resume all downloads - - - Clear finished downloads - - src/app/components/downloads/downloads.component.html - 85 - - Clear finished downloads - - - No downloads available! - - src/app/components/downloads/downloads.component.html - 90 - - No downloads label - - - Your Profile - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 1 - - User profile dialog title - - - Logout - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 - - Logout - - - UID: - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 9 - - UID - - - Created: - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 12 - - Created - - - You are not logged in. - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 19 - - Not logged in notification - - - Create admin account - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 1 - - Create admin account dialog title - - - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 5 - - No default admin detected explanation - - - Create - - src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html - 17 - - Create - - - Add Users - - src/app/components/modify-users/modify-users.component.html - 90 - - Add users button - - - Edit Role - - src/app/components/modify-users/modify-users.component.html - 95 - - Edit role - - - User name - - src/app/components/modify-users/modify-users.component.html - 17 - - Username users table header - - - Role - - src/app/components/modify-users/modify-users.component.html - 35 - - Role users table header - - - Actions - - src/app/components/modify-users/modify-users.component.html - 55 - - Actions users table header - - - Manage user - - src/app/components/modify-users/modify-users.component.html - 70 - - - src/app/components/manage-user/manage-user.component.html - 1 - - manage user action button tooltip - - - Delete user - - src/app/components/modify-users/modify-users.component.html - 73 - - delete user action button tooltip - - - Edit user - - src/app/components/modify-users/modify-users.component.html - 66 - - edit user action button tooltip - - - User UID: - - src/app/components/manage-user/manage-user.component.html - 4 - - User UID - - - New password - - src/app/components/manage-user/manage-user.component.html - 8 - - New password placeholder - - - Set new password - - src/app/components/manage-user/manage-user.component.html - 10 - - Set new password - - - Use role default - - src/app/components/manage-user/manage-user.component.html - 19 - - Use role default - - - Yes - - src/app/components/manage-user/manage-user.component.html - 20 - - - src/app/components/manage-role/manage-role.component.html - 9 - - Yes - - - No - - src/app/components/manage-user/manage-user.component.html - 21 - - - src/app/components/manage-role/manage-role.component.html - 10 - - No - - - Manage role - - src/app/components/manage-role/manage-role.component.html - 1 - - Manage role dialog title - - - Lines: - - src/app/components/logs-viewer/logs-viewer.component.html - 22 - - Label for lines select in logger view - - - Clear logs - - src/app/components/logs-viewer/logs-viewer.component.html - 34 - - Clear logs button - - - Auto-generated - - src/app/components/unified-file-card/unified-file-card.component.html - 5 - - Auto-generated label - - - Open file - - src/app/components/unified-file-card/unified-file-card.component.html - 18 - - Open file button - - - Open file in new tab - - src/app/components/unified-file-card/unified-file-card.component.html - 19 - - Open file in new tab - - - Go to subscription - - src/app/components/unified-file-card/unified-file-card.component.html - 25 - - Go to subscription menu item - - - Add to playlist - - src/app/components/unified-file-card/unified-file-card.component.html - 26 - - Add to playlist menu item - - - Delete and redownload - - src/app/components/unified-file-card/unified-file-card.component.html - 34 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 8 - - Delete and redownload subscription video button - - - Delete forever - - src/app/components/unified-file-card/unified-file-card.component.html - 37 - - - src/app/subscription/subscription-file-card/subscription-file-card.component.html - 9 - - Delete forever subscription video button - - - See more. - - src/app/components/see-more/see-more.component.html - 5,6 - - See more - - - See less. - - src/app/components/see-more/see-more.component.html - 8,9 - - See less - - - Skip ad - - src/app/components/skip-ad-button/skip-ad-button.component.html - 1 - - Skip ad button Length: @@ -2734,6 +2808,70 @@ Video duration label + + Your subscriptions + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Name not available. Channel retrieval in progress. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Playlists + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Playlist retrieval in progress. + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + + src/app/subscriptions/subscriptions.component.html + 49 + + No playlist subscriptions text + + + Select a version: + + src/app/updater/updater.component.html + 3 + + Select a version + From 2b3490e52c0df4bb3ea5b244d58a1df07445939f Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 5 May 2022 01:08:43 -0400 Subject: [PATCH 79/81] Updated heroku dockerfile --- Dockerfile.heroku | 3 ++- heroku.yml | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile.heroku b/Dockerfile.heroku index c09b831..b2ff8b3 100644 --- a/Dockerfile.heroku +++ b/Dockerfile.heroku @@ -1 +1,2 @@ -FROM tzahi12345/youtubedl-material:nightly \ No newline at end of file +FROM tzahi12345/youtubedl-material:nightly +CMD [ "pm2-runtime", "pm2.config.js" ] \ No newline at end of file diff --git a/heroku.yml b/heroku.yml index e72d2b2..3fa3eec 100644 --- a/heroku.yml +++ b/heroku.yml @@ -1,5 +1,3 @@ build: docker: web: Dockerfile.heroku - run: - web: npm start \ No newline at end of file From 2ad42ebf2755fca2ea0a85a0e6fc143b2ce61228 Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 5 May 2022 02:29:31 -0400 Subject: [PATCH 80/81] Fixed issue where python couldn't be found --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 73112d4..5d4bd61 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,6 +64,8 @@ RUN npm config set strict-ssl false && \ npm install pm2 -g && \ npm install && chown -R $UID:$GID ./ +RUN ln -s /usr/bin/python3 /usr/bin/python + COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] From 8118906b0af328c3870264d4d1f95803f8bbc53c Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Thu, 5 May 2022 02:31:28 -0400 Subject: [PATCH 81/81] Binary path is now confirmed for linux, solves #601 --- Dockerfile | 1 + backend/app.js | 14 ++++---------- backend/utils.js | 9 +++++++++ backend/youtube-dl.js | 16 +++++++++++++++- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5d4bd61..47eea8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,6 +64,7 @@ RUN npm config set strict-ssl false && \ npm install pm2 -g && \ npm install && chown -R $UID:$GID ./ +# needed for ubuntu, see #596 RUN ln -s /usr/bin/python3 /usr/bin/python COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] diff --git a/backend/app.js b/backend/app.js index 2ec7f98..af6089a 100644 --- a/backend/app.js +++ b/backend/app.js @@ -249,14 +249,6 @@ async function startServer() { }); } -async function restartServer(is_update = false) { - logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`); - - // the following line restarts the server through nodemon - fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only'); - process.exit(1); -} - async function updateServer(tag) { // no tag provided means update to the latest version if (!tag) { @@ -297,7 +289,7 @@ async function updateServer(tag) { updating: true, 'details': 'Update complete! Restarting server...' } - restartServer(true); + utils.restartServer(true); }, err => { logger.error(err); updaterStatus = { @@ -676,6 +668,7 @@ async function getUrlInfos(url) { async function startYoutubeDL() { // auto update youtube-dl + youtubedl_api.verifyBinaryExistsLinux(); const update_available = await youtubedl_api.checkForYoutubeDLUpdate(); if (update_available) await youtubedl_api.updateYoutubeDL(update_available); } @@ -764,7 +757,7 @@ app.get('/api/versionInfo', (req, res) => { app.post('/api/restartServer', optionalJwt, (req, res) => { // delayed by a little bit so that the client gets a response - setTimeout(() => {restartServer()}, 100); + setTimeout(() => {utils.restartServer()}, 100); res.send({success: true}); }); @@ -1802,6 +1795,7 @@ app.post('/api/updateTaskData', optionalJwt, async (req, res) => { app.post('/api/getDBBackups', optionalJwt, async (req, res) => { const backup_dir = path.join('appdata', 'db_backup'); + fs.ensureDirSync(backup_dir); const db_backups = []; const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false); diff --git a/backend/utils.js b/backend/utils.js index a6eaf7e..4aeb4a9 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -415,6 +415,14 @@ async function fetchFile(url, path, file_label) { }); } +async function restartServer(is_update = false) { + logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`); + + // the following line restarts the server through nodemon + fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only'); + process.exit(1); +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -458,5 +466,6 @@ module.exports = { wait: wait, checkExistsWithTimeout: checkExistsWithTimeout, fetchFile: fetchFile, + restartServer: restartServer, File: File } diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js index 80432fb..a94e566 100644 --- a/backend/youtube-dl.js +++ b/backend/youtube-dl.js @@ -6,6 +6,8 @@ const utils = require('./utils'); const CONSTS = require('./consts'); const config_api = require('./config.js'); +const OUTDATED_VERSION = "2020.00.00"; + const is_windows = process.platform === 'win32'; const download_sources = { @@ -31,7 +33,7 @@ exports.checkForYoutubeDLUpdate = async () => { let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); if (!current_app_details_exists) { logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version": OUTDATED_VERSION, "downloader": default_downloader}); } let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); let current_version = current_app_details['version']; @@ -86,6 +88,18 @@ exports.updateYoutubeDL = async (latest_update_version) => { await download_sources[default_downloader]['func'](latest_update_version); } +exports.verifyBinaryExistsLinux = () => { + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); + if (!is_windows && details_json && details_json['path'].includes('.exe')) { + details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl'; + details_json['exec'] = 'youtube-dl'; + details_json['version'] = OUTDATED_VERSION; + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); + + utils.restartServer(); + } +} + async function downloadLatestYoutubeDLBinary(new_version) { const file_ext = is_windows ? '.exe' : '';