├── .gitignore ├── Dockerfile ├── LICENSE.md ├── README.md ├── mkdocs ├── docs │ ├── advanced.md │ ├── api │ │ ├── docs.md │ │ └── introduction.md │ ├── assets │ │ ├── Synology_0.2.0_Docker-ES-Env-Conf.png │ │ ├── Synology_0.2.0_Docker-ES-Search.png │ │ ├── Synology_0.2.0_Docker-Folder-Create.png │ │ ├── Synology_0.2.0_Docker-Folder-Structure.png │ │ ├── Synology_0.2.0_Docker-Install.png │ │ ├── Synology_0.2.0_Docker-TA-Env-Conf.png │ │ ├── Synology_0.2.0_Docker-TA-Search.png │ │ ├── Synology_0.3.6_Docker-Folder-Permissions-Commands.png │ │ ├── Synology_0.3.6_Docker-Redis-Search.png │ │ ├── TubeArchivist-ES.png │ │ ├── TubeArchivist-RedisJSON.png │ │ ├── TubeArchivist.png │ │ ├── favicon.ico │ │ ├── icon-add.png │ │ ├── icon-close-blue.png │ │ ├── icon-close-red.png │ │ ├── icon-download.png │ │ ├── icon-gridview.png │ │ ├── icon-listview.png │ │ ├── icon-rescan.png │ │ ├── icon-search.png │ │ ├── icon-seen.png │ │ ├── icon-sort.png │ │ ├── icon-stop.png │ │ ├── icon-substract.png │ │ ├── icon-unseen.png │ │ ├── logo-dark.jpg │ │ ├── stylesheets_example.png │ │ ├── unraid_es_install.png │ │ ├── unraid_redis_install.png │ │ └── unraid_ta_install.png │ ├── channels.md │ ├── configuration │ │ ├── forward-auth.md │ │ ├── ldap.md │ │ └── stylesheets.md │ ├── downloads.md │ ├── faq.md │ ├── fonts │ │ ├── Sen-Bold.ttf.woff │ │ └── Sen-Regular.ttf.woff │ ├── index.md │ ├── installation │ │ ├── docker-compose.md │ │ ├── docker-for-beginners.md │ │ ├── env-vars.md │ │ ├── helm-charts.md │ │ ├── podman.md │ │ ├── proxmox-lxc.md │ │ ├── synology.md │ │ └── unraid.md │ ├── playlists.md │ ├── search.md │ ├── settings │ │ ├── actions.md │ │ ├── application.md │ │ ├── dashboard.md │ │ ├── scheduling.md │ │ └── user.md │ ├── stylesheets │ │ └── style.css │ ├── urls.md │ ├── users.md │ └── video.md ├── mkdocs.yml └── overrides │ └── partials │ ├── copyright.html │ └── integrations │ └── analytics │ └── custom.html ├── requirements-dev.txt └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore test builds 2 | mkdocs/site 3 | 4 | # ignore local cache 5 | mkdocs/.cache/ 6 | 7 | # python 8 | .venv -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # build the docs and load static files into nginx 2 | 3 | FROM python:3.11.8-slim-bookworm AS builder 4 | ENV PATH=/root/.local/bin:$PATH 5 | 6 | RUN apt-get update -y && apt-get install -y libcairo2 7 | 8 | COPY requirements.txt /requirements.txt 9 | RUN pip install --user -r requirements.txt 10 | 11 | RUN mkdir /mkdocs 12 | COPY mkdocs /mkdocs 13 | WORKDIR mkdocs 14 | RUN mkdocs build 15 | 16 | FROM nginx AS srv 17 | COPY --from=builder /mkdocs/site /usr/share/nginx/html 18 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tube Archivist Documentation 2 | 3 | ## [docs.tubearchivist.com](https://docs.tubearchivist.com/) 4 | 5 | This is the git repo of the official documentation for Tube Archivist - Your self hosted YouTube media server. 6 | 7 | Additional links: 8 | - The Project: [tubearchivist/tubearchivist](https://github.com/tubearchivist/tubearchivist) 9 | - The Website: [tubearchivist.com](https://www.tubearchivist.com/) 10 | - The Discord: [tubearchivist.com/discord](https://www.tubearchivist.com/discord) 11 | 12 | ## Make Changes 13 | 14 | Please help improve these documentations. To make changes, fork this repo and make your changes. When you are ready, open a Pull Request. When merged, this will rebuild the live documentations within a few seconds. 15 | 16 | ## Development Environment 17 | 18 | To just make simple changes, edit the markdown files within *mkdocs/docs* directly. 19 | 20 | To setup a local development server: 21 | 22 | Install requirements, e.g. with pip: 23 | ``` 24 | pip install -r requirements.txt 25 | ``` 26 | 27 | More details: [User Guide](https://www.mkdocs.org/user-guide/installation/) 28 | 29 | Run the server from the *mkdocs* folder with: 30 | ``` 31 | mkdocs serve 32 | ``` 33 | 34 | And the site - with live reload enabled - should be available on [localhost:8000](http://localhost:8000/). 35 | 36 | ## Production environment 37 | Build the Docker image: 38 | ``` 39 | docker build -t bbilly1/tubearchivist-docs . 40 | ``` 41 | 42 | Run the image: 43 | ``` 44 | docker run -p 80:80 bbilly1/tubearchivist-docs 45 | ``` 46 | -------------------------------------------------------------------------------- /mkdocs/docs/advanced.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Collection of advanced concepts and debug info. 3 | --- 4 | 5 | # Advanced Notes 6 | 7 | !!! warning "Check Your Backups" 8 | As a general rule of thumb, make sure your backups are up to date before continuing with anything here. 9 | 10 | A loose collection of advanced debug info and actions for experienced users for troubleshooting and resolving issues. The situation or command may or may not apply to you, so only use this when you know what you are doing or as directed. Some of the below functionality might get implemented in the future in the regular UI. 11 | 12 | ## Reactivate documents 13 | As part of the metadata refresh task, **Tube Archivist** will mark videos, channels and playlists as deactivated if they are no longer available on YouTube. Sometimes, they may be marked as deactivated when they shouldn't have, for example if a video got reinstated after a copyright strike on YT. You can reactivate all items in bulk so the refresh task will check them again and deactivate the ones that are actually not available anymore. 14 | 15 | Curl commands to run within the TA container to reactivate documents: 16 | 17 | ??? bug "Videos" 18 | 19 | ```bash 20 | curl -XPOST "$ES_URL/ta_video/_update_by_query?pretty" -u elastic:$ELASTIC_PASSWORD -H "Content-Type: application/json" -d ' 21 | { 22 | "query": { 23 | "term": { 24 | "active": { 25 | "value": false 26 | } 27 | } 28 | }, 29 | "script": { 30 | "source": "ctx._source.active = true", 31 | "lang": "painless" 32 | } 33 | }' 34 | ``` 35 | 36 | ??? bug "Channels" 37 | 38 | ```bash 39 | curl -XPOST "$ES_URL/ta_channel/_update_by_query?pretty" -u elastic:$ELASTIC_PASSWORD -H "Content-Type: application/json" -d ' 40 | { 41 | "query": { 42 | "term": { 43 | "channel_active": { 44 | "value": false 45 | } 46 | } 47 | }, 48 | "script": { 49 | "source": "ctx._source.channel_active = true", 50 | "lang": "painless" 51 | } 52 | }' 53 | ``` 54 | 55 | ??? bug "Playlists" 56 | 57 | ```bash 58 | curl -XPOST "$ES_URL/ta_playlist/_update_by_query?pretty" -u elastic:$ELASTIC_PASSWORD -H "Content-Type: application/json" -d ' 59 | { 60 | "query": { 61 | "term": { 62 | "playlist_active": { 63 | "value": false 64 | } 65 | } 66 | }, 67 | "script": { 68 | "source": "ctx._source.playlist_active = true", 69 | "lang": "painless" 70 | } 71 | }' 72 | ``` 73 | 74 | ## Corrupted ES index reset 75 | After a hard reset of your server, or any other hardware failure, you might experience data corruption. ES can be particularly unhappy about that, especially if the reset happens while it is actively writing to disk. It's very likely that only your `/indices` folder got corrupted, as that is where the regular read/writes happen. Luckily you have your [snapshots](settings/application.md#snapshots) set up. 76 | 77 | !!! warning 78 | Confirm you have an available, recoverable snapshot prior to performing this action. 79 | 80 | ES will not start, if the data is corrupted. So, stop all containers, delete everything *except* the `/snapshot` folder in the ES volume. After that, start everything back up. **Tube Archivist** will create a new blank index. All your snapshots should be available for restore on your settings page, you probably want to restore the most recent one. After restore, run a [filesystem rescan](settings/actions.md#rescan-filesystem) for good measure. 81 | 82 | ## ES mapping migrations troubleshooting 83 | 84 | **Tube Archivist** will apply mapping changes at application startup for certain versions. That usually is needed when changing how an existing field is indexed. This action should be seamless and automatic, but can leave your index in a messed up state if that process gets interrupted for any reason. Common reasons could be that if you artificially limit the memory to the container, disabling the OS to dynamically manage that, or if you don't have enough available storage on the ES volume, or if you interrupt that because of your impatience (don't do that). 85 | 86 | In general the mapping update process is as follows: 87 | 88 | 1. Compare existing mapping with predefined expected mapping 89 | 1. If that is identical, there is nothing to do 90 | 1. Else create a `_backup` of the existing index 91 | 1. Delete the original index and create a new empty one with the new mapping in place 92 | 1. Copy over the previously created `_backup` index to apply the new mappings 93 | 1. Delete the now leftover `_backup` index. 94 | 95 | If you are not sure if anything is happening, you can monitor your index and `docs.count` value for each index. Those values should change over time during the process and you should get an indicator of progress happening: 96 | 97 | From within the ES container: 98 | 99 | ```bash 100 | curl -u elastic:$ELASTIC_PASSWORD "localhost:9200/_cat/indices?v&s=index" 101 | ``` 102 | 103 | If that process gets interrupted before deleting the `_backup` index and you try to run this again, you will see an error like `resource_already_exists_exception`, for example `index [ta_comment_backup/...] already exists` indicating in this case that your migration previously failed for the `ta_comment` index. 104 | 105 | First, make sure you still have the original index with the command above. After verifying, stop the TA container, then you can delete the `_backup` index, e.g. in the case of `ta_comment_backup`. 106 | 107 | ```bash 108 | curl -XDELETE -u elastic:$ELASTIC_PASSWORD "localhost:9200/ta_comment_backup?pretty" 109 | ``` 110 | 111 | and you should get: 112 | ```json 113 | { 114 | "acknowledged" : true 115 | } 116 | ``` 117 | 118 | Then you can restart the container and the migration will run again. If your error persists, the ES and TA logs should give additional debug info. 119 | 120 | ## Manual yt-dlp update 121 | !!! warning 122 | Doing this is **very likely** going to break things for you. You will want to try this out on a testing instance first. Regularly there have been subtle changes in the yt-dlp API, so only do this if you know how to debug this project by yourself, but obviously share your fixes so any problems can be dealt with before release. 123 | 124 | !!! info 125 | There are also [unstable builds](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#beta-testing) available, they might already have the latest yt-dlp version. 126 | 127 | This project strives for timely updates when yt-dlp makes a new release, but sometimes ideals meet reality. Also, sometimes yt-dlp has a fix published, but not yet released. 128 | 129 | **Build your own image**: Update the version in `requirements.txt` and rebuild the image from `Dockerfile`. This will use your own image, even on container rebuild. 130 | 131 | **Update yt-dlp on its own**: You can also update the yt-dlp library alone in the container. 132 | 133 | - Restart your container for changes to take effect. 134 | - These changes won't persist a container rebuild from image. 135 | 136 | Update to newest regular yt-dlp release: 137 | 138 | ```bash 139 | pip install --upgrade yt-dlp 140 | ``` 141 | 142 | To update to nightly you'll have to specify the correct `--target` folder: 143 | ```bash 144 | pip install \ 145 | --upgrade \ 146 | --target=/root/.local/bin \ 147 | https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz 148 | ``` 149 | This is obviously particularly likely to create problems. Also note that the `--version` command will only show the latest regular release, not a nightly version mentioned. 150 | 151 | ## Erase errors from download queue 152 | Sometimes videos will fail to download. That can be because of expected errors: 153 | 154 | - A video is no longer available for download. 155 | 156 | That is not recoverable. 157 | 158 | Other kind of errors *are* recoverable, for example: 159 | 160 | - You got temporarily rate limited. 161 | - Your internet connection dropped out. 162 | 163 | Failed downloads won't get retried again as they require your intervention. You can click on **Download Now** on a video in the queue to verify, if a video became available again. 164 | 165 | If you know that all errors are resolved you can bulk clear. Run this from within the TA container: 166 | 167 | ???+ bug "Erase Errors" 168 | ```bash 169 | curl -X POST "$ES_URL/ta_download/_update_by_query?pretty" -u elastic:$ELASTIC_PASSWORD -H 'Content-Type: application/json' -d' 170 | { 171 | "script": { 172 | "source": "ctx._source.message = null", 173 | "lang": "painless" 174 | }, 175 | "query": { 176 | "match_all": {} 177 | } 178 | } 179 | ' 180 | ``` 181 | -------------------------------------------------------------------------------- /mkdocs/docs/api/docs.md: -------------------------------------------------------------------------------- 1 | # API Documentation 2 | 3 | !!! note 4 | Complete API documentation is available on your **Tube Archivist** instance at `/api/docs/`. 5 | 6 | TODO: Figure out how to host/serve/display a copy of the documentation here from a generated `api-schema.json` file. 7 | -------------------------------------------------------------------------------- /mkdocs/docs/api/introduction.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | This page has a generic overview with how the Tube Archivist API functions. This is the place to start. 4 | 5 | !!! note 6 | These API endpoints *have* changed in the past and *will* change again while building out additional integrations and functionality. For the time being, don't expect backwards compatibility for third party integrations using these endpoints. 7 | 8 | !!! note 9 | Endpoints marked as **experimental** are particularly likely to change again. 10 | 11 | !!! note 12 | Not all endpoints will return expected status codes for errors, e.g. sometimes you'll see an error **500 Server Error** even though it should be **400 Bad request**. If you encounter any such cases, [please fix them](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#how-to-make-a-pull-request) as you find them, no need to clutter up the issue queue. 13 | 14 | !!! note 15 | If you are sending POST requests to the API, you'll have to specify the content type as json like so: `"Content-Type: application/json"`. 16 | 17 | ## Context 18 | - All changes to the API are marked with a `[API]` keyword for easy searching, for example search for [commits](https://github.com/tubearchivist/tubearchivist/search?o=desc&q=%5Bapi%5D&s=committer-date&type=commits). You'll find the same in the [release notes](https://github.com/tubearchivist/tubearchivist/releases). 19 | - Check the commit history and release notes to see if a documented feature is already in your release. The documentation might be ahead of the regular release schedule. 20 | 21 | ## Authentication 22 | API token will get automatically created, accessible on the settings page. Token needs to be passed as an authorization header with every request. Additionally session based authentication is enabled too: When you are logged into your TubeArchivist instance, you'll have access to the api in the browser for testing. 23 | 24 | Curl example: 25 | ```shell 26 | curl -v /api/video// \ 27 | -H "Authorization: Token xxxxxxxxxx" 28 | ``` 29 | 30 | Python requests example: 31 | ```python 32 | import requests 33 | 34 | url = "/api/video//" 35 | headers = {"Authorization": "Token xxxxxxxxxx"} 36 | response = requests.get(url, headers=headers) 37 | ``` 38 | 39 | ## Pagination 40 | The list views return a paginate object with the following keys: 41 | 42 | - page_size: *int* current page size set in config 43 | - page_from: *int* first result idx 44 | - prev_pages: *array of ints* of previous pages, if available 45 | - current_page: *int* current page from query 46 | - max_hits: *bool* if max of 10k results is reached 47 | - params: *str* additional url encoded query parameters 48 | - last_page: *int* of last page link 49 | - next_pages: *array of ints* of next pages 50 | - total_hits: *int* total results 51 | 52 | Pass page number as a query parameter: `page=2`. Defaults to *0*, `page=1` is redundant and falls back to *0*. If a page query doesn't return any results, you'll get `HTTP 404 Not Found`. 53 | -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-ES-Env-Conf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-ES-Env-Conf.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-ES-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-ES-Search.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-Folder-Create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-Folder-Create.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-Folder-Structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-Folder-Structure.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-Install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-Install.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-TA-Env-Conf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-TA-Env-Conf.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.2.0_Docker-TA-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.2.0_Docker-TA-Search.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.3.6_Docker-Folder-Permissions-Commands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.3.6_Docker-Folder-Permissions-Commands.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/Synology_0.3.6_Docker-Redis-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/Synology_0.3.6_Docker-Redis-Search.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/TubeArchivist-ES.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/TubeArchivist-ES.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/TubeArchivist-RedisJSON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/TubeArchivist-RedisJSON.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/TubeArchivist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/TubeArchivist.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/favicon.ico -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-add.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-close-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-close-blue.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-close-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-close-red.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-download.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-gridview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-gridview.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-listview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-listview.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-rescan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-rescan.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-search.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-seen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-seen.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-sort.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-stop.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-substract.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-substract.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/icon-unseen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/icon-unseen.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/logo-dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/logo-dark.jpg -------------------------------------------------------------------------------- /mkdocs/docs/assets/stylesheets_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/stylesheets_example.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/unraid_es_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/unraid_es_install.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/unraid_redis_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/unraid_redis_install.png -------------------------------------------------------------------------------- /mkdocs/docs/assets/unraid_ta_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/assets/unraid_ta_install.png -------------------------------------------------------------------------------- /mkdocs/docs/channels.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Subscribe to channels, browse your channels and access additional metadata. 3 | --- 4 | 5 | # Channels Pages 6 | 7 | The channels are organized on two different levels, similar to the [playlists](playlists.md): 8 | 9 | ## Channels Overview 10 | Accessible at `/channel/` of your **Tube Archivist** instance, the **Overview Page** shows a list of all channels you have indexed. 11 | 12 | - You can filter that list to show or hide subscribed channels with the toggle. Clicking on the channel banner or the channel name will direct you to the [*Channel Detail Page*](channels.md#channel-detail). 13 | - If you are subscribed to a channel, an *Unsubscribe* button will show. If you aren't subscribed, a *Subscribe* button will show, instead. 14 | 15 | The **Subscribe to Channels** button add icon opens a text field to subscribe to a channel. You have a few options: 16 | 17 | - Enter a [channel](urls.md#channel). 18 | - Enter a [video](urls.md#video), and let **Tube Archivist** extract the channel ID for you. 19 | - Add one per line. 20 | 21 | To search your channels, click on the search icon search icon to reach the search page. Start your query with `channel:` - learn more on the [search](search.md) page. 22 | 23 | ## Channel Detail 24 | Each channel gets a set of channel detail pages. 25 | 26 | - If you are subscribed to the channel, an *Unsubscribe* button will show, otherwise the *Subscribe* button will show. 27 | - You'll see some statistics of the channel, like how many videos you have, total playback and total size. That aggregation is based on your filter, e.g. if you toggle *Hide watched*, the aggregation will be over your unwatched videos only. 28 | - The **Mark as Watched** and **Mark as Unwatched** buttons will mark all videos of this channel as watched/unwatched. 29 | 30 | ### Videos 31 | Accessible at `/channel//`, this page shows all the videos you have downloaded from this channel. 32 | 33 | ### Streams 34 | If you have any streams indexed, this page will become accessible at `/channel//streams/`, this page shows all available live streams of that channel. 35 | 36 | ### Shorts 37 | If you have any shorts videos indexed, this page will become accessible at `/channel//shorts/`, this page shows all the shorts videos of that channel. 38 | 39 | ### Playlists 40 | If you have playlists from this channel indexed, this page will become accessible at `/channel//playlist/`. Activate channel playlist indexing on the [About page](channels.md#about). 41 | 42 | ### About 43 | On the *Channel About* page, accessible at `/channel//about/`, you can see additional metadata. 44 | 45 | - The button **Delete Channel** will delete the channel plus all videos of this channel, both media files and metadata. Additionally, this will also delete playlists metadata belonging to that channel. 46 | - The button **Reindex** will reindex all channel metadata. This will also categorize existing videos as shorts or streams. 47 | - The button **Reindex Videos** will reindex metadata for all videos in this channel. 48 | 49 | If available, you can find the channel description and channel tags here. 50 | 51 | The channel customize form gives options to change settings on a per channel basis. Any configurations here will overwrite your configurations from the [settings](settings/application.md) page. 52 | 53 | #### Download Format 54 | Overwrite the download quality for videos from this channel. 55 | 56 | #### Auto Delete 57 | Automatically delete watched videos from this channel after selected days. 58 | 59 | #### Index Playlists 60 | Automatically add all Playlists with at least a video downloaded to your index. Only do this for channels where you care about playlists as this will slow down indexing new videos because each video will need to check if it belongs to each indexed playlist. This works best if a channel creates playlists containing videos from that channel. Also see [subscribing to Playlist](playlists.md/#playlist-overview). 61 | 62 | #### SponsorBlock 63 | Using [SponsorBlock](https://sponsor.ajay.app/) to get and skip sponsored content. Customize per channel: You can *disable* or *enable* SponsorBlock for certain channels only to overwrite the behavior set on the [settings](settings/application.md) page. Selecting *reset* will remove the overwrite and your setting will fall back to the default on the settings page. 64 | 65 | #### Page Size Overrides 66 | This will overwrite the page size per channel as described in the [settings](settings/application.md#subscriptions). By setting a value to `0` (zero) you can effectively deactivate shorts on this channel, for example. 67 | 68 | ### Downloads 69 | If you have any videos from this channel pending in the download queue, a *Downloads* link will show, bringing you directly to the [downloads](downloads.md) page, filtering the list by the selected channel. 70 | -------------------------------------------------------------------------------- /mkdocs/docs/configuration/forward-auth.md: -------------------------------------------------------------------------------- 1 | You can enable support for authentication proxies such as Authelia, Authentik, etc. 2 | 3 | This effectively disables credentials-based authentication and instead authenticates users if a specific request header contains a known username. 4 | You must make sure that your proxy (nginx, Traefik, Caddy, ...) forwards this header from your auth proxy to Tube Archivist. 5 | Check the documentation of your auth proxy and your reverse proxy on how to correctly set this up. 6 | 7 | Warning: 8 | 9 | If you've successfully authenticated using this method, you will not have administrative rights to the Dashboard. To fix this, you need to comment out the three environment variables, restart the instance, log in with the local account, and grant administrative rights to the automatically added user in the user management interface, which is located at https://youriporfqdn.local/settings/user/.After that, uncomment the previously commented variables, restart your instance again, you should now have administrative right on your next authentication. 10 | 11 | Note that this automatically creates new users in the database if they do not already exist. 12 | 13 | | Environment Variable | Example | Description | 14 | | :------------------- | :------ | :---------- | 15 | | `TA_ENABLE_AUTH_PROXY` | `true` | Set to anything besides empty string to use forward proxy authentication. | 16 | | `TA_AUTH_PROXY_USERNAME_HEADER` | `HTTP_REMOTE_USER` | The name of the request header that the auth proxy passes to the proxied application (**Tube Archivist** in this case), so that the application can identify the user. Check the documentation of your auth proxy to get this information.[^1][^2] | 17 | | `TA_AUTH_PROXY_LOGOUT_URL` | | The URL that **Tube Archivist** should redirect to after a logout. By default, the logout redirects to the login URL, which means the user will be automatically authenticated again. Instead, you might want to configure the logout URL of the auth proxy here. | 18 | 19 | [^1]: 20 | The request headers are rewritten within **Tube Archivist**: all HTTP headers are prefixed with `HTTP_`, all letters are in uppercase, and dashes are replaced with underscores. For example, for Authelia, which passes the `Remote-User` HTTP header, the `TA_AUTH_PROXY_USERNAME_HEADER` needs to be configured as `HTTP_REMOTE_USER`. 21 | 22 | [^2]: 23 | For Authentik behind NPM Proxy Manager: 24 | 25 | 1. Set the 'TA_AUTH_PROXY_USERNAME_HEADER' TO: 26 | - TA_AUTH_PROXY_USERNAME_HEADER=HTTP_X_AUTHENTIK_USERNAME 27 | 28 | 2. In NPM Proxy Manager in the advance tab of your Proxy host modify the default sections of the setup script that was pulled from your proxy provider that starts with: '# This section should be uncommented when the "Send HTTP Basic authentication" option is 29 | enabled in the proxy provider' with the following: 30 | 31 | THIS: 32 | # auth_request_set $authentik_auth $upstream_http_authorization; 33 | # proxy_set_header Authorization $authentik_auth; 34 | 35 | BECOMES THIS: 36 | # auth_request_set $authentik_username $upstream_http_x_authentik_username; 37 | # proxy_set_header X-Authentik-Username $authentik_username; 38 | 39 | 40 | -------------------------------------------------------------------------------- /mkdocs/docs/configuration/ldap.md: -------------------------------------------------------------------------------- 1 | You can enable and configure LDAP with the following environment variables: 2 | 3 | | Environment Variable | Default | Example | Description | 4 | | :-------------------- | :-------- | :-------- | :------------ | 5 | | `TA_LDAP` | `false` | `true` | Set to anything besides empty string to use LDAP authentication **instead** of local user authentication. | 6 | | `TA_LDAP_SERVER_URI` | `null` | `ldap://ldap-server:389` | Set to the uri of your LDAP server. | 7 | | `TA_LDAP_DISABLE_CERT_CHECK` | `null` | `true` | Set to anything besides empty string to disable certificate checking when connecting over LDAPS. | 8 | | `TA_LDAP_BIND_DN` | `null` | `uid=search-user,ou=users,dc=your-server` | DN of the user that is able to perform searches on your LDAP account. | 9 | | `TA_LDAP_BIND_PASSWORD` | `null` | `yoursecretpassword` | Password for the search user. | 10 | | `TA_LDAP_USER_ATTR_MAP_USERNAME` | `uid` | `uid` | Bind attribute used to map LDAP user's username | 11 | | `TA_LDAP_USER_ATTR_MAP_PERSONALNAME` | `givenName` |`givenName` | Bind attribute used to match LDAP user's First Name/Personal Name. | 12 | | `TA_LDAP_USER_ATTR_MAP_SURNAME` | `sn` |`sn` | Bind attribute used to match LDAP user's Last Name/Surname. | 13 | | `TA_LDAP_USER_ATTR_MAP_EMAIL` | `mail` |`mail` | Bind attribute used to match LDAP user's EMail address | 14 | | `TA_LDAP_USER_BASE` | `null` | `ou=users,dc=your-server` | Search base for user filter. | 15 | | `TA_LDAP_USER_FILTER` | `null` | `(objectClass=user)` | Filter for valid users. Login usernames are matched using the attribute specified in `TA_LDAP_USER_ATTR_MAP_USERNAME` and should not be specified in this filter. | 16 | 17 | While LDAP authentication is enabled, the django-managed passwords (e.g. the password defined in TA_PASSWORD), will not allow you to login. Only the LDAP server is used for authentication. -------------------------------------------------------------------------------- /mkdocs/docs/configuration/stylesheets.md: -------------------------------------------------------------------------------- 1 | You can change the appearance of **Tube Archivist** by selecting a stylesheet in Settings under User Configurations. 2 | 3 | ## Adding a Stylesheet 4 | 5 | Assuming a default configuration, stylesheets are stored in `/app/static/css` in the `tubearchivist` container. This is where the `custom.css` stylesheet can be added and selected as `Custom` in the user settings. 6 | 7 | The recommended method for adding this stylesheet is to mount it in the `docker-compose.yml`, to the `tubearchivist` volume section. If `custom.css` is located in the same directory as the `docker-compose.yml` file you can use: 8 | 9 | ???+ example 10 | ```yaml 11 | volumes: 12 | - media:/youtube 13 | - cache:/cache 14 | - ./custom.css:/app/static/css/custom.css 15 | ``` 16 | 17 | ## Creating Stylesheets 18 | 19 | **Tube Archivist** applies the `style.css` stylesheet before applying the user's selected stylesheet. 20 | 21 | You can use the default `custom.css` theme as a template to create your own. You can get it from the repo [here](https://github.com/tubearchivist/tubearchivist/blob/master/frontend/public/css/custom.css). 22 | 23 | The `:root` pseudo-class contains variables that are frequently used in `style.css` for consistent theming. However, not all changes need to be made in `:root`. Classes, IDs, and HTML tags can have their properties overridden by simply declaring new properties. 24 | 25 | For example, the following addition to a custom stylesheet would make all `p` tags have a cursive font. 26 | 27 | ???+ example 28 | ```css 29 | p { 30 | font-family: cursive; 31 | } 32 | ``` 33 | 34 | To create a stylesheet, any selectable stylesheet should be used as a base. Changes can then be made as needed. Changes can be previewed easily by editing the existing stylesheet in real-time through your browser's developer tools. Below is an example of editing the `dark.css` stylesheet through Firefox's developer tools. 35 | 36 | ![TubeArchivist](../assets/stylesheets_example.png) 37 | 38 | Note that live changes will be lost when the page is refreshed. Copy and save the changes to prevent data loss. -------------------------------------------------------------------------------- /mkdocs/docs/downloads.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Populate your download queue by rescanning your Subscriptions or manually adding items to the download queue. 3 | --- 4 | 5 | # Downloads Page 6 | Accessible at `/downloads/` of your **Tube Archivist** instance, this page handles all the download functionality. 7 | 8 | 9 | ## Rescan Subscriptions 10 | The **Rescan Subscriptions** icon rescan icon will start a background task to look for new videos from the channels and playlists you are subscribed to. 11 | 12 | **Tube Archivist** will get available *videos*, *shorts* and *streams* from each channel. You can define the channel and playlist page size on the [settings page](settings/application.md#subscriptions). With the default page size, expect this process to take around 2-3 seconds for each channel or playlist you are subscribed to. A status message will show the progress. 13 | 14 | Then for every video found, **Tube Archivist** will skip the video if it has already been downloaded or if you added it to the *ignored* list previously. All other videos will get added to the download queue. Expect this to take around 2 seconds for each video as **Tube Archivist** needs to grab some additional metadata and artwork. New videos will get added to the end of the download queue. 15 | 16 | ## Download Queue 17 | The **Start Download** icon download icon will start the download process. This will prioritize videos added as *auto start* or as *download now*, starting from the top of the queue. Once the process has started, a progress message will show with additional details and controls: 18 | 19 | - The stop icon stop icon will gracefully stop the download process, once the current video has been finished successfully. This will also reset the auto start behavior to avoid confusion. 20 | - [Currently broken] The cancel icon close icon is equivalent to killing the process and will stop the download immediately. Any leftover files will get deleted, the canceled video will still be available in the download queue. 21 | 22 | After downloading, **Tube Archivist** tries to add new videos to already indexed playlists and, if activated on the settings page, get comments for the new videos. 23 | 24 | ## Add to Download Queue 25 | The **Add to Download Queue** icon add icon opens a text field to manually add videos to the download queue. Add one item per line. The *Add to queue* will add the videos as regular items to the queue, where you'll be able to ignore undesired videos before starting the queue. If you add them with *Download Now*, this will start the download automatically with priority. 26 | 27 | You have a few options: 28 | 29 | ### Videos 30 | Add a [video](urls.md#video) URL to download a single video. 31 | 32 | ### Channels 33 | Add a [channel](urls.md#channel) to download the complete channel, or a [channel sub page](urls.md#channel-subpages) to download a partial channel. 34 | 35 | ### Playlist 36 | Add a [playlist](urls.md#playlist) to download all videos in the list. When adding a playlist to the queue, this playlist will automatically get [indexed](playlists.md#playlist-detail). 37 | 38 | ## The Download Queue 39 | Below the three action buttons is the download queue. New items will get added to the end of the queue, the next video to download once you click on **Start Download** will be the first in the list. 40 | 41 | You can filter the download queue with the **filter** dropdown box, the filter will show once you have more than one channel in the download queue. Select the channel to filter by name, the number in parentheses indicates how many videos you have pending from this channel. Reset the filter by selecting *all* from the dropdown. This will generate links for the top 30 channels with pending videos. 42 | 43 | Every video in the download queue has two buttons: 44 | 45 | - **Ignore**: This will remove that video from the download queue and this video will not get added again, even when you **Rescan Subscriptions**. 46 | - **Download now**: This will give priority to this video. If the download process is already running, the prioritized video will get downloaded as soon as the current video is finished. If there is no download process running, this will start downloading this single video and stop after that [currently broken - after downloading the selected video, it will currently go through the entire queue]. 47 | 48 | Failed videos will show an error message of what went wrong and will give you additional options with how to continue. Usually this means the video in the queue is no longer available on YouTube. **Tube Archivist** will not retry to download a failed video. 49 | 50 | You can flip the view by activating **Show Only Ignored Videos**. This will show all videos you have previously *ignored*. 51 | Every video in the ignored list has two buttons: 52 | 53 | - **Forget**: This will delete the item from the ignored list. 54 | - **Add to Queue**: This will add the ignored video back to the download queue. 55 | 56 | You can delete your download queue from the [Settings](settings/actions.md) page. 57 | -------------------------------------------------------------------------------- /mkdocs/docs/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Frequently asked questions about what this project is, what it tries and what it doesn't try to do. 3 | --- 4 | 5 | # Frequently Asked Questions 6 | 7 | ## What is the scope of this project? 8 | **Tube Archivist** is *Your self-hosted YouTube media server*, which also defines the primary scope of what this project tries to do: 9 | 10 | - **Self-hosted**: This assumes you have full control over the underlying operating system and hardware and can configure things to work properly with Docker, it's volumes and networks as well as whatever disk storage and filesystem you choose to use. 11 | - **YouTube**: Downloading, indexing and playing videos from YouTube, there are currently no plans to expand this to any additional platforms. 12 | - **Media server**: This project tries to be a stand-alone media server in its own web interface. 13 | 14 | Additionally, progress is also happening to provide the following core capabilities: 15 | 16 | - **API**: Endpoints for additional integrations. 17 | - **Browser Extension**: To integrate between youtube.com and **Tube Archivist**. 18 | 19 | Defining the scope is important for the success of any project: 20 | 21 | - A scope too broad will result in development effort spreading too thin and will run into danger that this project tries to do too many things and none of them well. 22 | - A scope too narrow will make this project uninteresting and will exclude audiences that could also benefit from this project. 23 | - Not defining a scope will easily lead to misunderstandings and false hopes of where this project tries to go. 24 | 25 | Of course, this is subject to change: The scope can be expanded as this project continues to grow and more people contribute. 26 | 27 | ## How do I import my videos to Emby-Plex-Jellyfin-Kodi? 28 | Although there are similarities between these excellent projects and **Tube Archivist**, they have a very different use case. Trying to fit the metadata relations and database structure of a YouTube archival project into these media servers that specialize in Movies and TV shows is always going to be limiting. 29 | 30 | Part of the scope is to be its own media server, to be able to overcome these limitations, so that's where the focus and effort of this project is. That being said, the nature of self-hosted and open source software gives you all the possible freedom to use your media as you wish. 31 | 32 | - **Jellyfin**: There is a Jellyfin Plugin available to sync metadata to JF: [tubearchivist/tubearchivist-jf-plugin](https://github.com/tubearchivist/tubearchivist-jf-plugin). Follow the instructions there. Please contribute to improve this plugin. 33 | - **Plex**: There is a Plex Scanner and Agent combination that allows integration between **Tube Archivist** and Plex: [tubearchivist/tubearchivist-plex](https://github.com/tubearchivist/tubearchivist-plex). Follow the instructions there. Please contribute to improve this integration. 34 | 35 | ## How do I install this natively? 36 | This project is natively a container-based Docker application: There are multiple moving parts that need to be able to interact with each other and need to be compatible with multiple architectures and operating systems. Additionally, Docker also drastically reduces development complexity which is highly appreciated. 37 | 38 | Docker is the only supported installation method. If you don't have any experience with Docker, consider investing the time to learn this very useful technology. Alternatively, you can find user provided installation instructions for Podman [here](installation/podman.md). 39 | 40 | ## How do I install this on Windows? 41 | The only supported methodology is through Docker on Windows. We don't currently have dedicated installation instructions for Windows, however users have reported that they have been successful in getting it to work using docker and docker-compose through WSL (Windows Subsystem for Linux) with modification of the base `docker-compose.yml`. Try following the [Docker Compose](installation/docker-compose.md) instructions. 42 | 43 | 44 | ## Where is the .exe/.rpm/.pkg/.msi/<insert installer here>? 45 | As noted [here](faq.md#how-do-i-install-this-natively), this project is largely focused on container-based applications. We are not looking to support cross-platform for a small user base. It is not on our roadmap to support any additional installation types or be included as part of additional installation package manager solutions. However, this is an open source project and we won't stop the community from providing those packages. If you do decide to do so, please contribute to our installation instructions and point to your created resources. Pay attention to any licensing requirements for dependencies. 46 | 47 | ## How do I finetune Elasticsearch? 48 | A recommended configuration of Elasticsearch (ES) is provided in the example docker-compose.yml file. ES is highly configurable and very interesting to learn more about. Refer to the [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html) if you want to get into it. 49 | 50 | All testing is done with the recommended configuration, changing that can create hard to debug and randomly occurring problems, so use at your own risk. 51 | 52 | ## Why Elasticsearch? 53 | That might be an unconventional choice at first glance. **Tube Archivist** is built to scale to 100k+ videos without slowing down and to 1M+ with only minimal impact on performance, with full text indexing and searching over your subtitles and comments. Elasticsearch is the industry standard [citation needed] for a task like that and through its structured query language allows for a very flexible interface to query the index. 54 | 55 | That comes at a price: ES can use a lot of memory, particularly on a big index, and will heavily use in-memory cached queries to be able to respond within milliseconds, even when searching through multiple GBs of raw text. 56 | 57 | ## Why does subscribing to a channel not download the complete channel? 58 | For **Tube Archivist**, these are two different actions: To download a complete channel, add it to the [download queue](downloads.md#add-to-download-queue) with the form or with [Tube Archivist Companion](https://github.com/tubearchivist/browser-extension), the browser extension. This is meant for a complete archival. 59 | 60 | Subscribing to a channel is for downloading new videos as they come out. That is designed to be as quick as possible, to allow you to efficiently rescan your favourite channels frequently. This will add videos to your download queue based on your [channel page size](settings/application.md#subscriptions). 61 | 62 | If you want to archive the complete channel **and** any future videos, you can do both. 63 | 64 | ## How do I tunnel all traffic from this container? 65 | Using a Proxy/VPN can be advantages for heavy users of this project. Some users have reported throttling issues from residential IP address ranges. You might be able to avoid that with a shared IP from a Proxy/VPN. 66 | 67 | This project doesn't make any recommendations: Some people prefer to convert their home router to a VPN client, some have a home firewall capable of routing traffic, some prefer to set up their host network as a client and others prefer to use a networking container to tunnel container traffic through. Some prefer one of the many proxy protocols, others use various OpenVPN configurations, others use WireGuard. 68 | 69 | There are too many variations of that problem to be implemented in this project, use any of the various solutions out there that fits your needs. 70 | 71 | ## Why is there no flexible naming structure? 72 | Unlike other similar projects, **Tube Archivist** needs to keep track of its media files indefinitely while everything can change: Channel names and aliases and titles regularly change over time. Previous attempts failed at handling that properly, causing data loss in some edge cases and breaking things and causing other unexpected behavior. 73 | 74 | This project tries to be compatible with as many filesystem/OS variations out there as possible. Using channel names and titles to build file paths that can be any Unicode character is a flawed and highly error prone approach of doing that. There is always a filesystem/OS out there that proves to be incompatible with how something is named. 75 | 76 | That's why this project has landed on `/.mp4`. These values are guaranteed to be static, unique and compatible with every file system out there and make things predictable where all files will go on every instance of **Tube Archivist** indefinitely. 77 | 78 | For browsing these files you have the fancy interface provided by this project, or use a supported integration as stated above. If you really want to, you could easily also create your own file naming structure with the API and symlinks, but that is not part of the scope of this project. 79 | 80 | ## Does this project implement feature X? 81 | Generic answer to that question is: 82 | 83 | - If it's documented, it's implemented. 84 | 85 | And the reverse would be: 86 | 87 | - If it's *not* documented, it's (probably) *not* implemented. 88 | 89 | Read the [docs](https://docs.tubearchivist.com/) with a comprehensive overview of what this project does. If something is missing in the docs, add it there. Check the roadmap and open feature requests on GH for what is planned. Make sure to read how to open a [feature request](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md) before adding your own. 90 | 91 | ## Am I getting blocked/throttled? 92 | 93 | Heavy users of this project can run into the danger of getting blocked / throttled or soft banned from YouTube. Symptoms might not be obvious and the error messages cryptic. Users have reported messages and behavior like: 94 | 95 | - `Sign in to confirm you’re not a bot. This helps protect our community.` 96 | - `Playlists that require authentication may not extract correctly without a successful webpage download` but you aren't downloading a private playlist, a sign that YouTube is blocking your requests behind authentication. 97 | - `Requested format is not available. Use --list-formats for a list of available formats` but your download format is valid, a sign that yt-dlp can't extract available streams because your request gets blocked. 98 | - `Got error: HTTP Error 403: Forbidden` a generic HTTP message that YouTube is blocking your request. 99 | - Your download speed suddenly drops to a few KB/s. 100 | 101 | There are other error messages that show up from time to time and may affect only part of the download request. YouTube is frequently changing their tactics to combat the generally larger influx of automated downloads. 102 | 103 | **Solutions** 104 | 105 | - Wait and try again, these blocks might get lifted somewhere between a day or a week. 106 | - As described above, use a VPN or proxy to change your public IP, rotate every so often. 107 | - In some cases if you are using [your cookie](settings/application.md#cookie), this can be an account level ban and YouTube will block all requests from that cookie/account. Sometimes refreshing your cookie will work around that, but most likely only temporarily. Only known solution for these cases is to remove your cookie. 108 | - Conversely in some cases, adding your cookie can be a solution if you didn't use your cookie previously, as user authenticated requests are sometimes allowed to pass. 109 | -------------------------------------------------------------------------------- /mkdocs/docs/fonts/Sen-Bold.ttf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/fonts/Sen-Bold.ttf.woff -------------------------------------------------------------------------------- /mkdocs/docs/fonts/Sen-Regular.ttf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tubearchivist/docs/b8ed98f066c0e65bdeb283e3547e80ff6adb14e5/mkdocs/docs/fonts/Sen-Regular.ttf.woff -------------------------------------------------------------------------------- /mkdocs/docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Home of the documentation, additional installation instructions and user guide. Recommended reading for all interested in the project. 3 | --- 4 | 5 | # Tube Archivist 6 | Welcome to the official Tube Archivist Docs. This is an up-to-date documentation of user functionality. 7 | 8 | ## Getting Started 9 | 10 | 1. [Subscribe](channels.md#channels-overview) to some of your favourite YouTube channels. 11 | 2. [Scan](downloads.md#rescan-subscriptions) subscriptions to add the latest videos to the download queue. 12 | 3. [Add](downloads.md#add-to-download-queue) additional videos, channels or playlist - ignore the ones you don't want to download. 13 | 4. [Download](downloads.md#download-queue) and let **Tube Archivist** do it's thing. 14 | 5. Sit back and enjoy your archived and indexed collection! 15 | 16 | ## General Navigation 17 | * Clicking on the channel name or the channel icon brings you to the dedicated channel page to show videos from that channel. 18 | * Clicking on a video title brings you to the dedicated video page and shows additional details. 19 | * Clicking on a video thumbnail opens the video player and starts streaming the selected video. 20 | * Clicking on the search icon gridview icon will open a dedicated search page to search over your complete index. 21 | * The pagination - if available - builds links for up to 10'000 results, use the search, sort or filter functionality to find what you are looking for. 22 | 23 | 24 | An empty checkbox icon unseen icon will show for videos you haven't marked as watched. Click on it and the icon will change to a filled checkbox seen icon indicating it as watched - click again to revert. 25 | 26 | When available, the gridview icon gridview icon will display the list in a grid. A grid row holds 3 items by default, use the listview icon icon to add more or the listview icon icon to remove items per row, depending on your screen size. The listview icon listview icon will arrange the items in a list. The sort icon listview icon will open additional sort options. 27 | 28 | You can control the video player with the following keyboard shortcuts: 29 | 30 | - `?`: Show help 31 | - `m`: toggle mute 32 | - `f`: toggle fullscreen 33 | - `c`: toggle subtitles if available 34 | - `>`: increase playback speed 35 | - `<`: decrease playback speed 36 | - `←` (left arrow): jump back 5 seconds 37 | - `→` (right arrow): jump forward 5 seconds 38 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/docker-compose.md: -------------------------------------------------------------------------------- 1 | # Setting up Tube Archivist with Docker 2 | 3 | ## Overview 4 | 5 | **Tube Archivist** depends on three containers: 6 | 7 | 1. The **Tube Archivist** container running the main application 8 | 2. Redis for queue and cache storage 9 | 3. ElasticSearch for your index. 10 | 11 | !!! info 12 | All environment variables are documented at [installation/Environment Variables](env-vars.md). 13 | 14 | !!! info 15 | Also see [installation/Docker for Beginners](docker-for-beginners.md) explaining some core concepts of docker and docker compose. 16 | 17 | **Tube Archivist** requires Docker. Please make sure that Docker is installed and running on your computer before continuing. 18 | 19 | Also see: 20 | 21 | - [faq/How do I install this natively?](../faq.md#how-do-i-install-this-natively) 22 | - [faq/Where is the .exe/.rpm/.pkg/.msi/<insert installer here>?](../faq.md#where-is-the-exerpmpkgmsiinsert-installer-here). 23 | 24 | For minimal system requirements, the **Tube Archivist** stack needs around 2GB of available memory for a small testing setup and around 4GB of available memory for a mid to large sized installation. Minimum requirements for CPU are usually expected to be dual core with 4 threads, with better performance coming from quad core and higher, and more available threads. 25 | 26 | !!! info 27 | For **arm64**: **Tube Archivist** is built as a multi-architecture (multi-arch) container, same for Redis. Elasticsearch should use the official image for arm64 support. Other architectures are not supported. 28 | 29 | !!! bug "Untested" 30 | ARM64 builds are essentially untested, as none of the devs have access to any ARM64 devices. There are regular unstable builds, for both architecture platforms. Help with testing to verify things are working as expected, also on ARM64. 31 | 32 | 33 | Save the [docker-compose.yml](https://github.com/tubearchivist/tubearchivist/blob/master/docker-compose.yml) file from the **Tube Archivist** repository somewhere permanent on your system, keeping it named `docker-compose.yml`. You'll need to refer to it whenever starting this application. 34 | 35 | ## Install **Tube Archivist** 36 | 37 | !!! Quickstart 38 | All you really _need_ to configure is the [`TA_HOST`](env-vars.md#ta_host) environment variable. 39 | 40 | ### Networking 41 | The main container serves the interface on port `8000` with Nginx. Nginx is packaged in the container and serves the static files and handles proxy requests to the backend. 42 | 43 | - For port collisions, see [Docker for Beginners/#networking](docker-for-beginners.md#networking). 44 | - Alternatively to modify the port, see [Environment Variables/#TA_PORT](env-vars.md#ta_port) 45 | 46 | The React TS based frontend is compiled and served by Nginx from the `static` folder. 47 | 48 | The Python Django based backend is served with `uvicorn` on the container internal port `8080`. 49 | 50 | - Only container internal. Nginx handles proxying requests to the backend 51 | - To modify, see [Environment Variables/#TA_BACKEND_PORT](env-vars.md#ta_backend_port) 52 | 53 | ### Volumes 54 | This container expects two volumes: 55 | 56 | - `/cache`: That is not really a _cache_ any more now in the classical sense but holds persistent data like artwork and more. 57 | - `/youtube`: Location for your downloaded video files. 58 | 59 | ## Install **Redis** 60 | 61 | !!! danger "BE AWARE" 62 | Sharing the same Redis container between different projects is _not_ supported. 63 | 64 | Redis functions as a cache and temporary link between the application and the file system. Redis is used to store and display messages and configuration variables. Redis is also responsible for keeping track of the queues. 65 | 66 | - Communicate by default over port `6379` 67 | - Needs a volume to allow persistence at `/data`. 68 | 69 | ### Redis on a custom port 70 | For some environments, it might be required to run Redis on a non-standard port. For example, to change the Redis port to `6380`, set the following values: 71 | 72 | - For the *archivist-redis* service, set an additional key: `command: --port 6380` and update the `expose` value for your reference: 73 | ```yml 74 | services: 75 | archivist-redis: 76 | [...] 77 | command: --port 6380 78 | expose: 79 | - "6380" 80 | [...] 81 | ``` 82 | 83 | - For the **Tube Archivist** service make sure to also update the [REDIS_CON](env-vars.md#redis_con) value. e.g.: `redis://archivist-redis:6380` 84 | 85 | ## Install **ElasticSearch** 86 | !!! success "Elasticsearch Version" 87 | **Tube Archivist** depends on Elasticsearch 8. 88 | 89 | Use `bbilly1/tubearchivist-es` to automatically get the recommended version, or use the official image with the version tag in the `docker-compose.yml` file. 90 | 91 | Use the official Elasticsearch image for **arm64**. 92 | 93 | Elasticsearch stores the video metadata and enables searchable functionality for all fields. Elasticsearch is also used to keep track of the download queue. 94 | 95 | - Needs to be accessible over the default port `9200` 96 | - Needs a volume to store persistent data linked to `/usr/share/elasticsearch/data` 97 | 98 | Follow the [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html) for additional installation details and options. 99 | 100 | ### Elasticsearch on a custom port 101 | Should you need to change the port for Elasticsearch to, for example `9500`, follow these steps: 102 | 103 | - Set the environment variable `http.port=9500` for the ES container 104 | - Change the `expose` value for the ES container to match your port number 105 | - For the TA container, change the `ES_URL` environment variable, i.e. `ES_URL=http://archivist-es:9500` 106 | 107 | ## Support 108 | 109 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) 110 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/docker-for-beginners.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Docker and docker compose for beginners. 3 | --- 4 | 5 | A collection of generic knowledge about Docker targeted at beginners. These concepts do not _only_ apply to this project but this project is used as an example. 6 | 7 | ## Compose File 8 | Docker compose files are the most common and arguably the most convenient way to deploy docker containers. The compose file is usually called `docker-compose.yml` and is in yaml format. 9 | 10 | !!! warning "Indentation Matters" 11 | YAML is _very_ particular about indentation. Make sure you exactly mirror the indentation level as documented. 12 | 13 | The top key is called `services` then each key inside that represents a container. And each additional container has additional options like `image` and `container_name`. So a common compose file will look like this: 14 | 15 | ```yml 16 | services: 17 | container1: 18 | container_name: name1 19 | image: image1 20 | container2: 21 | container_name: name2 22 | image: image2 23 | ``` 24 | 25 | ## Common Commands 26 | 27 | These commands are expected to be run from the same location in the filesystem where you have stored your `docker-compose.yml` file. 28 | 29 | ### Download 30 | Download (pull) the containers: 31 | ```bash 32 | docker compose pull 33 | ``` 34 | 35 | ### Start 36 | Start (up) the containers. This will download the images first, if needed: 37 | ```bash 38 | docker compose up -d 39 | ``` 40 | 41 | ### Stop 42 | Stop (down) all containers: 43 | ```bash 44 | docker compose down 45 | ``` 46 | 47 | ### Update 48 | Update (pull and up) all containers to the latest image: 49 | ```bash 50 | docker compose pull 51 | docker compose up -d 52 | ``` 53 | If available, this will update all containers to the latest version. 54 | 55 | !!! warning "Check Release Notes" 56 | For this project, and other projects under development, always check the release notes before updating. If there are any breaking changes or manual steps needed, you'll find instructions there. 57 | 58 | ### Logs 59 | To get the logs: 60 | ```bash 61 | docker compose logs 62 | ``` 63 | 64 | Get the logs of a single container: 65 | ```bash 66 | docker compose logs tubearchivist 67 | ``` 68 | 69 | Optionally _follow_ the logs, meaning always see the latest logs, add `-f`: 70 | ```bash 71 | docker compose logs -f tubearchivist 72 | ``` 73 | 74 | same for all containers: 75 | ```bash 76 | docker compose logs -f 77 | ``` 78 | 79 | ## Volumes 80 | 81 | !!! warning "Data Loss" 82 | Understanding Volumes is crucial. Incorrect configurations can lead to data loss. 83 | 84 | By default Docker containers don't persist any data, meaning all data will get lost and reset after a container rebuilds. To persist data, you need to define volumes. 85 | 86 | ### Docker Managed 87 | 88 | In the example `docker-compose.yml` file you can see the volume definition at the bottom like that: 89 | ```yml 90 | volumes: 91 | media: 92 | cache: 93 | redis: 94 | es: 95 | ``` 96 | 97 | This defines volumes managed by docker. In a typical Linux based environment these get stored at `/var/lib/docker/`. Then you can see the corresponding volume mount on the container service like so: 98 | 99 | ```yml 100 | volumes: 101 | - media:/youtube 102 | ``` 103 | 104 | This mounts the docker managed volume called `media` inside the container at `/youtube`. The colon symbol `:` splits the paths: 105 | 106 | - The left side points to the location of the host system. You can usually freely choose that. 107 | - The right side points to the location _inside_ the container. You _usually_ can't modify that and you _have_ to use the exact same path as documented. 108 | - In some projects you see an additional `:` with additional options, e.g. `:ro` meaning _read only_. That does not apply for this project. 109 | 110 | ### User Managed, aka bind mount 111 | !!! warning "Permission Problems" 112 | Using bind mounts can lead to permission problems if the service inside the docker container is running on a specific user. In that case you'll have to make sure the folder on your host system has the same permissions as the folder _inside_ the container. 113 | 114 | You'll run into this problem when using a bind mount for the ElasticSearch volume. See [here](https://github.com/tubearchivist/tubearchivist?tab=readme-ov-file#permissions-for-elasticsearch) with instructions how to fix that. 115 | 116 | If you prefere, you can define where each volume should be stored on the file system by modifying the path **infront** of the `:`. Remember, you usually can't change the path _inside_ the container (right side of the `:`), only the path on the host system. 117 | 118 | If you define a bind mount, you can remove the docker managed volume definition from the `volumes` key at the bottom of the docker-compose file. 119 | 120 | #### Relative Path 121 | You can specify a relative file path, starting with `./`, that will be relative from the location of the `docker-compose.yml` file. 122 | 123 | E.g.: 124 | ```yml 125 | volumes: 126 | - ./volume/youtube:/youtube 127 | ``` 128 | That will persist the data at `volume/youtube` where the content of the `/youtube` folder will get stored on your host system. 129 | 130 | #### Absolute Path 131 | Alternatively you can also specify an absolute path on your host system. 132 | 133 | E.g.: 134 | ```yml 135 | volumes: 136 | - /media/docker/volume/youtube:/youtube 137 | ``` 138 | 139 | That will persist the data at `/media/docker/volume/youtube` on your host system. 140 | 141 | ## Networking 142 | 143 | For docker networking there are two basic concepts to understand: Publishing a service and networking between containers. 144 | 145 | ### Publish 146 | 147 | Publishing a service running inside a container is required to access that service, e.g. through your web browser. 148 | 149 | You will see `ports` defined in the `docker-compose.yml` file. 150 | 151 | E.g.: 152 | ```yml 153 | ports: 154 | - "8080:8000" 155 | ``` 156 | 157 | Similar to volumes, the colon symbol `:` splits the network definition: 158 | 159 | - The left side of the `:` defines the port used on your host system, aka `HOST_PORT`. You can _usually_ freely choose that. 160 | - The right side of the `:` defines the port used _inside_ the container, aka `CONTAINER_PORT`. You _usually_ can't change that and you need to use the port as defined in the documentation. If a service allows you to customize that, you should see a mention in the docs as well. 161 | 162 | !!! info 163 | You can't have more than one service using the same port on your machine. You'll see an error if you try to do that. The simplest way to rectify that is to change the `HOST_PORT` to something not in use, but keep the `CONTAINER_PORT` as is. 164 | 165 | E.g.: `"8008:8000"` to use the port 8008 on the host. 166 | 167 | 168 | This means this container is publishing a service running in the container on port `8000` to port `8080` on the host. That usually means, when you access that service, you'll need to add the `HOST_PORT` `:8080` to the IP/URL in your browser address bar. 169 | 170 | ### Networking between containers 171 | Containers regularly depend on other containers. How interacting between containers is usually done, is with networking. E.g. An application uses a traditional database like Postgres or, as here in this project, **Tube Archivist** needs to communicate with Redis and ElasticSearch. 172 | 173 | The good news is, docker handles all of that for you automatically: Docker's internal DNS automatically resolves the service name. Usually, you don't need to publish ports for services only expected to be accessed by another container. You will see `expose` keys defined on the service. 174 | 175 | E.g.: 176 | ```yml 177 | expose: 178 | - "9200" 179 | ``` 180 | 181 | That does not actually _do_ anything, that is mostly for you to document on what port a given service is expected to be accessed. You will usually set environment variables on the main container defining connection details like that. For this project thats: [`REDIS_CON`](env-vars.md#redis_con) for Redis and [`ES_URL`](env-vars.md#es_url) for ElasticSearch. 182 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/env-vars.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Documentation for each available environment variable. 3 | --- 4 | 5 | # Environment Variables 6 | 7 | This is a comprehensive list of environment variables for the **Tube Archivist** container accessible to users. Unless stated otherwise, these environment variables apply to all documented installation instructions. 8 | 9 | - Required: These environment variables are required to be set. 10 | - Optional: These are optional variables enabling additional configurations. 11 | - Data Types: Expected data type of the environment variable. 12 | - Type: String: Regular string 13 | - Type: Number: Will get converted to a number 14 | - Type: Boolean: Will evaluate to `True` to _enable_ the discribed functionality. Set to anything except blank string to enable. To disable, remove the variable. 15 | 16 | ## TA_HOST 17 | Required 18 | Type: String 19 | 20 | Set the environment variable `TA_HOST` to match with the expected origin from where you will access your **Tube Archivist** instance. That is whatever you input into your browser URL bar. 21 | 22 | - This can be a domain like *example.com*, a subdomain like *ta.example.com* or an IP address like *192.168.1.20*. 23 | - Define the protocol, e.g. `https://` oder `http://`. 24 | - Specify the port If you are using a nonstandard port. 25 | - You can add multiple hostnames separated with a space. 26 | - Any wrong configurations here will result in a `Bad Request (400)` response. 27 | - When in doubt, activate `DJANGO_DEBUG` to get explicit errors in the logs from where the requests are coming from. 28 | 29 | ## TA_USERNAME 30 | Required 31 | Type: String 32 | Username for your initial credentials. Changing that after first time starting the application won't have any effect. Use the admin interface to change or add that. 33 | 34 | ## TA_PASSWORD 35 | Required 36 | Type: String 37 | Password for your initial user. Changing that after creating the user, does not have any effect. Use the admin interface to change your password. 38 | 39 | If you forgot your password, see [User Management/#Forgot Password](../users.md#forgot-password). 40 | 41 | ## TZ 42 | Optional 43 | Type: String 44 | Your timezone. This is used for the scheduler. Defaults to UTC. 45 | 46 | !!! info 47 | If you don't know your timezone, you can find a list [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). Enter the value from the `TZ Identifier` column. 48 | 49 | !!! info 50 | There is a check at application startup comparing the `TZ` value with your existing schedules. Your schedules will update automatically to reflect the change in timezone. 51 | 52 | ## HOST_UID and HOST_GID 53 | Optional 54 | Type: Number 55 | Change the user and group owning the media files generated by TubeArchivist. This uses `chown` on the output files. 56 | 57 | !!! warning "Filesystem Compatibility" 58 | Not all filesystems support `chown`. Notably `NFS` does not have functionality to change the ownership of files. 59 | 60 | You will see a error like `PermissionError: [Errno 1] Operation not permitted` when TA is trying to change the ownership of the downloaded file. 61 | 62 | _Not_ setting these variables, will disable the chown functionality. 63 | 64 | ## TA_PORT 65 | Optional 66 | Type: Number 67 | This changes the actual port Nginx is listening on. That is the public port exposed through the docker container. If you have a port collision on default port 8000, see bellow. 68 | 69 | ## TA_BACKEND_PORT 70 | Optional 71 | Type: Number 72 | This changes the port where the backend service is running on. That is container internal only, but you might need to change that if you use a shared docker network and have a port collision there. 73 | 74 | ## TA_ENABLE_AUTH_PROXY 75 | Optional 76 | Type: Boolean 77 | Configure TA to authenticate with a auth proxy. See [configuration/forward-auth](../configuration/forward-auth.md) for more details. 78 | 79 | ## TA_LDAP 80 | Optional 81 | Type: Boolean 82 | Configure TA to use LDAP for authentication. See [configuration/ldap](../configuration/ldap.md) for more details. 83 | 84 | ## DISABLE_STATIC_AUTH 85 | Optional 86 | Type: Boolean 87 | This will disable authentication for static assets like your video mp4 files, subtitles and artwork. This might be required if you need to access the media files over the HTTP server but you are not able to pass authentication headers. 88 | 89 | !!! info 90 | This is `read only` access and does not allow for deleting/modifying any media files. But it is still recommended limit exposure or add additional protections if you enable that. 91 | 92 | ## DJANGO_DEBUG 93 | Optional 94 | Type: Boolean 95 | Enable debug to show additional log information like HTTP requests and yt-dlp configurations in your Docker logs. Helpful for development and debugging. 96 | 97 | !!! warning "Memory Leak" 98 | Only set this temporarily if you need to inspect some specific problem. Don't forget to remove it again after. This introduces a memory leak plus standard error messages from the backend will be in HTML showing a detailed stack trace and additional info instead of JSON, meaning the frontend is not able to display any error messages. 99 | 100 | ## REDIS_CON 101 | Required 102 | Type: String 103 | Connection string for your Redis instance. Specify protocol, host and port. 104 | E.g.: `redis://archivist-redis:6379` 105 | 106 | ## ES_URL 107 | Required 108 | Type: String 109 | URL for your ElasticSearch instance. Add protocol and port. 110 | E.g. `http://archivist-es:9200`. 111 | 112 | ## ELASTIC_PASSWORD 113 | Required 114 | Type: String 115 | This is the password for ElasticSearch. Make sure it matches with the equivalent password set for the ElasticSearch container. 116 | 117 | ## ELASTIC_USER 118 | Optional 119 | Type: String 120 | Optionally change the ElasticSearch username from the default `elastic`. 121 | 122 | ## ES_DISABLE_VERIFY_SSL 123 | Optional 124 | Type: Boolean 125 | Optionally disable SSL verification for ElasticSearch. Useful if you use a self signed certificate for ElasticSearch. 126 | 127 | ## ES_SNAPSHOT_DIR 128 | Optional 129 | Type: String 130 | Optionally set a custom path where elastic search stores snapshots for master/data nodes. Note, that path applies to inside the ES container. 131 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/helm-charts.md: -------------------------------------------------------------------------------- 1 | !!! abstract "Installation Instructions - Community Guides" 2 | These are beginner's guides/installation instructions for additional platforms generously provided by users of these platforms. When in doubt, verify the details with the [project README](https://github.com/tubearchivist/tubearchivist#installing). If you see any issues here while using these instructions, please contribute. 3 | 4 | There is a Helm Chart available at [https://github.com/insuusvenerati/helm-charts](https://github.com/insuusvenerati/helm-charts). 5 | 6 | ### Support 7 | 8 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) -------------------------------------------------------------------------------- /mkdocs/docs/installation/podman.md: -------------------------------------------------------------------------------- 1 | !!! abstract "Installation Instructions - Community Guides" 2 | These are beginner's guides/installation instructions for additional platforms generously provided by users of these platforms. When in doubt, verify the details with the [project README](https://github.com/tubearchivist/tubearchivist#installing). If you see any issues here while using these instructions, please contribute. 3 | 4 | !!! warning "Outdated" 5 | Please review these instructions and update it to the changes introduced in [v0.5.0](https://github.com/tubearchivist/tubearchivist/releases/tag/v0.5.0). 6 | 7 | Podman handles container hostname resolution slightly differently than Docker, so you need to make a few changes to the `docker-compose.yml` to get up and running. 8 | 9 | ### Installation Changes from Compose Instructions 10 | 11 | Follow the installation instructions for [Docker Compose](docker-compose.md), with a few additional changes to the `docker-compose.yml`. 12 | 13 | Edit the `docker-compose.yml` with these additional changes: 14 | 15 | #### Tube Archivist 16 | 17 | - under `tubearchivist` > `image`: 18 | prefix the container name with `docker.io/` (or the url of your container registry of choice). 19 | - under `tubearchivist` > `environment`: 20 | `ES_URL`: change `archivist-es` to reflect the internal IP of the computer that will be running the containers. 21 | `REDIS_HOST`: change `archivist-redis` to reflect the internal IP of the computer that will be running the containers (should be the same as above). 22 | 23 | #### Redis 24 | 25 | - under `archivist-redis` > `image`: 26 | prefix the container name with `docker.io/` again. 27 | - under `archivist-redis` > `expose`: 28 | change the whole entry from `expose: [""]` into `ports: [":"]`. 29 | 30 | ???+ example 31 | `ports: ["6379:6379"]` 32 | 33 | #### Elasticsearch 34 | 35 | - under `archivist-es` > `image`: 36 | prefix the container name with `docker.io/` again. 37 | - under `archivist-es` > `expose`: 38 | change the whole entry from `expose: [""]` into `ports: [":"]`. 39 | 40 | ???+ example 41 | `ports: ["9200:9200"]` 42 | 43 | ### Create service files (optional) 44 | 45 | Since Podman doesn't run as a service, it can't start containers after reboots without some additional configuration. 46 | 47 | If you want to enable this behavior, you can follow [this example](https://techblog.jeppson.org/2020/04/create-podman-services-with-podman-compose/) to have `systemd` start up the containers with `podman-compose` when the computer boots up. 48 | 49 | ### Support 50 | 51 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) 52 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/proxmox-lxc.md: -------------------------------------------------------------------------------- 1 | !!! abstract "Installation Instructions - Community Guides" 2 | These are beginner's guides/installation instructions for additional platforms generously provided by users of these platforms. When in doubt, verify the details with the [project README](https://github.com/tubearchivist/tubearchivist#installing). If you see any issues here while using these instructions, please contribute. 3 | 4 | !!! warning "Outdated" 5 | Please review these instructions and update it to the changes introduced in [v0.5.0](https://github.com/tubearchivist/tubearchivist/releases/tag/v0.5.0). 6 | 7 | # Setting up Tube Archivist with ProxMox LXC 8 | 9 | This guide assumed you know how to setup an LXC, CLI, and use "advanced" setup using tteck's easy helper scripts. This is out of scope for this project, if you need help with it reach out to me (Niicholai) in the discord and I will walk you through it. 10 | 11 | This guide will also walk you through exactly how I did it, in my specific setup which is a bit extra. I add in a ZFS Pool mount and drivers for my 1060 6GB. Sections exclusive to me that may not partain to you will be marked as **OPTIONAL**. 12 | 13 | **NOTE:** I have a static IP from my ISP, I'm not sure if that matters or not, but I didn't have to do any port forwarding or anything funny. It may be different for you, but it shouldn't be to my knowledge. 14 | 15 | --- 16 | 17 | **Original requirements from For Docker Compose:** minimal system requirements, the **Tube Archivist** stack needs around 2GB of available memory for a small testing setup and around 4GB of available memory for a mid to large sized installation. Minimum requirements for CPU are usually expected to be dual core with 4 threads, with better performance coming from quad core and higher, and more available threads. 18 | 19 | **Requirements for ProxMox LXC:** In my testing, 4 cores, 8GB disk, and 5GB RAM is what I went with in a Debian 12 container with static IP (set in my router). At idle it is using 0.09-0.20% of the 4 CPUs, 47.91% of the 5GB RAM (2.40GB), and 3.09GB of disk. Your mileage may vary, but this is a good place to start and see where you land. 20 | 21 | --- 22 | 23 | 1. To setup docker in a LXC, please use [tteck's easy helper script](https://tteck.github.io/Proxmox/#docker-lxc) (you may also add in portainer if you wish with the same script). 24 | 25 | 2. **OPTIONAL:** I mount a ZFS pool to my LXC to house my downloaded videos. If you need to do so, shut down the container and go add your mapping to the LXC's .conf, set your mount point, and start the container back up. 26 | 27 | 3. **OPTIONAL:** I add in drivers for my 1060 6GB that match the ones on my host, if you need to do that, do it now. 28 | 29 | 4. Create a spot to house your compose file. I personally went with /home/compose. 30 | 31 | 5. Grab the [docker-compose.yml](https://github.com/tubearchivist/tubearchivist/blob/master/docker-compose.yml). You can use something like WinSCP, download it to your main machine, then send it over, use the CLI, etc. For simplicity, I copied the raw contents, slapped it into Notepad++, edited it to what I needed, aused `touch docker-compose.yml` and copy pasted my final product into that empty file with `nano`. 32 | 33 | 6. Recommended changes to the compose file: I changed `ports: 8000:8000` under `tubearchivist` to `ports: 9000:8000` due to a conflict, I recommend you do the same. Under `tubearchivist` change `TA_USERNAME`, `TA_PASSWORD`, `ELASTIC_PASSWORD`, `TA_HOST` and `TZ` to your liking (you can set multiple hosts in `TA_HOST`, seperated by a space. For example, I set my local ip for the LXC and the https// URL for my CloudFlare tunnel). Make sure to change `"ELASTIC_PASSWORD="` under `archivist-es` to match what you set in `tubearchivist` as well. Finally, set your volumes. I did the following: in `tubearchivist` I set `volumes` to `- /share/youtube/archivist:/youtube` and `- /archivist/cache:/cache`, under `archivist-redis` I set `volumes` to `- /archivist/redis:/data`, and under `archivist-es` I set `volumes` to `- /archivist/es:/usr/share/elasticsearch/data`. **OPTIONAL:** if you did a ZFS pool mount, you'll also want to change the `HOST_UID` and `HOST_GID` as well. 34 | 35 | 7. With your compose file setup, if you like keeping things simple and organized like I do, and setup your compose file as I did, create those directories. `/archivist` and then `cache`, `redis`, and `es` inside of it so we get `/archivist/cache` and so on. 36 | 37 | 8. Time for that scary first launch! cd over to your /home/compose directory and full send `docker compose up -d` and pray nothing catches fire. I'm kidding, but I know the anxiety I had, you'll be fine I promise. 38 | 39 | 9. If everything went well then upon using the `docker compose logs -f` command you should see it's broken and throwing an error 1 message. I could have had you try and solve this in advance, but I wanted you to see the error, understand the problem, and then have the fix so you actually learn. If we read through the logs, we find this is a permission error by reading `"error.message":"Unable to access 'path.repo' (/usr/share/elasticsearch/data/snapshot)"`, this is caused by ES expecting very specific permissions in the folder we created. Not to worry, easy fix is next. 40 | 41 | 10. Go ahead and run `docker compose down`, now we need to enact `chown 1000:0 -R /path/to/mount/point`, in my case (and yours if you're doing things how I did) I used `chown 1000:0 -R /archivist/es`. That's it, that's literally all it was. See? I told you, easy. 42 | 43 | 11. `docker compose up -d`, we should see 4 items this time, Network tubearchivist_default Created, Container archivist-es Started, Container archivist-redis Started, and Container tubearchivist Started. Now if you run `docker compose logs -f` you should see a lot of "archivist-es" with a bunch of "timestamp" after it. Congrats, it's up and running! 44 | 45 | 12. Head over to your local IP with the port we changed earlier, so 9000. `http://123.123.123.123:9000` and you should see a fancy login screen for TA. Use the username and password you set in your compose file and voila! 46 | 47 | 13. Now you're ready to edit your settings, grab the fancy [TubeArchivist Browser Companion](https://github.com/tubearchivist/browser-extension), and full send your hard drive space into oblivion grabbing all the videos so if they get deleted you'll still have your fancy tutorials and cat videos. 48 | 49 | **NOTE:** I had issues with cookie syncing so I just turned it off, I'm not downloading restricted videos and it's not impacting me at this time. 50 | 51 | --- 52 | 53 | ### Support 54 | 55 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) 56 | 57 | You can specifically find the support thread I had initially to get this all up and running with lamusmaser by searching in the support section for `[SOLVED] Need help setting up LXC properly`. I am no expert but after spending 4 days working on this, only to find out doing it all over again one more time, with these specific steps, worked out wonderfully I wanted to add to the docs and create a guide for my fellow LXC users. Hope this helped! 58 | -------------------------------------------------------------------------------- /mkdocs/docs/installation/synology.md: -------------------------------------------------------------------------------- 1 | !!! abstract "Installation Instructions - Community Guides" 2 | These are beginner's guides/installation instructions for additional platforms generously provided by users of these platforms. When in doubt, verify the details with the [project README](https://github.com/tubearchivist/tubearchivist#installing). If you see any issues here while using these instructions, please contribute. 3 | 4 | !!! danger "Compatibility Problems" 5 | - As Synology is running their old kernel (currently 4.4.302+), you might face problems running Elasticsearch on your device, as newer Elasticsearch version require kernel modules not available and not backported by Synology. 6 | - You will see errors like: `seccomp unavailable` and `CONFIG_SECCOMP not compiled into kernel`, `CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed`. 7 | - Workaround is to pin the Elasticsearch image to an older version, not requiring these modules: `docker.elastic.co/elasticsearch/elasticsearch:8.14.3`. 8 | - That is likely going to break in the future, as this project develops, new functionality might depend on new ES versions. 9 | 10 | !!! warning "Outdated" 11 | Please review these instructions and update it to the changes introduced in [v0.5.0](https://github.com/tubearchivist/tubearchivist/releases/tag/v0.5.0). 12 | 13 | There are several different methods to install **Tube Archivist** on Synology platforms. This will focus on the available `docker` package manager implementation for Synology 7.1 and prior. 14 | 15 | !!! note 16 | Synology Package Manager for 7.2 and later should be able to follow the instructions below or create a project using the [docker compose installation instructions.](docker-compose.md) 17 | 18 | ### Prepare Directories/Folders 19 | 20 | Before we setup **Tube Archivist**, we need to setup the directories/folders. You are assumed to be logged into the Synology NAS with a properly permissioned user. 21 | 22 | #### 1. Docker Base Folder 23 | 1. Open the `File Station` utility. 24 | 2. Click on the **Create🔽** button and choose *Create New Shared Folder*. 25 | 3. **Name** the folder "Docker". 26 | 4. Add a **Description**. 27 | 5. Select the **Volume Location**. 28 | > !!! note 29 | By default, this will be where all persistent data is stored. Change the folders as best meets your requirements. 30 | 6. Select the appropriate options from the remaining checkbox configurations. 31 | ![Synology - Create Docker Folder](../assets/Synology_0.2.0_Docker-Folder-Create.png) 32 | 7. Click the **Next** button. 33 | 8. If you are going to **Encrypt** your folder, check the appropriate box and provide the Encryption Key and its confirmation. 34 | 9. Click the **Next** button. 35 | 10. On the **Advanced Settings** page, you can select the *Enable data checksum for advanced data integrity* setting. This may cause a performance impact, but will allow for potential file self-healing. **This cannot be changed later.** 36 | > !!! warning 37 | This is not recommended as we will be hosting databases within this folder. 38 | 11. If you are enabling a quota for how large the folder can get, you can select the *Enabled shared folder quota* setting and choose the maximum size this folder can grow. This can be changed later. 39 | 12. Click the **Next** button. 40 | 13. Confirm the settings, then click the **Apply** button. This will create the folder. 41 | #### 2. Tube Archivist Base Folder 42 | 1. Open the `File Station` utility. 43 | 2. Select the "Docker" folder on the left-hand side. 44 | 3. Click on the `Create🔽` button and choose *create Folder*. 45 | 4. **Name** the folder "TubeArchivist". 46 | #### 3. Redis Data 47 | 1. Open the `File Station` utility. 48 | 2. Select the "Docker" folder on the left-hand side. 49 | 3. Select the "TubeArchivist" folder beneath "Docker". 50 | 4. Click on the `Create🔽` button and choose *create Folder*. 51 | 5. **Name** the folder "redis". 52 | #### 4. Elastic Search Data 53 | 1. Open the `File Station` utility. 54 | 2. Select the "Docker" folder on the left-hand side. 55 | 3. Select the "TubeArchivist" folder beneath "Docker". 56 | 4. Click on the `Create🔽` button and choose *create Folder*. 57 | 5. **Name** the folder "es". 58 | #### 5. Tube Archivist Cache 59 | 1. Open the `File Station` utility. 60 | 2. Select the "Docker" folder on the left-hand side. 61 | 3. Select the "TubeArchivist" folder beneath "Docker". 62 | 4. Click on the `Create🔽` button and choose *create Folder*. 63 | 5. **Name** the folder "cache". 64 | #### 6. Tube Archivist Output 65 | 1. Open the `File Station` utility. 66 | 2. Select the "Docker" folder on the left-hand side. 67 | 3. Select the "TubeArchivist" folder beneath "Docker". 68 | 4. Click on the `Create🔽` button and choose *create Folder*. 69 | 5. **Name** the folder "media". 70 | #### 7. Confirm Folder Structure 71 | Once all of the folders have been created, it should have a folder structure within `Docker\TubeArchivist` that includes "`cache`", "`es`", "`media`", and "`redis`" folders. 72 | ![Synology - Docker Folder Structure](../assets/Synology_0.2.0_Docker-Folder-Structure.png) 73 | 74 | #### 8. Change Permissions - CLI Required 75 | 76 | !!! failure "CLI Required" 77 | If you do not have SSH access enabled for CLI, [enable it](https://kb.synology.com/en-sg/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet) before continuing. 78 | 79 | 1. Open an SSH connection to the Synology. Login as your primary `Admin` user, or the user that was enabled for SSH access. 80 | 2. Elevate your access to `root`. Steps are provided [here](https://kb.synology.com/en-sg/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet). 81 | 3. Change directories to the **Volume** where the "Docker" folder resides. 82 | 83 | > !!! example "`cd /volume1`" 84 | 85 | 4. Change directories to the "Docker" folder. 86 | 87 | > !!! example "`cd Docker`" 88 | 89 | 5. Change directories to the "TubeArchivist" folder. 90 | 91 | > !!! example "`cd TubeArchivist`" 92 | 93 | 6. Change the owner of the "redis" folder. *If correct, this does not have an output.* 94 | 95 | > !!! example "`chown 999:100 redis`" 96 | 97 | 7. Change the owner of the "es" folder. *If correct, this does not have an output.* 98 | 99 | > !!! example "`chown 1000:0 es`" 100 | 101 | 8. Confirm that the folders have the correct permissions. 102 | 103 | > !!! example "`ls -hl`" 104 | 105 | ![Synology - Docker Folder Permissions Command](../assets/Synology_0.3.6_Docker-Folder-Permissions-Commands.png) 106 | 107 | 9. Logout from root. 108 | 109 | > !!! example "`logout`" 110 | 111 | 10. Disconnect from the SSH connection. 112 | 113 | > !!! example "`exit`" 114 | 115 | 116 | ### Synology Docker Setup 117 | 118 | #### 1. Install Docker 119 | 120 | 1. Install the `Docker` Synology Package. 121 | 1. Log in to your Synology NAS. 122 | 2. Open the `Package Center` utility. 123 | 3. Search for `Docker`. 124 | 4. Click `Install`. 125 | 126 | ![Synology - Install Docker Utility](../assets/Synology_0.2.0_Docker-Install.png) 127 | 128 | #### 2. Download the Docker images 129 | 130 | 1. After `Docker` is installed, open the `Docker` utility. 131 | 1. Go to the `Registry` tab. 132 | 2. Search for the following `images` and download them. Follow the recommended versions for each of the images. 133 | 134 | > !!! info "`latest` Tag" 135 | Upgrades in Synology require use of the `latest` tag. 136 | 137 | `redis/redis-stack-server` 138 | ![Synology - Redis Image Search](../assets/Synology_0.3.6_Docker-Redis-Search.png) 139 | 140 | `docker.elastic.co/elasticsearch/elasticsearch:8.14.3` 141 | ![Synology - ElasticSearch Image Search](../assets/Synology_0.2.0_Docker-ES-Search.png) 142 | 143 | `bbilly1/tubearchivist` 144 | ![Synology - Tube Archivist Image Search](../assets/Synology_0.2.0_Docker-TA-Search.png) 145 | 146 | 2. Go to the `Image` tab. From here, create a container based on each image with the associated configurations below. 147 | 148 | #### 3. Configure ElasticSearch 149 | 150 | **ElasticSearch** 151 | 152 | 1. Select the associated image. 153 | 2. Click the **Launch** button in the top. 154 | 3. Edit the **Container Name** to be "tubearchivist-es". 155 | 4. Click on the **Advanced Settings** button. 156 | 5. In the **Advanced Settings** tab, check the box for `Enable auto-restart`. 157 | 6. In the **Volume** tab, click the **Add Folder** button and select the "`Docker/TubeArchivist/es`" folder, then type in `/usr/share/elasticsearch/data` for the mount path. 158 | 7. In the **Network** tab, leave the default `bridge` Network (unless you have a specific Network design that you know how to implement). 159 | 8. In the **Port Settings** tab, replace the "Auto" entry under **Local Port** with the port that will be used to connect to ElasticSearch (default is 9200). 160 | 9. In the **Port Settings** tab, select the entryline for port 9300 and **➖ delete** the line. It is not needed for this container. 161 | 10. The **Links** tab does not require configuration for this container. 162 | 11. In the **Environment** tab, add in the following ElasticSearch specific environment variables that may apply. 163 | 164 | | Environment Variable | Setting | 165 | | :------------------- | :------ | 166 | | `discovery.type` | `single-node` | 167 | | `ES_JAVA_OPTS` | `-Xms512m -Xmx512m` | 168 | | `UID` | `1000` | 169 | | `GID` | `0` | 170 | | `xpack.security.enabled` | `true` | 171 | | `ELASTIC_PASSWORD` | `verysecret` | 172 | | `path.repo` | `/usr/share/elasticsearch/data/snapshot` | 173 | 174 | > !!! danger "BE AWARE" 175 | - Do not use the default password, as it is very insecure. 176 | - Activating snapshots for backups should only be done *after* setting the `path.repo` setting. 177 | 178 | ![Synology - ElasticSearch Environment Configurations](../assets/Synology_0.2.0_Docker-ES-Env-Conf.png) 179 | 180 | 12. Click on the **Apply** button. 181 | 13. Back on the **Create Container** screen, click the **Next** button. 182 | 14. Review the settings to confirm, then click the **Apply** button. 183 | 184 | #### 4. Configure Redis 185 | 186 | **Redis** 187 | 188 | 1. Select the associated image. 189 | 2. Click the **Launch** button in the top. 190 | 3. Edit the **Container Name** to be "tubearchivist-redis". 191 | 4. Click on the **Advanced Settings** button. 192 | 5. In the **Advanced Settings** tab, check the box for `Enable auto-restart`. 193 | 6. In the **Volume** tab, click the **Add Folder** button and select the "`Docker/TubeArchivist/redis`" folder, then type in `/data` for the mount path. 194 | 7. In the **Network** tab, leave the default `bridge` Network (unless you have a specific Network design that you know how to implement). 195 | 8. In the **Port Settings** tab, replace the "Auto" entry under **Local Port** with the port that will be used to connect to Redis (default is 6379). 196 | 9. In the **Links** tab, select the `tubearchivist-es` container from the **Container Name** dropdown and provide it the same alias, "tubearchivist-es". 197 | 10. In the **Environment** tab, add in any Redis specific environment variables that may apply (none by default). 198 | 11. Click on the **Apply** button. 199 | 12. Back on the **Create Container** screen, click the **Next** button. 200 | 13. Review the settings to confirm, then click the **Apply** button. 201 | 202 | #### 5. Configure Tube Archivist 203 | 204 | **Tube Archivist** 205 | 206 | 1. Select the associated image. 207 | 2. Click the **Launch** button in the top. 208 | 3. Edit the **Container Name** to be "tubearchivist". 209 | 4. Click on the **Advanced Settings** button. 210 | 5. In the **Advanced Settings** tab, check the box for `Enable auto-restart`. 211 | 6. In the **Volume** tab, click the **Add Folder** button and select the "`Docker/TubeArchivist/cache`" folder, then type in `/cache` for the mount path. 212 | 7. In the **Volume** tab, click the **Add Folder** button and select the "`Docker/TubeArchivist/media`" folder, then type in `/youtube` for the mount path. 213 | 8. In the **Network** tab, leave the default `bridge` Network (unless you have a specific Network design that you know how to implement). 214 | 9. In the **Port Settings** tab, replace the "Auto" entry under **Local Port** with the port that will be used to connect to **Tube Archivist** (default is 8000). 215 | 10. In the **Links** tab, select the `tubearchivist-es` container from the **Container Name** dropdown and provide it the same alias, "tubearchivist-es". 216 | 11. In the **Links** tab, select the `tubearchivist-redis` container from the **Container Name** dropdown and provide it the same alias, "tubearchivist-redis". 217 | 12. In the **Environment** tab, add in the following **Tube Archivist** specific environment variables that may apply. **Change the variables as is appropriate to your use case. Follow the [README section](https://github.com/tubearchivist/tubearchivist#installing) for details on what to set each variable.** 218 | 219 | | Environment Variable | Setting | 220 | | :------------------- | :------ | 221 | | `TA_HOST` | `synology.local` | 222 | | `ES_URL` | `http://tubearchivist-es:9200` | 223 | | `REDIS_HOST` | `tubearchivist-redis` | 224 | | `HOST_UID` | `1000` | 225 | | `HOST_GID` | `0` | 226 | | `TA_USERNAME` | `tubearchivist` | 227 | | `TA_PASSWORD` | `verysecret` | 228 | | `ELASTIC_PASSWORD` | `verysecret` | 229 | | `TZ` | `America/New_York` | 230 | 231 | > !!! danger "BE AWARE" 232 | - Do not use the default password as it is very insecure. 233 | - Ensure that ELASTIC_PASSWORD matches the password used on the `tubearchivist-es` container. 234 | 235 | ![Synology - Tube Archivist Environment Configurations](../assets/Synology_0.2.0_Docker-TA-Env-Conf.png) 236 | 237 | 13. Click on the **Apply** button. 238 | 14. Back on the **Create Container** screen, click the **Next** button. 239 | 15. Review the settings to confirm, then click the **Apply** button. 240 | 241 | ### 6. Post-Installation Monitoring 242 | 243 | 1. After the containers have been configured and started, you can go to the **Container** tab and monitor the containers. 244 | 2. To review the logs to ensure that the system has started successfully, select the `tubearchivist` container and click on the **Details** button. In the new window, go to the **Log** tab. Monitor the logs until either an error occurs or the message `celery@tubearchivist ready.` is in the logs. This may take a few minutes, especially for a first time setup. 245 | 246 | > !!! note "Reviewing Logs" 247 | Synology Docker presents the logs in a paginated format, showing in historical order (oldest first). 248 | If you are not seeing the logs update, check if there are additional pages. 249 | 250 | 3. After it has started, go to the location provided in the `TA_HOST`. This should give you the standard **Tube Archivist** login screen. 251 | 253 | 254 | 255 | **From there, you should be able to start up your containers and you're good to go!** 256 | 257 | ### Synology Docker Upgrade 258 | When a new version of the image is available, you can use the following steps to more easily upgrade your previous instance. 259 | 260 | !!! failure "`latest` Tag Required" 261 | If you did not use the `latest` tag, you may have some variances in your upgrade steps. Those are detailed below these instructions. 262 | 1. Go to the Registry Tab and download the newest instance of the `:latest` tag, as seen in the Installation Instructions earlier. 263 | 2. Go to Image Tab and confirm that you have the newer version available. 264 | 3. Stop the running `tubearchivist` container. 265 | 4. Click on the **Action🔽** button and choose "Reset". 266 | 5. This will load the newer image we downloaded earlier. This should not delete any files if all of your volumes were setup correctly. 267 | 6. If it doesn't start automatically, start the `tubearchivist` container. Monitor the upgrade in the logs and confirm that the service starts up successfully. 268 | 7. Once you are able to login successfully to the web page for **Tube Archivist**, you have successfully upgraded your container! 269 | 270 | !!! success "If you did not use the `latest` tag for the `tubearchivist` container, then you will instead do the following:" 271 | 1. Shut down the old container. 272 | 2. Download the new image. 273 | 3. Follow the Installation instructions again *for just the Tube Archivist image*, using the same configurations as the existing container. It'll have to be named slightly differently. 274 | 4. After the image is now running and the upgrade of the backend files occurs, shut down the new container. Rename or delete the old container. Rename the new container to have the intended name. 275 | 276 | !!! info "Linking Upgrade Importance" 277 | Links are incredibly important if you upgrade or change the ES or Redis container images. You will either need to remove the links, create the new containers, then re-add the links or rebuild all of the images with the same instructions as Installation, starting at Step 3. 278 | 279 | ### Support 280 | 281 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) -------------------------------------------------------------------------------- /mkdocs/docs/installation/unraid.md: -------------------------------------------------------------------------------- 1 | !!! abstract "Installation Instructions - Community Guides" 2 | These are beginner's guides/installation instructions for additional platforms generously provided by users of these platforms. When in doubt, verify the details with the [project README](https://github.com/tubearchivist/tubearchivist#installing). If you see any issues here while using these instructions, please contribute. 3 | 4 | **Tube Archivist**, and all if it's dependencies, are located in the [community applications](https://unraid.net/community/apps?q=tubearchivist) store. The three containers you will need are as follows: 5 | 6 | - **TubeArchivist-Redis**: Redis functions as a cache and temporary link between the application and the file system. Redis is used to store and display messages and configuration variables. 7 | - **TubeArchivist-ES**: Elasticsearch stores the video metadata and enables searchable functionality for all fields. Elasticsearch is also used to keep track of the download queue. 8 | - **TubeArchivist**: Once your YouTube video collection grows, it becomes hard to search and find a specific video. That's where **Tube Archivist** comes in: By indexing your video collection with metadata from YouTube, you can organize, search and enjoy your archived YouTube videos without hassle, and offline, through a convenient web interface. 9 | 10 | ## Installing Tube Archivist Applications 11 | 12 | ### Install `TubeArchivist-Redis` 13 | 14 | ![TubeArchivist-Redis](../assets/unraid_redis_install.png) 15 | 16 | This is the easiest container to setup of the three, just make sure that you do not have any port conflicts and `/data` is mounted to the correct path. The other containers will map to the same root directory (/mnt/user/appdata/TubeArchivist). 17 | 18 | If you need to install `TubeArchivist-Redis` on a different port, you'll have to follow [these steps](docker-compose.md#redis-on-a-custom-port) later on when installing the `TubeArchivist` container. 19 | If you're running into port collision errors, recreate the steps outline in the [docker compose installation instructions.](docker-compose.md/#redis-on-a-custom-port) 20 | 21 | !!! tip 22 | Make sure and start the Redis and ElasticSearch containers approximately one minute before starting `TubeArchivist` 23 | 24 | 25 | ### Install `TubeArchivist-ES` 26 | ![TubeArchivist-ES](../assets/unraid_es_install.png) 27 | ElasticSeach is also pretty easy to setup. Again, make sure you have no port conflicts, that you mapped the ElasticSearch Data directory to the `es` directory in the TubeArchivist root directory (/mnt/user/appdata/TubeArchivist/es), and make sure to change the default password to something more secure. 28 | 29 | There are four additional settings in the "show more settings" area that you should be aware of, particularlly the Java Options field that controls how much memory ES is allowed to use. This doesn't usually require any changes but you might want to tune these for your systems avaliable RAM. 30 | 31 | !!! tip 32 | Make sure and start Redis and the ElasticSearch containers approximately one minute before starting `TubeArchivist` 33 | 34 | ### Install `TubeArchivist` 35 | 36 | ![TubeArchivist](../assets/unraid_ta_install.png) 37 | 38 | It's finally time to set up TubeArchivist! 39 | 40 | - `HOST:` This is a list of IP addresses that you will host TA from. Example, 192.168.0.14 is the IP address of my Unraid server. If I was going to access TA from a VPN, or domain name, I'd put those next to my host IP with a space separating the different addresses. More information [here.](env-vars.md#ta_host). 41 | 42 | - `Port:` Again, make sure that you have no port conflicts on 8000. 43 | 44 | - `Youtube Media Path:` is where you'll download all of your videos to. 45 | Make sure that this is an empty directory to not cause confusion when 46 | starting the application. If you have existing videos that you'd like 47 | to import into Tube Archivist, please checkout the [Manual Import Documentation.](../settings/actions.md#manual-media-files-import) 48 | 49 | - `Appdata:` This should be the root path from the other two containers (/mnt/user/appdata/TubeArchivist). 50 | 51 | - `TA Username:` This will be your initial username for TubeArchivist. 52 | 53 | - `TA Password:` This will be your initial password for TubeArchivist. 54 | 55 | - `Redis:`Connection string to your Redis container. replace `archivist-redis` with your host IP address, and port. 56 | E.g.: if your unraid has the IP 192.168.0.14 it would be `redis://192.168.0.14:6379` 57 | 58 | - `ElasticSearch Password:` This is the password you defined in the `TubeArchivist-ES` container. 59 | - `ElasticSearch:` similar to the Redis variable, just replace the IP and Port to match your `TubeArchivist-ES` container. E.g.: `http://192.168.0.14:9200` 60 | 61 | - `Time Zone:` This is an important step for your scheduler. To find your timezone, use a site like [TimeZoneConverter](http://www.timezoneconverter.com/cgi-bin/findzone.tzc) 62 | 63 | **From there, you should be able to start up your containers and you're good to go!** 64 | 65 | ## Troubleshooting 66 | 67 | ### Permissions Errors 68 | 69 | If you run into permission errors, stop all containers and try ```'newperms /mnt/user/appdata/TubeArchivist/'``` to reset the permissions to the root of your TubeArchivist appdata folder. 70 | 71 | ### Support 72 | 73 | If you're still having trouble, join us on [discord](https://www.tubearchivist.com/discord) and come to the [#support channel.](https://discord.com/channels/920056098122248193/1006394050217246772) 74 | 75 | -------------------------------------------------------------------------------- /mkdocs/docs/playlists.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Subscribe to playlists, browse your playlists and access additional metadata. 3 | --- 4 | 5 | # Playlist Pages 6 | Playlists are organized in two different levels, similar to [Channels](channels.md): 7 | 8 | ## Playlist Overview 9 | 10 | !!! note 11 | There is an overlap in functionality with [index playlists on channel](channels.md/#about): 12 | 13 | - Subscribe to a playlist if the playlist contains videos from **various channels**. 14 | - Subscribe to a playlist if you only want to add **a few** playlists from a chanel. 15 | - Use [index playlists on channel](channels.md/#about) if you want to add **all** playlists of a channel. 16 | - Avoid subscribing to a playlist if the channel already monitors that playlist. 17 | 18 | Accessible at `/playlist/` of your **Tube Archivist** instance, this **Overview Page** shows a list of all playlists you have indexed over all your channels. 19 | 20 | - You can filter that list to show only subscribed playlists with the toggle. 21 | 22 | You can index playlists of a channel from the [channel detail page](channels.md#about). 23 | 24 | To add a playlist click on the add icon button. There you can **Subscribe to Playlist**: 25 | 26 | - Enter a [playlist](urls.md#playlist) 27 | 28 | - Add one per line. 29 | 30 | *or* you can **Create Custom Playlist**. That is a local only playlist. Add videos from their [video detail page](video.md). 31 | 32 | You can search your indexed playlists by clicking on the search icon search icon. This will open a dedicated page. 33 | 34 | ## Playlist Detail 35 | Each playlist will get a dedicated playlist detail page accessible at `/playlist//` of your **Tube Archivist** instance. This page shows all the videos you have downloaded from this playlist. 36 | 37 | - If you are subscribed to the playlist, an Unsubscribe button will show, otherwise the Subscribe button will show. 38 | - The **Mark as Watched** and **Mark as Unwatched** buttons will mark all videos of this playlist as watched/unwatched. 39 | - The **Reindex** button will reindex the playlist metadata. 40 | - The **Reindex Videos** button will reindex all videos from this playlist. 41 | - The **Delete Playlist** button will give you the option to delete just the *metadata*, which won't delete any media files, or *delete all*, which will delete the metadata plus all videos belonging to this playlist. -------------------------------------------------------------------------------- /mkdocs/docs/search.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Unified search page to query your index. 3 | --- 4 | 5 | # Search Page 6 | Accessible at `/search/` of your **Tube Archivist** instance, search your archive for Videos, Channels and Playlists - or even full text search throughout your indexed subtitles. 7 | 8 | Just start typing to start a **simple** search *or* **start your query with a primary keyword** to search for a specific type and narrow down the result with secondary keywords. Secondary keywords can be in any order. Use *yes* or *no* for boolean values. 9 | 10 | - This will return 30 results per query, pagination is not implemented yet. 11 | - All your queries are case insensitive and are normalized to lowercase. 12 | - All your queries are analyzed for the english language, this means *singular*, *plural* and word variations like *-ing*, *-ed*, *-able*, etc., are treated as synonyms. 13 | - Keyword value parsing begins with the `keyword:` name all the way until the end of query or the next keyword, e.g. in `video:learn python channel:corey`, the keyword `video` has value `learn python`. 14 | 15 | Fuzzy search is activated for all your searches by default. This can catch typos in your queries or in the matching documents with a one to two letters difference, depending on the query length. You can configure fuzziness with the secondary keyword `fuzzy:`, e.g: 16 | 17 | - `fuzzy:0` or `fuzzy:no`: Deactivate fuzzy matching. 18 | - `fuzzy:1`: Set fuzziness to one letter difference. 19 | - `fuzzy:2`: Set fuzziness to two letters difference. 20 | - All text searches are ranked, meaning the better a match the higher ranked the result. Unless otherwise stated, queries with multiple words are processed with the `and` operator, meaning all words need to match so each word will narrow down the result. 21 | 22 | ## Simple 23 | Start your query without any keywords to make a simple query (primary keyword `simple:` is implied). This will search in *video titles*, *channel names* and *playlist titles* and will return matching videos, channels and playlists. Keyword searches will return more results in a particular category due to the fact that more fields are searched for matches. Simple queries do not have any secondary keywords. 24 | 25 | ## Video 26 | Start your query with the **primary keyword** `video:` to search through only videos. This will search through the *video titles*, *tags* and *category* fields. Narrow down your search with secondary keywords: 27 | 28 | - `channel:` search for videos matching the channel name. 29 | - `active:` is a boolean value, to search for videos that are still active on youtube or that are not active any more. 30 | 31 | **Example**: 32 | 33 | - `video:learn python channel:corey schafer active:yes` 34 | - This will return all videos with the term *Learn Python* from the channel *Corey Schafer* that are still *Active* on YouTube. 35 | - `video: channel:tom scott active:no` 36 | - Note the omitted term after the primary key, this will show all videos from the channel *Tom Scott* that are no longer active on YouTube. 37 | 38 | ## Channel 39 | Start your query with the **primary keyword** `channel:` to search through only channels. This will search through the *channel name*, *channel description* and *channel tags* fields. Narrow down your search with secondary keywords: 40 | 41 | - `subscribed:` is a boolean value, search for channels that you are subscribed to or not. 42 | - `active:` is a boolean value, to search for channels that are still active on YouTube or that are no longer active. 43 | 44 | **Example**: 45 | 46 | - `channel:linux subscribed:yes`: Search for channels with the term *Linux* that you are subscribed to. 47 | - `channel: active:no`: Note the omitted term after the primary key, this will return all channels that are no longer active on YouTube. 48 | 49 | ## Playlist 50 | Start your query with the **primary keyword** `playlist:` to search through only playlists. This will search through the *playlist title* and *playlist description* fields. Narrow down your search with secondary keywords: 51 | 52 | - `subscribed`: is a boolean value, search for playlists that you are subscribed to or not. 53 | - `active:` is a boolean value, to search for playlists that are still active on YouTube or that are no longer active. 54 | 55 | **Example**: 56 | 57 | - `playlist:backend engineering subscribed:yes`: Search for playlists about *Backend Engineering* that you are subscribed to. 58 | - `playlist: active:yes subscribed:yes`: Note the omitted primary search term, this will return all playlists active on YouTube that you are subscribed to. 59 | - `playlist:html css active:yes`: Search for playlists containing *HTML CSS* that are still active on YouTube. 60 | 61 | ## Full 62 | Start your query with the **primary keyword** `full:` to perform full text search. This will search through your indexed subtitles showing segments with possible matches. This will only show any results if you have activated *subtitle download and index* on the settings page. The operator for full text searches is `or`, meaning searching for multiple words does not require all words to match, but additional matching words will change the ranking of the result. The more words matching and the better they match, the higher ranked the result. The matching words will get highlighted in the text preview and you will see a score indicating how well your query terms are matched. 63 | 64 | Clicking the play button on the thumbnail will open the in-place player at the timestamp from where the segment starts. Same when clicking the video title, this will open the video page and put the player at the segment timestamp. This will overwrite any previous playback position. 65 | 66 | Narrow down your search with these secondary keywords: 67 | 68 | - `lang`: Search for matches only within a language. Use the same two letter ISO country code as you have set on the settings page. 69 | - `source`: Can either be *auto* to search through auto generated subtitles only or *user* to search through user uploaded subtitles only. 70 | 71 | **Example**: 72 | 73 | - `full:contribute to open source lang:en` search for subtitle segments matching with the words *Contribute*, *to*, *Open* or *Source* in the language *en*. 74 | - `full:flight simulator cockpit source:user` to search for the words *Flight*, *Simulator* or *Cockpit* from *user* uploaded subtitle segments. 75 | -------------------------------------------------------------------------------- /mkdocs/docs/settings/actions.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Administration tasks for the application. 3 | --- 4 | 5 | # Actions Page 6 | Accessible at `/settings/actions/` of your **Tube Archivist** instance, this page allows admins to perform actions related to the database and other functions. 7 | 8 | ## Delete download queue 9 | The button **Delete all queued** will delete all pending videos from the download queue. The button **Delete all ignored** will delete all videos you have previously ignored. 10 | 11 | ## Manual Media Files Import 12 | !!! warning 13 | This is inherently error prone, as there are many variables, some outside of the control of this project. Read this carefully and use at your own risk. 14 | 15 | !!! note 16 | The importer will *try* to fetch metadata from YouTube after identifying the video, as it is assumed this is newer, even if you add the info json file as described below. 17 | 18 | Add the files you'd like to import to the `/cache/import` folder. Only add files, don't add subdirectories. All files you are adding need to have the same *base name* as the media file. Then, start the process from the settings page with the *Manual Media Files Import* button. 19 | 20 | Valid media extensions are *.mp4*, *.mkv* or *.webm*. If you have other file extensions or incompatible codecs, convert them first to mp4. **Tube Archivist** can identify the videos with one of the following methods: 21 | 22 | ### Method 1: 23 | Add a matching *.info.json* file with the media file. Both files need to have the same base name, for example: 24 | 25 | - For the media file: `.mp4` 26 | - For the JSON file: `.info.json` 27 | 28 | The import process then looks for the 'id' key within the JSON file to identify the video. 29 | 30 | 31 | Sometimes you may need to create this file manually. The following are the absolute minimum required tags as keys for manual importing. 32 | 33 | !!! note 34 | `thumbnail` can be left blank or null, however it is required to be present. If blank the thumbnail will be extracted from the video file on import. 35 | 36 | ```json 37 | { 38 | "id": "", 39 | "channel_id": "", 40 | "title": "", 41 | "upload_date": "", 42 | "thumbnail": null 43 | } 44 | ``` 45 | 46 | However, you may fill out additional tags if they are known for a more complete result. 47 | ```json 48 | { 49 | "id": "", 50 | "channel_id": "", 51 | "title": "", 52 | "upload_date": "", 53 | "description": null, 54 | "categories": null, 55 | "thumbnail": null, 56 | "tags": null, 57 | "view_count": null 58 | } 59 | ``` 60 | 61 | ### Method 2: 62 | Detect the YouTube ID from filename. This accepts the default yt-dlp naming convention for file names like: 63 | 64 | - `[].mp4` 65 | 66 | !!! success "Required Naming Convention" 67 | The YouTube ID in square brackets at the end of the filename is the crucial part. 68 | 69 | ### Offline import: 70 | If the video you are trying to import is not available on YouTube any more, **Tube Archivist** can import the required metadata: 71 | 72 | - The file `.info.json` is required to extract the required information. 73 | - Add the thumbnail as `.`, where valid file extensions are *.jpg*, *.png* or *.webp*. If there is no thumbnail file, **Tube Archivist** will try to extract the embedded cover from the media file or will fallback to a default thumbnail. 74 | - Add subtitles as `..vtt` where *lang* is the two letter ISO country code. This will archive all subtitle files you add to the import folder, independent from your configurations. Subtitles can be archived and used in the player, but they can't be indexed or made searchable due to the fact, that they have a very different structure than the subtitles as **Tube Archivist** needs them. 75 | - For videos, where the whole channel is not available any more, you can add the `.info.json` file as generated by *youtube-dl/yt-dlp* to get the full metadata. Alternatively **Tube Archivist** will extract as much info as possible from the video info.json file. 76 | 77 | ### Some notes: 78 | 79 | - This will **consume** the files you put into the import folder: Files will get converted to *.mp4* if needed (this might take a long time...) and moved to the archive, *.json* files will get deleted upon completion to avoid having duplicates on the next run. 80 | - For best file transcoding quality, convert your media files with desired settings first before importing. 81 | - A notification box will show with progress, follow the docker logs to monitor for errors. 82 | 83 | !!! tip "Start Small" 84 | Starting with a small subset of the files to import to test and confirm that your settings, configurations, and files will work is recommended. 85 | 86 | ## Embed thumbnails into media file 87 | This will write or overwrite all thumbnails in the media file using the downloaded thumbnail. This is only necessary if you didn't download the files with the option *Embed Thumbnail* enabled or you want to make sure all media files get the newest thumbnail. 88 | 89 | ## ZIP file index backup 90 | This will backup your metadata into a zip file. The file will get stored at `/cache/backup` and will contain the necessary files to restore the Elasticsearch index formatted **nd-json** files. For data consistency, make sure there aren't any other tasks running that will change the index during the backup process. This is very slow, particularly for large archives. 91 | 92 | !!! danger "BE AWARE" 93 | This will **not** backup any media files. This is only for the metadata from the Elasticsearch database. 94 | 95 | ## Restore From Backup 96 | The restore functionality will expect the same zip file in `/cache/backup` as created from the **Backup database** function. This will recreate the index from the zip archive file. There will be a list of all available backup to choose from. The *source* tag can have these different values: 97 | 98 | - **manual**: For backups manually created from here on the settings page. 99 | - **auto**: For backups automatically created via a sceduled task. 100 | - **update**: For backups created after a **Tube Archivist** update due to changes in the index. 101 | - **False**: Undefined. 102 | 103 | !!! danger "BE AWARE" 104 | This will **replace** your current index with the one from the backup file. This won't restore any media files. 105 | 106 | ## Rescan Filesystem 107 | This action will go through all your media files and looks at the whole index to try to find any issues: 108 | 109 | - Should the filename not match with the indexed media url, this will rename the video files correctly and update the index with the new link. 110 | - When you delete media files from the filesystem outside of the **Tube Archivist** interface, this will delete leftover metadata from the index. 111 | - When you have media files that are not indexed yet, this will grab the metadata from YouTube as if it was a newly downloaded video. This can be useful when restoring from an older backup file with missing metadata but already downloaded mediafiles. NOTE: This only works if the media files are named in the same convention as **Tube Archivist** expects, alternatively see above for *Manual Media Files Import*. 112 | - The task will stop when adding a video fails, for example if the video is no longer available on YouTube. 113 | - This will also check all of your thumbnails and download any that are missing. 114 | 115 | !!! danger "BE AWARE" 116 | There is no undo. Deleted references and metadata are removed and cannot be brought back without a restore operation. 117 | -------------------------------------------------------------------------------- /mkdocs/docs/settings/application.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Configure this application. 3 | --- 4 | 5 | # Application Settings Page 6 | Accessible at `/settings/application/` of your **Tube Archivist** instance, this page holds all of the general application configuration settings (minus configuration of the [scheduler](scheduling.md)). 7 | 8 | ## Subscriptions 9 | Settings related to the channel management. Disable shorts or streams by setting their page size to 0 (zero). Can also be configured on a [per channel basis](../channels.md#page-size-overrides). 10 | 11 | Defines how many pages will get analyzed by **Tube Archivist** each time you click on *Rescan Subscriptions*. The default page size used by yt-dlp is **50**, which is also the recommended value to set here. Any value higher will slow down the rescan process, for example if you set the value to 51, that means yt-dlp will have to go through 2 pages of results instead of 1 and by that doubling the time that process takes. 12 | 13 | Also see the FAQ [Why does subscribing to a channel not download the complete channel?](../faq.md#why-does-subscribing-to-a-channel-not-download-the-complete-channel) 14 | 15 | ### Video Page Size 16 | Regular videos off a channel. 17 | 18 | ### Live Page Size 19 | Same as above, but for a channel's live streams. *Disable by setting to 0.* 20 | 21 | ### Shorts page Size 22 | Same as above, but for a channel's shorts videos. *Disable by setting to 0.* 23 | 24 | ### Auto Start 25 | This will prioritize and automatically start downloading videos from your subscriptions over regular videos added to the download queue. 26 | 27 | ## Downloads 28 | Settings related to the download process. 29 | 30 | ### Download Speed Limit 31 | Set your download speed limit in KB/s. This will pass the option `--limit-rate` to yt-dlp. 32 | 33 | ### Throttled Rate Limit 34 | Restart download if the download speed drops below this value in KB/s. This will pass the option `--throttled-rate` to yt-dlp. Using this option might have a negative effect if you have an unstable or slow internet connection. 35 | 36 | ### Sleep Interval 37 | Time in seconds to sleep between repeated requests to YouTube. It is recommended to set this to at least **10** seconds to avoid throtteling and getting blocked. The value set will be applied with a random variation of +/- 50%, e.g. a sleep interval of 10 seconds, will delay requests by between 5 and 15 seconds. This is to mimic regular user traffic. 38 | 39 | ### Auto Delete Watched Videos 40 | Automatically delete videos marked as watched after selected days. If activated, checks your videos after download task is finished. Auto deleted videos get marked as [ignored](../downloads.md#the-download-queue) and won't get added again in future rescans. 41 | 42 | ## Download Format 43 | Additional settings passed to yt-dlp. 44 | 45 | ### Format 46 | This controls which streams get downloaded and is equivalent to passing `--format` to yt-dlp. Use one of the recommended configurations or review the documentation for [yt-dlp](https://github.com/yt-dlp/yt-dlp#format-selection). Please note: The option `--merge-output-format mp4` is automatically passed to yt-dlp to guarantee browser compatibility. Similar to that, `--check-formats` is passed as well to check that the selected formats are actually downloadable. 47 | 48 | ### Format Sort 49 | This allows you to change how yt-dlp sorts formats by passing `--format-sort` to yt-dlp. Refer to the [documentation](https://github.com/yt-dlp/yt-dlp#sorting-formats) to see what you can pass here. Be aware that some codecs might not be compatible with your browser of choice. 50 | 51 | ### Extractor Language 52 | Some channels provide translated video titles and descriptions. Add the two letter ISO language code to set your prefered default language. This will only have an effect if the uploader adds translations. Not all language codes are supported, see the [documentation](https://github.com/yt-dlp/yt-dlp#youtube) (the `lang` section) for more details. 53 | 54 | ### Embed Metadata 55 | This saves the available tags directly into the media file by passing `--embed-metadata` to yt-dlp. 56 | 57 | ### Embed Thumbnail 58 | This saves the thumbnail into the media file by passing `--embed-thumbnail` to yt-dlp. 59 | 60 | ## Subtitles 61 | 62 | ### Subtitle Language 63 | Select the subtitle language you like to download. Add a comma separated list for multiple languages. For Chinese you must specify `zh-Hans` or `zh-Hant`, specifying "zh" is invalid, otherwise the subtitle won't download successfully. 64 | 65 | ### Enable Auto Generated 66 | This will fallback to from YouTube auto generated subtitles if subtitles from the uploader are not available. Auto generated subtitles are usually less accurate, particularly for auto translated tracks. 67 | 68 | ### Enable Index 69 | Enabling subtitle indexing will add the lines to Elasticsearch and will make subtitles searchable. This will increase the index size and is not recommended on low-end hardware. 70 | 71 | ## Comments 72 | 73 | ### Index Comments 74 | Set your configuration for downloading and indexing comments. This takes the same values as documented in the `max_comments` section for the youtube extractor of [yt-dlp](https://github.com/yt-dlp/yt-dlp#youtube). Add, without spaces, between the four different fields: *max-comments,max-parents,max-replies,max-replies-per-thread*. 75 | 76 | Example: 77 | 78 | - `all,100,all,30`: Get 100 max-parents and 30 max-replies-per-thread. 79 | - `1000,all,all,50`: Get a total of 1000 comments over all, 50 replies per thread. 80 | 81 | ### Comment sort method 82 | Change sort method between *top* or *new*. The default is *top*, as decided by YouTube. 83 | 84 | - The [Refresh Metadata](scheduling.md#refresh-metadata) background task will get comments from your already archived videos, spreading the requests out over time. 85 | 86 | Archiving comments is slow as only a few comments get returned per request with yt-dlp. Choose your configuration above wisely. Tube Archivist will download comments after the download queue finishes. Your videos will already be available while the comments are getting downloaded. 87 | 88 | ## Cookie 89 | 90 | !!! warning "Cookie Expiry" 91 | Using cookies can have unintended consequences. Multiple users have reported that their account got flagged and cookies will expire within a few hours. It appears that YT has some detection mechanism that will invalidate your cookie if it's being used outside of a browser. That is happening server side on YT. If you are affected, you might be better off to not use this functionality. 92 | 93 | Importing your YouTube Cookie into **Tube Archivist** allows yt-dlp to bypass age restrictions, gives access to private videos and your *Watch Later* or *Liked Videos* playlists. 94 | 95 | ### Security concerns 96 | Cookies are used to store your session and contain your access token to your Google account. **This information can be used to take over your account.** Treat that data with utmost care, as you would any other password or credential. **Tube Archivist** stores your cookie in Redis and will automatically append it to yt-dlp for every request. 97 | 98 | ### Auto import 99 | Easiest way to import your cookie is to use the **Tube Archivist Companion** [browser extension](https://github.com/tubearchivist/browser-extension) for Firefox and Chrome. 100 | 101 | ### Manual Update 102 | Alternatively, you can also manually import your cookie into Tube Archivist. Export your cookie as a *Netscape* formatted text file and paste the content into the text field. 103 | 104 | - There are various tools out there that allow you to export cookies from your browser. This project doesn't make any specific recommendations. 105 | - Once imported, a **Validate Cookie File** button will show, where you can confirm if your cookie is working or not. 106 | - A cookie is considered as _valid_ if yt-dlp is able to access your private [Liked Videos](https://www.youtube.com/playlist?list=LL) playlist. 107 | 108 | ### Use your cookie 109 | Once imported, in addition to the advantages above, your [Watch Later](https://www.youtube.com/playlist?list=WL) and [Liked Videos](https://www.youtube.com/playlist?list=LL) playlists become a regularly accessible playlist that you can download and subscribe to like any other [playlist](../playlists.md). 110 | 111 | ### Limitation 112 | There is only one cookie per Tube Archivist instance. This will be shared between all users. 113 | 114 | ## PO Token 115 | Also known as _proof of origin token_, this is a token required in some cases by YT to validate the requests. See the wiki on the yt-dlp repo with more info, particularly the [PO Token Guide](https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide) page. 116 | 117 | ## Integrations 118 | All third party integrations of **Tube Archivist** will **always** be *opt in*. 119 | 120 | ### API Token 121 | Your access token for the **Tube Archivist** API. 122 | 123 | ### ReturnYoutubeDislike 124 | 125 | This will return dislikes and average ratings for each video by integrating with the API from [returnyoutubedislike.com](https://www.returnyoutubedislike.com/). 126 | 127 | ### SponsorBlock 128 | Using [SponsorBlock](https://sponsor.ajay.app/) to retrieve timestamps for, and skip, sponsored content. If a video doesn't have timestamps, or has unlocked timestamps, use the browser addon to contribute to this excellent project. Can also be activated and deactivated on a per [channel overwrite](../channels.md#about). 129 | 130 | ### Cast 131 | As Cast doesn't support authentication for static files, you'll also need to set [`DISABLE_STATIC_AUTH`](../installation/env-vars.md#disable_static_auth) to disable authentication for your static files. 132 | 133 | Enabling this integration will embed an additional third-party JS library from **Google**. 134 | 135 | **Requirements**: 136 | 137 | - HTTPS: To use the cast integration, HTTPS needs to be enabled. This can be done using a reverse proxy. This is a requirement from Google, as communication to the casting device is required to be encrypted, but the content itself is not. 138 | - Supported Browser: A supported browser is required for this integration, such as Google Chrome. Other browsers, especially Chromium-based browsers, may support casting by enabling it in the settings. 139 | - Subtitles: Subtitles are supported, however they do not work out of the box and require additional configuration. Due to requirements by Google, to use subtitles you need additional headers which will need to be configured in your reverse proxy. See this [page](https://developers.google.com/cast/docs/web_sender/advanced#cors_requirements) for the specific requirements. 140 | - You need the following headers: `Content-Type`, `Accept-Encoding`, and `Range`. Note that the last two headers, `Accept-Encoding` and `Range`, are additional headers that you may not have needed previously. 141 | - Wildcards "*" can not be used for the `Access-Control-Allow-Origin` header. If the page has protected media content, it must use a domain instead of a wildcard. 142 | 143 | ## Snapshots 144 | !!! info 145 | This will make a snapshot of your metadata index only. No media files or additional configuration variables you have set on the settings page will be backed up. 146 | 147 | System snapshots will automatically make daily snapshots of the Elasticsearch index. The task will start at 12pm your local time. Snapshots are deduplicated, meaning that each snapshot will only have to backup changes since the last snapshot. Old snapshots will automatically get deleted after 30 days. 148 | 149 | - **Create snapshot now**: Will start the snapshot process now and outside of the regular daily schedule. 150 | - **Restore**: Restore your index to that point in time. Select one of the available snapshots to restore from. 151 | -------------------------------------------------------------------------------- /mkdocs/docs/settings/dashboard.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Overview and statistics about the application. 3 | --- 4 | 5 | # Dashboard 6 | Accessible at `/settings/` of your **Tube Archivist** instance, this page shows the status and various statistics related to your library. 7 | -------------------------------------------------------------------------------- /mkdocs/docs/settings/scheduling.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Configure the scheduler. 3 | --- 4 | 5 | # Scheduling Settings Page 6 | Accessible at `/settings/scheduling/` of your **Tube Archivist** instance, this page holds all the configuration settings for scheduled tasks. 7 | 8 | !!! tip "Saving Configurations" 9 | Click on **Update Scheduler Settings** at the bottom of the page to apply your configurations. 10 | 11 | ## Configuring Schedules 12 | The scheduler settings expect a cron-like format, where the first value is the minute, second is the hour and third is day of the week as a number. Day 0 is Sunday, day 1 is Monday etc. 13 | 14 | - New schedules will take effect automatically within a few seconds after saving the form. 15 | - The schedule is validated before saving, you'll see an error message if you try to save an invalid schedule. 16 | - Use the **delete** button to remove a schedule. 17 | 18 | 19 | ??? "Examples" 20 | 21 | - `0 15 *`: Run task every day at 3 in the afternoon. 22 | - `30 8 */2`: Run task every second day of the week (Sun, Tue, Thu, Sat) at 08:30 in the morning. 23 | - `0 */3,8-17 *`: Run task every hour divisible by 3, and every hour during office hours (8 in the morning - 5 in the afternoon). 24 | - `0 8,16 *`: Run task every day at 8 in the morning and at 4 in the afternoon. 25 | - `auto`: Sensible default. Each configuration has a default that is defined by the application's Schedule Builder. 26 | 27 | !!! warning "BE AWARE" 28 | - Schedule is tied to the timezone you set with the `TZ` environment variable. 29 | - Cron format as *number*/*number* are non-standard cron formatting and are not supported by the scheduler. For example `0 0/12 *` is invalid, use `0 */12 *` instead. 30 | - Avoid an unnecessary or frequent schedule to reduce likelihood of being blocked or throttled by YouTube. Because of this, the scheduler doesn't support schedules that trigger more than once per hour. 31 | 32 | ### Rescan Subscriptions 33 | This initiates the same task that can be initiated from the [Downloads Page](../downloads.md#rescan-subscriptions). This will go through each of your subscribed channels and playlists and will add missing videos to the download queue. 34 | 35 | Become a sponsor and join [members.tubearchivist.com](https://members.tubearchivist.com/) to get access to *real time* notifications for new videos uploaded by your favorite channels. 36 | 37 | ### Start download 38 | Start downloading all videos currently in the download queue. 39 | 40 | ### Refresh Metadata 41 | Rescan videos, channels and playlists on YouTube and update metadata periodically. This will also refresh your subtitles and comments based on your current settings. If an item is no longer available on YouTube, this will deactivate it and exclude it from future refreshes. This task is meant to be run once per day, set your schedule accordingly. 42 | 43 | The field **Refresh older than x days** takes a number where **Tube Archivist** will consider an item as *outdated*. This value is used to calculate how many items need to be refreshed today based on the total indexed. This will spread out the requests to YouTube. The default value here is **90** days. 44 | 45 | In addition to any outdated documents, this will also refresh very recently published videos. This is to keep metadata and statistics up-to-date during the first few days when the video goes live. 46 | 47 | ### Thumbnail check 48 | This will check if all expected thumbnails are present and will delete any artwork without a matching video. 49 | 50 | ### ZIP file index backup 51 | Create a zip file of the metadata and select **Max auto backups to keep** to automatically delete old backups created from this task. For data consistency, make sure there aren't any other tasks running that will change the index during the backup process. This is very slow, particularly for large archives. Use [snapshots](application.md#snapshots) instead. 52 | 53 | !!! tip "Saving Configurations" 54 | Click on **Update Scheduler Settings** at the bottom of the page to apply your configurations. 55 | 56 | ## Notifications 57 | Some of the tasks support sending notifications at task completion with a short summary message. Tasks can get started through the scheduler or manually from the interface. This uses the amazing [Apprise](https://github.com/caronc/apprise) framework. Refer to the wiki about the [basics](https://github.com/caronc/apprise/wiki/URLBasics) of how to build links and a list of [supported services](https://github.com/caronc/apprise/wiki#notification-services) for the details. 58 | 59 | Send yourself a test notification to verify your link works, e.g.: 60 | ```bash 61 | docker exec -it tubearchivist apprise -b "Hello from TA" 62 | ``` 63 | 64 | !!! note "Notes:" 65 | - This will only send notifications when a task returns anything, e.g. if a [Rescan Subscriptions](#rescan-subscriptions) task doesn't find any new videos to add, **no** notification will will be sent. 66 | - Due to the fact that Apprise is running inside a container, [desktop notifications](https://github.com/caronc/apprise/wiki#desktop-notification-services) will not work. 67 | - Notification services that require additional libraries that what is provided by Apprise are not supported. If you really *need* to use services that require additional libraries, you can use Apprise in a standalone server as a proxy or manually install what you need in the container. 68 | - You can add mutiple notifications for the same task by saving and selecting the same task multiple times. 69 | -------------------------------------------------------------------------------- /mkdocs/docs/settings/user.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Configure the user settings of the application. 3 | --- 4 | 5 | # User Settings Page 6 | Accessible at `/settings/user/` of your **Tube Archivist** instance, this page holds all the settings that control the look and feel of the application. This is configurable for each individual user of your instance. 7 | 8 | Click on **Update User Configurations** at the bottom of the page to apply your configurations. 9 | 10 | ## Color scheme 11 | Switch between the "easy on the eyes" dark theme and the "burning" bright theme. 12 | 13 | ## Archive View 14 | - **Page Size**: Defines how many results get displayed on each page. This value is used for all archive views. 15 | 16 | ## Show Help Text 17 | Activating that will show helpful explanations, sometimes with examples through the interface. Untoggle that to hide that if you are familiar with this project and want to _unclutter_ the interface. 18 | -------------------------------------------------------------------------------- /mkdocs/docs/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Sen-Bold'; 3 | src: url('/fonts/Sen-Bold.ttf.woff'); 4 | font-family: 'Sen-Bold'; 5 | } 6 | 7 | @font-face { 8 | font-family: 'Sen-Regular'; 9 | src: url('/fonts/Sen-Regular.ttf.woff'); 10 | font-family: 'Sen-Regular'; 11 | } 12 | 13 | p, a, span, h3 { 14 | font-family: Sen-Regular; 15 | } 16 | 17 | code span { 18 | font-family: monospace; 19 | } 20 | 21 | h1, 22 | h2, 23 | strong { 24 | font-family: Sen-Bold; 25 | } 26 | 27 | footer { 28 | margin-top: 2rem; 29 | } 30 | 31 | .tag-alert { 32 | color: white; 33 | background-color: var(--highlight-error); 34 | border-radius: 4px; 35 | padding: 0.3em 0.5em; 36 | font-size: 0.85em; 37 | } 38 | 39 | .tag-optional { 40 | color: white; 41 | background-color: var(--accent-font-dark); 42 | border-radius: 4px; 43 | padding: 0.3em 0.5em; 44 | font-size: 0.85em; 45 | } 46 | 47 | .tag-neutral { 48 | color: white; 49 | background-color: var(--secondary-font); 50 | border-radius: 4px; 51 | padding: 0.3em 0.5em; 52 | font-size: 0.85em; 53 | } 54 | 55 | .md-typeset .note > .admonition-title { 56 | background-color: var(--accent-font-dark); 57 | } 58 | 59 | .md-typeset .note > .admonition-title::before { 60 | background-color: var(--main-font); 61 | } 62 | 63 | .md-typeset .admonition.note { 64 | border-color: var(--accent-font-light); 65 | } 66 | 67 | .md-typeset table::not { 68 | border-color: .075rem solid #448aff; 69 | border-radius: 0.2rem; 70 | } 71 | 72 | .md-typeset tr::hover { 73 | background-color: var(--md-admonition-bg-color); 74 | } 75 | 76 | .md-typeset td::not { 77 | border-top: .05rem solid white; 78 | } 79 | 80 | .highlight .nv { 81 | color: var(--highlight-error-light); 82 | } 83 | 84 | [data-md-color-scheme="tubearchivist"] { 85 | --md-default-bg-color: var(--main-bg); 86 | --md-default-fg-color: var(--main-font); 87 | --md-primary-fg-color: var(--accent-font-dark); 88 | --md-primary-fg-color--dark: var(--highlight-bg); 89 | --md-default-fg-color--light: var(--accent-font-light); 90 | --md-default-fg-color--lighter: var(--accent-font-light); 91 | --md-typeset-color: var(--main-font); 92 | --md-typeset-a-color: var(--accent-font-dark); 93 | --md-code-bg-color: var(--highlight-bg); 94 | --md-code-fg-color: var(--accent-font-light); 95 | --md-accent-fg-color: var(--accent-font-light); 96 | --md-admonition-bg-color: var(--highlight-bg); 97 | --md-admonition-fg-color: var(--main-font); 98 | --md-footer-bg-color: var(--highlight-bg); 99 | --md-code-hl-punctuation-color: var(--main-font); 100 | --md-code-hl-name-color: var(--accent-font-light); 101 | --md-code-hl-string-color: var(--accent-font-dark); 102 | --md-code-hl-number-color: var(--highlight-error-light); 103 | --md-code-hl-operator-color: var(--highlight-error); 104 | --md-code-nv-color: var(--highlight-error); 105 | --md-code-hl-comment-color: var(--secondary-font); 106 | --md-typeset-table-color: var(--main-font); 107 | } 108 | 109 | :root { 110 | --main-bg: #00202f; 111 | --highlight-bg: #00293b; 112 | --highlight-error: #990202; 113 | --highlight-error-light: #c44343; 114 | --highlight-bg-transparent: #00293baf; 115 | --main-font: #eeeeee; 116 | --secondary-font: #858585; 117 | --accent-font-dark: #259485; 118 | --accent-font-light: #97d4c8; 119 | --img-filter: invert(50%) sepia(9%) saturate(2940%) hue-rotate(122deg) brightness(94%) contrast(90%); 120 | --img-filter-error: invert(16%) sepia(60%) saturate(3717%) hue-rotate(349deg) brightness(86%) contrast(120%); 121 | } 122 | -------------------------------------------------------------------------------- /mkdocs/docs/urls.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: How URLs from YouTube get parsed 3 | --- 4 | 5 | # URLs 6 | This document describes how **Tube Archivist** identifies and treats links from YouTube. 7 | 8 | !!! info 9 | Application logic of **Tube Archivist** is tied only to the IDs, not the names. 10 | 11 | !!! warning "ID length matters" 12 | When deciding if an ID is a video, playlist or a channel the length of the ID is key. Other lengths of IDs as documented here are explicitly **not** supported. 13 | 14 | ## Video 15 | A video ID is **11** characters long, e.g. `2tdiKTSdE9Y`. 16 | 17 | Urls can have several forms: 18 | 19 | | URL Type | Example | Description | 20 | | :------- | :------ | :---------- | 21 | | Watch URL | `https://www.youtube.com/watch?v=2tdiKTSdE9Y` | Regular URLs you will see while browsing YouTube, with the path */watch* and a *v* parameter | 22 | | Share URL | `https://youtu.be/2tdiKTSdE9Y` | Link you will get when you click on *share* on a video | 23 | | Shorts URL | `https://www.youtube.com/shorts/U80grnZJm_8` | Video links for YouTube shorts | 24 | | Live URL | `https://www.youtube.com/live/ix5XSbY8Zo4` | Video live stream URL | 25 | 26 | ## Channel 27 | A channel ID is **24** characters long, e.g. `UCBa659QWEk1AI4Tg--mrJ2A`. 28 | 29 | Channel URLs can have these forms, all will get translated to the ID: 30 | 31 | | URL Type | Example | Description | 32 | | :------- | :------ | :---------- | 33 | | ID URL | `https://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A` | With a *channel* path | 34 | | Channel Handle | `@TomScottGo` | Starting with a `@` this handle is personal and unique | 35 | | Alias URL | `https://www.youtube.com/@TomScottGo` | Based off the channel handle | 36 | 37 | ### Channel subpages 38 | **Tube Archivist** can differentiate between the primary subpages: 39 | 40 | - Videos only: `https://www.youtube.com/@IBRACORP/videos` 41 | - Shorts only: `https://www.youtube.com/@IBRACORP/shorts` 42 | - Streams only: `https://www.youtube.com/@IBRACORP/streams` 43 | - Every other channel sub page will default to download all, for example `https://www.youtube.com/@IBRACORP/featured` will download videos and shorts and streams. 44 | 45 | ## Playlist 46 | A playlist ID can be `34`, `26` or `18` characters long, e.g. `PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha` 47 | 48 | | URL Type | Example | Description | 49 | | :------- | :------ | :---------- | 50 | | Playlist URL | `https://www.youtube.com/playlist?list=PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha` | Playlist URLs start with a *playlist* path and have a *list* parameter | 51 | 52 | ### Old Playlists 53 | Some old Youtube profiles will have playlists with other lengths that here, notably some old accounts have a "Favorites" playlist, the ID starts with `FL`. Unfortunatly these Playlist IDs are 24 characters long. That collides with the length of channel IDs. As established above, these playlists are not supported. 54 | 55 | ### Playlist vs Video URLs 56 | While browsing YouTube videos in Playlists, you might encounter URLs looking like this: `https://www.youtube.com/watch?v=QPZ0pIK_wsc&list=PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha`. As established above, based on the */watch* path and the *v* parameter, **Tube Archivist** will treat this as a video with the ID `QPZ0pIK_wsc` and **not** as a playlist. If you mean the playlist, you can easily grab the correct ID from the URL, e.g. `PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha`. 57 | -------------------------------------------------------------------------------- /mkdocs/docs/users.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Create users, reset passwords, access the admin interface. 3 | --- 4 | 5 | # User Management 6 | 7 | For now, **Tube Archivist** is *mostly* a single user application. You can create multiple users with different names and passwords, however they will share the same videos and channels. You can configure some permissions, and specific configurations are on a per-user basis. *More is on the roadmap*. 8 | 9 | ## Superuser 10 | The first user gets created with the environment variables **TA_USERNAME** and **TA_PASSWORD** from your docker-compose file. This first user will automatically have *superuser* privileges. 11 | 12 | ## Admin Interface 13 | When logged in from your *superuser* account, you are able to access the admin interface from the settings page or at `/admin/`. This interface holds all functionality for user management. 14 | 15 | !!! tip "Superuser status required" 16 | This interface is only accessible by users with the **Superuser status** permission. 17 | 18 | ## Create additional users 19 | From the admin interface when you click on *Accounts* you will get a list of all users. From there you can create additional users by clicking on *Add Account*, provide a name and confirm a password. and then click on *Save* to create the user. 20 | 21 | ## Video Management Permissions 22 | To create a user that has permissions to modify the download queue, delete items (channels, videos, playlists, etc.) and change general configuration settings, the user will require the **Is Staff** permission for the user. 23 | 24 | ## Read Only User 25 | To create a user with limited permissions, remove the **Is Staff** and **Superuser status** permissons. This will make this user a *read only* user, meaning this user will not be able to add to the download queue, delete anything, etc. 26 | 27 | !!! warning "Minimally Tested" 28 | This is mostly meant as a *kids mode* or similar, this will most likely not hold against a sophisticated attacker. 29 | 30 | ## Changing users 31 | You can delete or change permissions and password of a user by clicking on the username from the *Accounts* list page and follow the interface from there. Changing the password of the *superuser* here will overwrite the password originally set with the environment variables. 32 | 33 | ## Reset 34 | Delete all user configurations by deleting the file `cache/db.sqlite3` and restart the container. This will create the superuser again from the environment variables. 35 | 36 | !!! danger "BE AWARE" 37 | Future feature improvements here may require resetting the user administration database. 38 | 39 | ## Forgot Password 40 | If you forgot your password, you can change it directly over the CLI with: 41 | 42 | ```python manage.py ta_change_password username password``` 43 | 44 | e.g.: 45 | 46 | ```bash 47 | docker compose exec -it tubearchivist python manage.py ta_change_password tubearchivist 123456 48 | ``` 49 | 50 | to change the password of the user `tubearchivist` to `123456`. 51 | -------------------------------------------------------------------------------- /mkdocs/docs/video.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Complete Video metadata with playlist navigation and comments. 3 | --- 4 | 5 | # Video Page 6 | Every video downloaded gets a dedicated page accessible at `/video//` of your **Tube Archivist** instance. Throughout the interface, clicking on a video title will access the video page. 7 | 8 | Clicking on the channel name or the channel icon will bring you to the dedicated [channel detail page](channels.md#channel-detail). 9 | 10 | - The button **Reindex** will reindex the metadata of this video. 11 | - The button **Download File** will download the media file in the browser. 12 | - The button **Delete Video** will delete that video entry and the media file. 13 | - The button **Delete and ignore** will also add the video to the [ignore list](downloads.md/#the-download-queue), so it won't get added again with a rescan. 14 | - The button **Add to Playlist** opens a list of your available [custom playlists](playlists.md/#playlist-overview). Check the box to add the video to the list. 15 | 16 | If available, a tag cloud will show, representing the tags set by the uploader. 17 | 18 | You can also find stream metadata like file size, video codecs, video bitrate and resolution, audio codecs and bitrate. 19 | 20 | The video description is truncated to the first few lines, clicking on *show more* will expand to show the whole description. 21 | 22 | ## Playlist 23 | When available, a playlist navigation will show at the bottom. Clicking on the playlist name will bring you to the dedicated [Playlist Detail page](playlists.md#playlist-detail) showing all videos downloaded from that playlist. The number in square brackets indicates the position of the current video in that playlist. 24 | 25 | Clicking on the next, or previous, video name or thumbnail will bring you to that dedicated video page. 26 | 27 | ## Similar Videos 28 | **Tube Archivist** will show up to six similar videos in a grid. Similarity is detected from the **video title** and the **video tags**. This naturally will show some videos from the same channel, but can also return videos about the same topic from other channels. 29 | 30 | When playing a video from the similar section with the inline player, the current video will get replaced. Refreshing the page to reset that or clicking on the video title will avoid that behavior. 31 | 32 | ## Comments 33 | If activated on the [Settings Page](settings/application.md#comments), this will show the indexed comments. Reveal the threads by clicking the *+ Replies* button. Comments with a heart symbol are favorited by the uploader, and comments by the uploader are highlighted in a different color. 34 | -------------------------------------------------------------------------------- /mkdocs/mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Tube Archivist Documentation 2 | site_url: https://docs.tubearchivist.com 3 | nav: 4 | - Home: 'index.md' 5 | - User Guide: 6 | - 'FAQ': 'faq.md' 7 | - 'URLs': 'urls.md' 8 | - 'Downloads Page': 'downloads.md' 9 | - 'Channels Pages': 'channels.md' 10 | - 'Video': 'video.md' 11 | - 'Playlists Pages': 'playlists.md' 12 | - 'Search': 'search.md' 13 | - 'Users': 'users.md' 14 | - Settings: 15 | - 'Dashboard': 'settings/dashboard.md' 16 | - 'User': 'settings/user.md' 17 | - 'Application': 'settings/application.md' 18 | - 'Scheduling': 'settings/scheduling.md' 19 | - 'Actions': 'settings/actions.md' 20 | - 'Advanced': 'advanced.md' 21 | - Installation: 22 | - 'Environment Variables': 'installation/env-vars.md' 23 | - 'Docker-Compose (default)': 'installation/docker-compose.md' 24 | - 'Docker for Beginners': 'installation/docker-for-beginners.md' 25 | - 'Helm Charts': 'installation/helm-charts.md' 26 | - 'Podman': 'installation/podman.md' 27 | - 'Proxmox LXC': 'installation/proxmox-lxc.md' 28 | - 'Synology': 'installation/synology.md' 29 | - 'Unraid': 'installation/unraid.md' 30 | - Configuration: 31 | - 'LDAP Authentication': 'configuration/ldap.md' 32 | - 'Forward Authentication': 'configuration/forward-auth.md' 33 | - 'Stylesheets': 'configuration/stylesheets.md' 34 | - API: 35 | - 'Introduction': 'api/introduction.md' 36 | - 'Docs': 'api/docs.md' 37 | - Links: 38 | - 'Main site': https://www.tubearchivist.com 39 | - 'Join us on Discord!': https://www.tubearchivist.com/discord 40 | - 'License': https://github.com/tubearchivist/tubearchivist/blob/master/LICENSE 41 | - 'Release Notes': https://github.com/tubearchivist/tubearchivist/releases 42 | repo_url: https://github.com/tubearchivist/docs 43 | markdown_extensions: 44 | - toc: 45 | permalink: "#" 46 | - admonition 47 | - pymdownx.details 48 | - pymdownx.superfences 49 | - tables 50 | - footnotes 51 | theme: 52 | name: material 53 | logo: assets/logo-dark.jpg 54 | favicon: assets/favicon.ico 55 | font: false 56 | custom_dir: overrides 57 | palette: 58 | scheme: tubearchivist 59 | features: 60 | - navigation.footer 61 | - content.code.copy 62 | extra_css: 63 | - stylesheets/style.css 64 | extra: 65 | analytics: 66 | provider: custom 67 | plugins: 68 | - social: 69 | cards_layout_options: 70 | background_color: "#00202f" 71 | color: "#eeeeee" 72 | - search: 73 | lang: en 74 | -------------------------------------------------------------------------------- /mkdocs/overrides/partials/copyright.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mkdocs/overrides/partials/integrations/analytics/custom.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | requirementscheck==0.0.6 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | cairosvg==2.8.1 2 | mkdocs-material==9.6.14 3 | mkdocs==1.6.1 4 | pillow==11.2.1 5 | --------------------------------------------------------------------------------