Compare commits

..

628 Commits

Author SHA1 Message Date
Sean
b246dbcd75
Merge pull request #4 from n8detar/master
Added re-scan subs and start download functionality to downloads page
2022-09-10 21:58:49 -05:00
Sean
40676990d2
Merge pull request #9 from tubearchivist/renovate/next-auth-4.x
fix(deps): update dependency next-auth to v4.7.0
2022-09-10 21:58:21 -05:00
Sean
7c4f7d8051
Merge pull request #10 from tubearchivist/renovate/react-query-3.x
fix(deps): update dependency react-query to v3.39.1
2022-09-10 21:58:12 -05:00
renovate[bot]
9b68493c9f
fix(deps): update dependency next-auth to v4.7.0 2022-06-28 17:03:15 +00:00
Renovate Bot
4865b75e51
fix(deps): update dependency react-query to v3.39.1 2022-05-29 18:27:07 +00:00
n8detar
f42efe69be Merge branch 'master' of github.com:n8detar/tubearchivist-frontend 2022-04-30 11:25:09 -07:00
n8detar
b5b076793d Added no token message. 2022-04-30 11:24:45 -07:00
Nathan DeTar
102eaab1f5
Merge branch 'tubearchivist:master' into master 2022-04-30 11:21:16 -07:00
Sean
870a0a901e
Merge pull request #3 from tubearchivist/docu
better CORS solution, note about unstable build
2022-04-30 12:42:17 -05:00
Sean
7dcba72cc4
Merge pull request #7 from tubearchivist/renovate/pin-dependencies
chore(deps): pin dependencies
2022-04-23 21:08:07 -05:00
Renovate Bot
f7c7ba7c73
chore(deps): pin dependencies 2022-04-24 01:56:46 +00:00
Sean Norwood
950a7fe558 Merge branch 'master' of github.com:tubearchivist/tubearchivist-frontend 2022-04-24 01:55:06 +00:00
Sean Norwood
718fd73b8b chore: remove unused dependency 2022-04-24 01:54:24 +00:00
Sean
4a9259727e
Merge pull request #6 from tubearchivist/feat/ci
ci: add basic install,build,lint ci
2022-04-23 20:52:05 -05:00
Sean Norwood
097fc4fa51 chore: add prettier config 2022-04-24 01:50:10 +00:00
Sean Norwood
680fbafb9c ci: add precommit hooks 2022-04-24 01:49:15 +00:00
Sean Norwood
20acdfa2ae Merge branch 'master' of github.com:tubearchivist/tubearchivist-frontend into feat/ci 2022-04-24 01:42:02 +00:00
n8detar
30f0dbb81a Switched to type Tasks & message cleanup 2022-04-23 11:38:16 -07:00
n8detar
e41ac9276b Switched to type Tasks & message cleanup 2022-04-23 11:37:46 -07:00
n8detar
0ea19defcc Added type Tasks 2022-04-23 11:36:55 -07:00
Sean Norwood
42362ba14b chore: fix some misc syntax bugs 2022-04-23 18:10:12 +00:00
Sean Norwood
2734edcac5 ci: remove node v18 since next-auth doesn't support it 2022-04-23 17:58:27 +00:00
Sean Norwood
8c294cec4d ci: add basic install,build,lint ci 2022-04-23 17:52:08 +00:00
Sean
11643afe4b
Merge pull request #2 from tubearchivist/renovate/configure
Configure Renovate
2022-04-23 12:44:17 -05:00
Sean Norwood
ca36008df9 chore: update renovate config 2022-04-23 17:43:55 +00:00
n8detar
883f5dc801 Added rescan subs and start download functionality 2022-04-23 09:40:51 -07:00
9401bf8f7f
better CORS solution, note about unstable build 2022-04-23 22:05:57 +07:00
Renovate Bot
dbe21b49fa
chore(deps): add renovate.json 2022-04-22 18:17:08 +00:00
2a69e0e319
remove test line 2022-04-23 00:55:31 +07:00
1de6b9e83e
test to push to master 2022-04-23 00:52:28 +07:00
74f562c3cf
add header 2022-04-23 00:46:30 +07:00
7b5903c12c
help with errors and environment setup 2022-04-23 00:41:50 +07:00
Sean Norwood
2462eb9686 chore: remove tubearchivist backend files 2022-04-22 12:34:56 -05:00
Sean
9b4b75a11a
Merge pull request #3 from n8detar/feat/react-frontend
Downloads Page
2022-04-22 12:30:07 -05:00
n8detar
5bf24d1576 Improved channel subscribe button. 2022-04-22 09:19:20 -07:00
n8detar
0f5ad25a92 Format number of subscribers 2022-04-22 09:09:55 -07:00
n8detar
4082fe1e1c Fix for the fix for the no videos queued message. 2022-04-22 09:02:23 -07:00
n8detar
6e38df958d Fix for videos queued message. 2022-04-22 09:01:14 -07:00
n8detar
b41348d961 Reset page number when switching to ignored. 2022-04-21 12:18:36 -07:00
n8detar
3d68f52d5d Change cursor type for pagination buttons. 2022-04-21 12:15:18 -07:00
n8detar
bcfd89be02 Pagination improvments. 2022-04-21 12:02:03 -07:00
n8detar
d948b3e8e7 Pagination improvements 2022-04-21 10:53:14 -07:00
n8detar
e5fc4a3282 Added WIP Pagination 2022-04-21 10:39:48 -07:00
n8detar
3c8434eb42 Improved Error Handling 2022-04-21 09:44:59 -07:00
n8detar
3b908b29f0 Prevent connect message while loading 2022-04-21 09:08:48 -07:00
n8detar
0c0b58af71 Handle TA offline 2022-04-21 09:03:36 -07:00
n8detar
b300a74669 Fix error handling when adding download to queue 2022-04-21 08:56:48 -07:00
n8detar
eccf27a434 Error Handling WIP 2022-04-21 08:15:57 -07:00
n8detar
c6571674a8 Merge branch 'testing' of github.com:n8detar/tubearchivist into feat/react-frontend 2022-04-21 08:02:54 -07:00
n8detar
bd04ab3a72 Merge branch 'feat/react-frontend' of github.com:insuusvenerati/tubearchivist into feat/react-frontend 2022-04-21 07:57:29 -07:00
b76f38e0bc
API: fix downloads list sort 2022-04-21 05:45:55 +07:00
Sean Norwood
b44390559e fix: video urls 2022-04-20 19:38:39 +00:00
n8detar
d7c45ba966 Handle no API endpoint and API failures. 2022-04-20 11:33:58 -07:00
n8detar
db148dcdf3 Merge remote-tracking branch 'TA/testing' into feat/react-frontend 2022-04-20 10:27:27 -07:00
n8detar
54882b744d Fixed button margin & pagination testing 2022-04-20 09:37:33 -07:00
n8detar
950f83cd52 Added button-padding class 2022-04-20 09:14:29 -07:00
1477370376
init data instead of class attribute 2022-04-20 22:51:30 +07:00
04fc6ed26a
API: add pagination 2022-04-20 22:43:07 +07:00
7305216485
add link to ES documentation for disk usage 2022-04-19 08:07:47 +07:00
n8detar
3430d5ae17 Notifications groundwork 2022-04-18 11:57:01 -07:00
n8detar
494d97ee60 Added Ignore and Add back to queue functionality 2022-04-18 10:51:41 -07:00
n8detar
db14aabcac Added Forget/Delete button functionality 2022-04-18 10:44:03 -07:00
n8detar
1dcc4c2e78 Removed No videos message when looking at ignored 2022-04-18 10:36:19 -07:00
n8detar
2159b1d39d Add delete all ignored & pending 2022-04-18 10:33:14 -07:00
n8detar
66c2799e7e Switch to TA error notification 2022-04-18 10:24:53 -07:00
n8detar
a5c50fd690 Added invalid input message. 2022-04-18 09:00:53 -07:00
3147df20da
skip subtitle segments without duration, take 2 2022-04-18 11:52:13 +07:00
n8detar
46c6e7e925 Use filter API for download queue 2022-04-17 16:32:10 -07:00
n8detar
93822fc43c API changes 2022-04-17 12:47:18 -07:00
Sean Norwood
374229d61d Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-17 17:15:04 +00:00
Sean
d6b34a7b30
Merge pull request #2 from n8detar/feat/react-frontend
Added download page.
2022-04-17 12:13:21 -05:00
d086f63861
API: sort and query filter download view, delete by filter 2022-04-17 20:10:49 +07:00
40bb3e880e
API: implement status update and delete of item in queue 2022-04-17 19:15:40 +07:00
Sean Norwood
5e5680a661 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-17 04:30:34 +00:00
Nathan DeTar
fa8404d73e
Adjust to API 2022-04-16 21:02:07 -07:00
Nathan DeTar
2b39f2439d
Adjust to API 2022-04-16 21:01:10 -07:00
eb6d6be3b9
handle 404 in channel-video and playlist-video api view 2022-04-17 10:08:24 +07:00
b8ca324aaf
add playlist-video and channel-video api views 2022-04-17 09:58:18 +07:00
Nathan DeTar
483db30798
Merge branch 'tubearchivist:master' into feat/react-frontend 2022-04-16 18:12:43 -07:00
n8detar
72cbf2ba04 Added add to download queue function. 2022-04-16 18:03:17 -07:00
Sean Norwood
c3a9c23736 chore: add ts types and /video/id page 2022-04-17 00:49:52 +00:00
Sean Norwood
df30173ba3 chore: more code cleanup and use better env vars 2022-04-17 00:49:20 +00:00
Sean Norwood
526c98ca8a Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-17 00:45:58 +00:00
n8detar
add20a4a6a Use DefaultView from API. 2022-04-16 15:39:33 -07:00
n8detar
d9fae64afb Download queue list & Show ignored functionality 2022-04-16 15:26:30 -07:00
7d45d23767
process ta_download search results 2022-04-17 05:21:35 +07:00
9224696e33 Merge branch 'api-fix' into testing 2022-04-17 05:03:05 +07:00
Sean Norwood
cf11ae53d4 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-16 19:16:07 +00:00
n8detar
7291511eb8 Switch img to NextImage. 2022-04-16 10:51:47 -07:00
50f4e0e5b7
skip base64 generator, hotfix 2022-04-16 13:08:32 +07:00
fcdb31e848
bump release number 2022-04-16 09:30:40 +07:00
70ac33928f
update roadmap 2022-04-16 09:29:49 +07:00
n8detar
d3fd032a81 Added download page. 2022-04-15 19:07:29 -07:00
59f1c111aa
extend timeout for sleep interval 2022-04-16 08:58:35 +07:00
Nathan DeTar
1cf82bdbbd
Cleanup & Prevent repeat of skip message. (#227)
* Cleanup & Prevent repeat of skip message.

* skip sponsorblock segments if not indexed

* disable onVideoProgress sb check if not indexed

Co-authored-by: simon <simobilleter@gmail.com>
2022-04-16 08:53:15 +07:00
Sean Norwood
e71b909a27 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-16 00:17:59 +00:00
Sean Norwood
f2d537a467 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-15 18:47:15 +00:00
ef803a157a
standard api key processor for list and single views 2022-04-16 00:37:56 +07:00
51ceffd58f
update all links to tubearchivist organization 2022-04-15 22:35:13 +07:00
f05c292170
add new home message 2022-04-15 21:35:44 +07:00
b819c2f723
merge testing into master before repo migration 2022-04-15 21:16:28 +07:00
fe610fdaca
add log output for backup progress 2022-04-15 20:41:38 +07:00
2fc4ed419e
add note about tubearchivist-es to readme 2022-04-15 20:07:59 +07:00
c84fbdfb9c
fix _check_get_sb for per channel deactivate 2022-04-15 20:04:01 +07:00
7231b5d245
implement unset of sb per channel overwrite 2022-04-15 20:03:15 +07:00
3d16954c79
change to tubearchivist-es, add comments 2022-04-15 17:56:17 +07:00
c5746089f5
auto dedect new es version 2022-04-15 17:46:16 +07:00
Ainsey11
dc29c6718c
Fix: #210 - Download UI Box being removed when file is still processing (#219)
* Fix: https://github.com/bbilly1/tubearchivist/issues/210 - Download UI element is removed when the file has finished downloading, but is still being moved on disk to the storage destination. This means the user is presented with nothing in the UI yet the file is still being processed.

* FIX: Resolving linting issue

* FIX: Set moving message to never expire and then a second message after the move with a 4 second expiry timer.

Co-authored-by: Rob Ainsworth <roba@immjsystems.com>
2022-04-15 15:21:24 +07:00
d4b1d97f5c
add mappings for sponsorblock segments 2022-04-15 15:16:31 +07:00
f71644c8bc
guarantee stats in mapping for sort 2022-04-15 15:03:43 +07:00
Sean Norwood
8a554f69d1 chore: organize and optimize some code 2022-04-14 20:34:38 +00:00
Sean Norwood
d86fcd4a8f chore: fix sticky footer issue 2022-04-14 20:33:53 +00:00
Sean Norwood
d305c94989 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-14 19:45:23 +00:00
Sean Norwood
5913d31b8f chore: add comments to example .env 2022-04-14 14:49:56 +00:00
Sean Norwood
eec616f1af chore: add example .env file 2022-04-14 14:46:08 +00:00
80c76c22ca
add wiki documentation for sponsorblock integration 2022-04-14 16:49:27 +07:00
4853a8b12b
limit video_daily to below 10k in daily refresh 2022-04-14 16:18:08 +07:00
fd00369859
fix last page pagination link building error, #221 2022-04-14 16:04:21 +07:00
a8a7edb93e
skip subtilte events without duration, #196 2022-04-14 15:53:10 +07:00
Sean Norwood
b62b903ed5 chore: misc changes
Clean up some code inconsistencies
Try to handle async stuff better
2022-04-13 20:53:39 +00:00
Sean Norwood
8b86c327c5 chore: don't run client side query until token is available 2022-04-13 15:09:08 -05:00
Sean Norwood
85f1a62e84 chore: protect pages with auth 2022-04-13 18:08:32 +00:00
Sean Norwood
6bf77b05aa chore: add login page 2022-04-13 18:08:19 +00:00
Sean Norwood
3efd651db3 feat: add playlist page 2022-04-13 18:08:07 +00:00
Sean Norwood
2e4cd0b914 chore: add devcontainer config for vscode 2022-04-13 16:12:05 +00:00
Sean Norwood
6e4bb5b805 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-13 15:10:33 +00:00
5f90d21234
update roadmap, extend user created playlist functionality 2022-04-13 16:13:43 +07:00
c59c1fc007
improved sponsorblock indexing, #build
Changed:
- improved more flexible sb timestamps indexing
- fixed per channel sb activate/deactivate
- improved Dockerfile with multi stage build
- added playlist API list view
2022-04-13 15:56:05 +07:00
3007e02fe5
fix per channel sb integration 2022-04-13 15:53:00 +07:00
Nathan DeTar
39c4bd8883
Adjust to API changes for SB integration. (#222) 2022-04-13 10:30:32 +07:00
cd3e9dd024
add playlist API list view 2022-04-13 09:51:15 +07:00
Sean Norwood
e4f5741c0f chore: channel data can be undefined for now 2022-04-12 19:24:57 +00:00
Sean Norwood
678aacb696 chore: use react query with initial state loaded from nextjs 2022-04-12 19:18:16 +00:00
Sean Norwood
bdc0c93c09 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-12 15:06:18 +00:00
8edde732b6
improved sponsorblock key with additional metadata 2022-04-12 17:47:13 +07:00
3df1df8b5a
set explicit mappings for sponsorblock key 2022-04-12 17:45:06 +07:00
1c233dd4f4
move install requirements after ffmpeg curl for better cache use 2022-04-11 17:58:19 +07:00
385f53372c
bump django 2022-04-11 17:57:29 +07:00
f79d30ab54 multi stage build Dockerfile for python wheel 2022-04-11 00:05:03 +07:00
Ainsey11
a8ee0da2b8
Addiing clarification on when the speed limit change takes effect (#218)
Relates to https://github.com/bbilly1/tubearchivist/issues/216 

Speed limits work as designed, however the wording in the tooltip is a little unclear to newer users about when the speed limit takes effect on their downloads
2022-04-10 22:33:00 +07:00
0c84386209
add link to installation.md to home 2022-04-10 16:53:07 +07:00
f52a00937f
renamed to generic installation.md wiki page 2022-04-10 16:51:40 +07:00
4b33559212
build failure workaround, upgrade pip and setuptools 2022-04-10 16:45:50 +07:00
fd5de99674
implement sponsorblock skipping, #build
Changed:
- sponsorblock frontent implementation, #208
- per channel sponsorblock
- improved scheduler input validation
2022-04-10 16:26:47 +07:00
582011d247 Merge branch 'master' into testing 2022-04-10 16:25:48 +07:00
Nathan DeTar
c316d05549
Added sponsorblock skipping (#208)
* Added sponsorblock skipping.

* Basic framework for sending SB timestamps

* Sponsorblock send timestamp UI improvements

* Added Sponsorblock Icons

* Minor UI tweaks

* Revert UI changes, implement in new UI

* Added notification when sponsor segment is skipped

* Add formatting for notifications & SB messages

* Added SB messages to JS player

* Added SB skip notifcation to videos page.

* Added SB messages to video page

* Change SB messages.

* Check channel_overwrites

* Check Per Channel Settings.

* Cleanup
2022-04-10 16:20:58 +07:00
crocs
77a19a62df
added tumbnail reference in the wiki page (#213)
Co-authored-by: user.crocs <user.pairofcrocs@protonmail.com>
2022-04-10 16:19:39 +07:00
31378ac756
better generic schedule validator for impossible input, #209 2022-04-10 15:58:11 +07:00
10385b1414
bump bs4 2022-04-10 15:57:15 +07:00
d8c7b3df0b
better error message for wrong es version, #197 2022-04-09 14:12:03 +07:00
99e0c1c90e
bump yt-dlp 2022-04-08 23:15:58 +07:00
236215cc4c
add config var to video.html template 2022-04-08 22:10:16 +07:00
552636d882
handle 404 in video item API view 2022-04-08 17:55:24 +07:00
9d73dbc45a
implement video overwrites index for sponsorblock 2022-04-08 17:19:25 +07:00
859bf2a28d
add target _blank to external links 2022-04-08 17:18:33 +07:00
365ebf53a5
implement per channel sponsorblock 2022-04-08 17:17:39 +07:00
fe3e3cfacc
fix filenotfounderror for missing subtitles when deleting video 2022-04-08 15:56:34 +07:00
efa240440b
fix userspace for vide base config 2022-04-08 15:15:59 +07:00
e2f4dd124a
bump beautifulsoup4 2022-04-08 15:15:37 +07:00
90337745bf Merge branch 'master' into testing 2022-04-08 14:17:10 +07:00
Sean Norwood
193c3da8ef chore: potentially use plaicholder to create blurred placedholder images 2022-04-07 22:55:10 +00:00
Sean Norwood
be0c098ef9 chore: add channel page and clean up some code 2022-04-07 22:54:15 +00:00
Sean Norwood
cb3a7e555b chore: setup video list to use blurred placeholders for thumbnails 2022-04-07 22:53:01 +00:00
Sean Norwood
9608c892a9 chore: fix up nav
Next requires links to use next/link
Fixed Icon sizes
2022-04-07 22:52:28 +00:00
Sean Norwood
8616959fee chore: render tab title correctly 2022-04-07 22:51:40 +00:00
Sean Norwood
67fec4ae5e chore: use the nextjs way for fonts 2022-04-07 22:51:23 +00:00
crocs
f885965c2b
Merge pull request #207 from pairofcrocs/patch-7
Create AlternativeInstallation.md
2022-04-07 15:46:58 -05:00
Sean Norwood
9ddb651180 Merge branch 'testing' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-07 17:31:27 +00:00
a07d789e66
add base64 blur video thumb 2022-04-08 00:29:09 +07:00
6a1cb15114
validate hours to not be greater than 23, #209 2022-04-07 23:02:07 +07:00
b1a7a6a148
use cleaned_data for config form parser 2022-04-07 22:30:20 +07:00
Sean Norwood
4e4db8f0ae chore: don't need to load script.js anymore 2022-04-06 18:48:12 +00:00
Sean Norwood
42ff29c13d chore: use env var for api url 2022-04-06 18:31:05 +00:00
Sean Norwood
d86cf81719 chore: update video list
* Store current video in local state temporaily
* Default to list view temporarily
* Implements the video list and video player with basic funtionality
2022-04-06 18:29:04 +00:00
Sean Norwood
99316eeee8 chore: update links to next/link 2022-04-06 18:27:18 +00:00
Sean Norwood
9988779f3a Merge branch 'master' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-05 16:24:16 +00:00
39a6fbea74
add links to roadmap issues 2022-04-05 22:56:47 +07:00
573c1514bf
simulate sponsorblock voting api endpoints, #build
Changed:
- added simulated post sponsorblock api endpoints
- updated api documentation
- updated roadmap
2022-04-05 22:34:51 +07:00
348a114981
update Roadmap 2022-04-05 22:32:55 +07:00
a84e657577
add documentation for sponsorblock api endpoints 2022-04-05 22:27:55 +07:00
03dd25cff4
implement vote on sponsorblock segments api 2022-04-05 22:25:40 +07:00
286b1cf9b6
simulate sponsorblock post request 2022-04-05 21:51:45 +07:00
bace7d41af
add random string generator helper function 2022-04-05 21:51:10 +07:00
738b083a7f
create dedicated SponsorBlock class to handle integration 2022-04-05 21:50:40 +07:00
1ac92254ad
add global vars for version and url 2022-04-05 18:43:15 +07:00
e404bac7c3
bump celery 2022-04-05 18:35:06 +07:00
Sean Norwood
cfffa8bd38 chore: just render api data for now 2022-04-04 19:57:27 +00:00
0a839ff960 Merge branch 'testing' 2022-04-05 00:05:47 +07:00
a8b62e5cdc better error message on sponsorblock fail 2022-04-04 23:28:32 +07:00
730d12212f implement basic sponsblock indexing, #119 2022-04-04 23:28:32 +07:00
29f8e148da bump libraries 2022-04-04 23:28:32 +07:00
71c441d871
better error message on sponsorblock fail 2022-04-04 23:24:51 +07:00
crocs
00750500a1
Add files via upload 2022-04-04 11:16:24 -05:00
77228ccb65
implement basic sponsblock indexing, #119 2022-04-04 23:08:44 +07:00
crocs
f0fba0644d
Create AlternativeInstallation.md 2022-04-04 11:08:36 -05:00
2292e6506d
bump libraries 2022-04-04 22:55:43 +07:00
Sean Norwood
97c01a2f3a chore: type info for api 2022-04-04 02:52:23 +00:00
Sean Norwood
9284b93f2a chore: start laying out the home page
* Use the layout component
* Use SSR to get videos from API
2022-04-04 02:52:03 +00:00
Sean Norwood
4fa8cd89e2 chore: external script work and comments 2022-04-04 02:51:16 +00:00
Sean Norwood
a129e737d2 chore: add static images 2022-04-04 02:50:54 +00:00
Sean Norwood
8b10fd9302 chore: add various components
* Footer
* Head
* Layout
* Nav
* VideoList
2022-04-04 02:50:43 +00:00
Sean Norwood
7ac6e6c26b chore: use correct typescript version for eslint 2022-04-03 20:04:53 +00:00
Sean Norwood
2c4ab1bb42 chore: use new components 2022-04-03 20:04:28 +00:00
Sean Norwood
73106fc74a chore: add external scripts 2022-04-03 20:04:17 +00:00
Sean Norwood
3c4c15a8e3 chore: move dynamic header component to header file 2022-04-03 20:03:47 +00:00
Sean Norwood
62c219c2de chore: add custom head element 2022-04-03 20:03:30 +00:00
Sean Norwood
734078c5d7 Merge branch 'master' of https://github.com/bbilly1/tubearchivist into feat/react-frontend 2022-04-03 18:33:10 +00:00
4775c9d830
connection test API endpoing, #build
Changed:
- added /api/ping/ to test your connection
- moved browserextension to dedicated repo
- merges nginx ipv6 fix, #203
2022-04-03 08:24:38 +07:00
Sean Norwood
3870a54d2e chore: enable streaming ssr 2022-04-03 00:28:12 +00:00
Sean Norwood
cf9181919a chore: initial suspense setup 2022-04-03 00:27:33 +00:00
Sean Norwood
ad67cb00e2 chore: remove console log 2022-04-03 00:27:00 +00:00
Sean Norwood
eec288af5f chore: add external js files 2022-04-03 00:26:53 +00:00
Sean Norwood
d880f95c44 chore: header component 2022-04-03 00:26:42 +00:00
Sean Norwood
1e3087c245 chore: update to react 18 2022-04-03 00:26:30 +00:00
cae00b032b return better data for ping api, add to readme 2022-04-01 16:24:40 +07:00
Lickitysplitted
3ae9fe5405
Modify Dockerfile and the nginx.conf file to avoid Nginx default conf… (#203)
* Modify Dockerfile and the nginx.conf file to avoid Nginx default config IPv6 conflict.

* Adjust nginx.conf name and run.sh nginx modification.

* but nginx.conf file back

Co-authored-by: simon <simobilleter@gmail.com>
2022-04-01 11:43:24 +07:00
12fa5748d4
move extension to tubearchivist/browser-extension 2022-04-01 08:48:42 +07:00
ab9c02dfad
redefine scope of current state 2022-03-31 23:39:46 +07:00
4de5b2d091 Merge branch 'browserextension' into testing 2022-03-31 23:29:11 +07:00
ed6521acad
reimagine browser extension, simple download button 2022-03-31 23:28:53 +07:00
9ab6955125
add connection test api view 2022-03-31 21:13:21 +07:00
46622d9ab2
bump redis lib 2022-03-31 21:13:04 +07:00
607d9b3030
add sync_latest_es function to update tubearchivist-es:latest container 2022-03-31 14:47:19 +07:00
4eb2fb01d9
a note about SSO, LDAP, 2FA in the FAQ 2022-03-30 17:49:03 +07:00
3caafc6e21
update roadmap, rewording 2022-03-30 17:44:54 +07:00
8a3349c6a5
a note about transcoding quality, #138 2022-03-30 17:27:53 +07:00
b46910ec90
update roadmap, add issue links 2022-03-30 17:21:25 +07:00
Sean Norwood
1b5534b6d4 Initial React frontend work
Uses NextJS as a React framework
Initial import of assets in `public/`:
* css/
* favicon/
* img/

Initial authentication work
* Use next-auth CredentialsProvider to pull user information from TA
* Add sign in and sign out functionality using default next-auth
login page

TODO
* Custom login page
2022-03-29 17:19:24 +00:00
1cd285aec4
parse api views, #build
Changed:
- return frontend relevant paths for api views
- add video api list view
2022-03-29 18:36:54 +07:00
e51193f988
update roadmap 2022-03-29 18:35:01 +07:00
0783d47ffe
bump python version 2022-03-29 18:34:31 +07:00
6f5969f520
add video list api view 2022-03-29 17:05:22 +07:00
0c8fa8f49e
clean up prints 2022-03-29 17:03:34 +07:00
80af255f25
reinvent SearchProcess class for API endpoints 2022-03-29 16:48:04 +07:00
cdc617c382
add datestr generator 2022-03-29 16:47:21 +07:00
f1fb504874
fix spacing 2022-03-29 10:33:43 +07:00
e04690d96d
add API login view, #build
Changed:
- get token and userid from api endpoint
2022-03-29 10:18:56 +07:00
5dce2441fa
add API login view 2022-03-29 10:17:47 +07:00
5d8e314983
be more explicit what you are searching now 2022-03-28 12:43:57 +07:00
9e37c0fab1
add ibracorp review video 2022-03-27 19:43:40 +07:00
cc49c256c1
note about min ES version 7.17 2022-03-27 18:28:17 +07:00
dc8e330b22
tail git tag output, too many versions now 2022-03-27 18:27:36 +07:00
358194468e
increase version to v0.1.3 2022-03-26 19:47:50 +07:00
1d3d3b13ed
reduce max-complexity to 10 2022-03-26 18:36:10 +07:00
f15bb50cfe
fix playlist reindex after PendingList refactor 2022-03-26 18:31:00 +07:00
fcadb5ead8
add random headers for requests outside of yt-dlp 2022-03-26 11:49:53 +07:00
6d874f4b7a
add section for per channel customization 2022-03-26 11:13:48 +07:00
a0ed88580f
fix index validate_mappings for new nested object 2022-03-26 10:52:57 +07:00
9537c388ab Merge branch 'master' into testing 2022-03-25 17:31:59 +07:00
40d7e6da37
add secondary sort for channel and title, #193 2022-03-25 17:28:17 +07:00
fa60f2e5f8
Style channel configure form, #build
Changed:
- layout of the channel configure form
- hide if no overwrites set
- validate min es version 7.17.x
- improved build to incl debug tools
2022-03-25 15:44:01 +07:00
e4b4430e69
bump python version 2022-03-25 15:33:54 +07:00
bcf9185bd3
implement es version check at startup 2022-03-25 15:33:09 +07:00
337b373628
improve build to install debug tools in testing 2022-03-24 19:54:47 +07:00
59d58f8866
bump redis version 2022-03-24 19:51:45 +07:00
d0f826485f
move and rename configure button 2022-03-24 16:10:40 +07:00
d5cd90eb34
style and toggle hide overwrite form 2022-03-24 15:43:15 +07:00
8d1d09e698
extend IndexPaginate to optionally return _source key 2022-03-23 17:17:42 +07:00
fb4c11bd38
refactor ElasticIndex and ElasticBackup to use ElasticWrap and IndexPaginate 2022-03-23 17:17:17 +07:00
bfcc538ed1
fix concurrency issue with subtitle indexing 2022-03-23 16:20:33 +07:00
912c19f6cf
use ElasticWrap in FilesystemScanner 2022-03-23 15:56:53 +07:00
fda520ad44
refactor and consolidate Reindex class 2022-03-23 15:48:38 +07:00
1f7d6871cf
use ElasticWrap to delete item from pending 2022-03-23 11:09:21 +07:00
5b1c9c64de
cleanup, use ElasticWrap 2022-03-23 09:44:31 +07:00
f802c4d596
remove logging 2022-03-22 18:43:29 +07:00
192d379a3e
refacter api views to use ElasticWrap 2022-03-22 18:43:16 +07:00
9f5c9b17a5
refactor redis connection, fix sync_redis_state task setup issue 2022-03-22 17:50:54 +07:00
fa25a56126
fail open for in continue watching videos building 2022-03-22 13:07:22 +07:00
75cd9d382d
fix duration builder on reindex by ignoring vtt files 2022-03-22 12:59:39 +07:00
22a3d3f6cd
implement per channel overwrites, #build
Changes:
- merges per channel overwrite for:
  - download format
  - delete after x days
  - playlist index
- merges major refactor of download queue handeling classes
- merges improved startup checks
2022-03-22 11:49:30 +07:00
fd4f15ab66
refactor StartupCheck into class, lock if already run for multithreading 2022-03-22 10:35:36 +07:00
1f1dfcb54f
better playlist scan message, private methods in YoutubeChannel class 2022-03-22 10:07:33 +07:00
3d451e47e5
full playlist refresh and index for channel overwrites 2022-03-22 09:42:41 +07:00
fc10fa62e8
remove now redundant find playlist botton 2022-03-21 19:07:58 +07:00
875c601f4e
implement index channel playlist from form 2022-03-21 18:27:00 +07:00
91a9477bba
refactor index_channel_playlists task, move to YoutubeChannel class 2022-03-21 17:59:21 +07:00
c9399f61d0
bump es version 2022-03-21 17:04:38 +07:00
fc311a7b7e
refactor validate_playlists and move into DownloadPostProcess class 2022-03-21 11:14:44 +07:00
f803c5298b
fix missing update_status method call in ignore video 2022-03-21 11:09:16 +07:00
e67d576d79
fix missing video list in index_channel_playlists 2022-03-21 10:47:15 +07:00
7c6041d686
refactor VideoDownloader and implement per channel delete older than 2022-03-19 17:37:28 +07:00
1411262793
remember channel overwrites on rescan, remove unused rescape_all_channels method 2022-03-19 15:12:29 +07:00
9fd7e2b11a
rename channel_overwrites attribute 2022-03-19 15:03:38 +07:00
3ba6e0478d
fix filesysem rescan function 2022-03-19 14:36:46 +07:00
b68a00073f
fix thumbnail validation with new PendingList class 2022-03-19 14:27:37 +07:00
89428297c9
add download format channel overwrite per video 2022-03-18 22:22:41 +07:00
a7945e30e3
fix building missing vid ids list 2022-03-18 22:11:41 +07:00
ac9df4e082
map channel overwrite to video id for later efficient mapping 2022-03-18 21:39:33 +07:00
a6937db5fd
use the refactored PendingList class 2022-03-18 18:27:25 +07:00
05b8dbc02f
refacor PendingList class into subclasses 2022-03-18 17:19:21 +07:00
1498fadf27
implement channel playlist index overwrite 2022-03-16 12:32:42 +07:00
f0e82caebb
add bool true to channel overwrite form parser 2022-03-16 12:32:02 +07:00
2ef8823c2d
better channel overwrite update form 2022-03-16 12:09:50 +07:00
dc67293052
add fallback channel overwrite fallback to frontend 2022-03-15 17:45:43 +07:00
544d842a4a
rename channel format overwrite field 2022-03-15 17:45:15 +07:00
774220ab1f
add channel overwrite form to frontend, store in es 2022-03-15 12:00:48 +07:00
105d5bf3f7
add auto label to subtitle track 2022-03-13 22:56:20 +07:00
026cc378fe
add get_overwrites and set_overwrites methods for channel 2022-03-12 22:19:42 +07:00
8170d4913b
add fallback total video length if ffmpeg extraction failes 2022-03-12 21:53:03 +07:00
34708dd59f
Subtitle parser rewrite, #build
Changes:
- merges fix for progress bar issue on player close
- rewrite subtitle parser to use json3
- combining 5 cues into single es document for more efficient indexing
2022-03-12 20:37:54 +07:00
7595e7501f
sort continue watching videos 2022-03-12 20:29:26 +07:00
f6950a2ca5
list all in progress videos 2022-03-12 17:29:34 +07:00
aff0cfb794
fix retiming issue for auto subtitles 2022-03-11 17:47:04 +07:00
d3e9646fb6
private methods for YoutubeSubtitle and SubtitleParser 2022-03-10 20:45:13 +07:00
Nathan DeTar
6e3df21f8c
Continue Watching Section (#188)
* Replaced isWatched() function.

* Switched to `updateVideoWatchStatus()` function

* Updated Onclick to `updateVideoWatchStatus(this)`

* Handle `this` input in `updateVideoWatchStatus()`
2022-03-10 20:20:23 +07:00
1ce832b846
fix autocaption extraction, flatten words, #180 2022-03-10 19:58:13 +07:00
6a6c8fa5d8
bump yt-dlp version 2022-03-10 17:39:35 +07:00
c186798e78
rewrite SubtitleParser, #180 2022-03-09 00:25:44 +07:00
8c4607fee9
Continue Watching, #build
Changed:
- merges progress bar fix on 100%
- merges new content area on home for continue watching
2022-03-07 20:58:46 +07:00
40c8e6d146
standardize template jinja indentation 2022-03-07 20:58:17 +07:00
fb12a32d4f
use generic data-id and data-status attributes for watched checkbox 2022-03-07 20:48:45 +07:00
437e83b2ae
add continue watching section to home page 2022-03-07 20:26:37 +07:00
25bc66ae80
bump django version 2022-03-07 20:23:23 +07:00
Nathan DeTar
ad5e74cb27
Prevent setting progress bar on player close if video is watched. (#182)
* Prevent setting progress bar on close if watched.
2022-02-26 18:11:09 +07:00
6822ed380d Merge video progress bar to master 2022-02-26 09:26:53 +07:00
b28905bbae
bump footer version v0.1.2 2022-02-25 12:27:16 +07:00
36a2996cda
clean exit of progress builder when no videos in channel 2022-02-25 12:20:22 +07:00
b98ccd9dab
handle error if subscribed channel not available anymore, #175 2022-02-25 11:21:29 +07:00
060f0d575e
change color of progress bar to dark 2022-02-25 10:51:37 +07:00
Nathan DeTar
99c97a703f
Reduce API Calls (#181)
* Reduce API calls

* Fix video id

* Updated `createVideoTag()` description.

* Fixed URL used for cast integration

* Check video duration

* Updates progress bar on watched and close.

* Set progress bar width to 0% by default

* Cleanup, function descriptions

* Cleanup console logging

* Update progress bar on cast progress every 10s

* Catch short <30s videos and mark as watched
2022-02-25 10:39:33 +07:00
806448624d
return if no in progress videos 2022-02-24 21:25:12 +07:00
df777104af
add video progress bar to channel_id and playlist_id views 2022-02-24 19:30:12 +07:00
d88d6d6a61
add video progress bar 2022-02-24 18:58:26 +07:00
6078d8d276
add youtube_id to progress api key 2022-02-24 18:55:52 +07:00
c4d6bb35a3
add list_items for wildcard matching 2022-02-24 18:55:18 +07:00
a25b101c3a
remember video progress, #build
Changes:
- merges video progress API endpoint
- merges fix for auto subscribe reset of playlists
- merges fix for ffmpeg install link builder
2022-02-24 09:43:04 +07:00
e0db73543e Merge branch 'master' into testing 2022-02-24 09:39:56 +07:00
Nathan DeTar
4812b8da55
Save Video Progress (#179)
* Added cast integration docs.

* Changed header sizes.

* Added more space above Requirements

* Added cast integration docs.

* Removed separate cast integration docs

* Further indented quote from Google

* Switch to HTML based video position.

* Ground work for API changes and video progress

* Added onpause attribute to video.

* Added save video progress feature.

* Added API check for subtitle status.

* Switch method to DELETE if position is 0

* Added `createVideoTag()` function

* Added `InsertVideoTag()` function

* Switch to JS generated video tag, add on page load

* Removed extra data from DELETE request

* Removed unused code

* Reduced duplicate code

* Cleanup & groundwork cast pull metadata from API

* Minor bug fix

* Fix saving video progress on player close.

* Only send video progress when unwatched

* Cleanup

* Added `getURL()` function

* Cast use API & save progress/mark as watched

* Added cast progress checks

* Changed thresholds for marking videos as watched

* Added `watchedThreshold()` function
2022-02-24 09:36:31 +07:00
8579fb4cc1
fix ffmpeg link grep by using master 2022-02-21 21:37:49 +07:00
b8b95f9d79
inheirt VideoProgressView from base class to get auth 2022-02-21 20:59:04 +07:00
schizovivek
70506ad8f6
add comment for redis rejson to use arm64 fork created by bbilly1 (#178)
* updated redis rejson to use arm64 fork created by bbilly1

* added arm build as a comment instead of main option for rejson
2022-02-21 20:14:08 +07:00
ec00568008
fix auto reset of playlist_subscribed 2022-02-20 19:22:11 +07:00
2044dba700
API endpoints improvement, #build
- merges adding config key to api return values
- add video progress api endpoint
2022-02-17 18:21:56 +07:00
241d8326f7
add video progress API endpoints 2022-02-17 18:20:30 +07:00
4d83af7c14
bump redis client 2022-02-17 18:19:52 +07:00
265795f4a9
add config key to api response 2022-02-17 16:59:59 +07:00
Nathan DeTar
5c3f0d1e5f
Docs for the cast integration (#172)
* Added cast integration docs.

* Changed header sizes.

* Added more space above Requirements

* Added cast integration docs.

* Removed separate cast integration docs

* Further indented quote from Google
2022-02-14 17:10:25 +07:00
047fc1f3f1
bump release version 2022-02-13 10:58:58 +07:00
8fce31b983
fix reindex and deactivate error 2022-02-13 10:05:08 +07:00
8f87c4774a
restructure and update roadmap 2022-02-12 21:59:51 +07:00
fef866bf0b
indicate max page size on downloads page, add note to wiki, #156 2022-02-12 19:42:07 +07:00
428cc315e4
Subtitle improvements, #build
Changes:
- merges subtitle suport for JS video player
- merges hint what to do when no videos found
- merges better indexing and error handeling of subtitles
2022-02-12 19:11:47 +07:00
Nathan DeTar
385d6bace8
Fix cast support to handle new video tag format. (#169)
* Added subtitle support to JS player.

* Move `video-item` id to source tag.

* Move `video-item` id to source tag.

* Fix cast support to handle new video tag format

* Add subtitle support to cast integration, WIP

* Replace `&amp` with `&` in video titles.

* Check if the video is already marked as watched

* Switch to HTML watched check.
2022-02-12 19:08:19 +07:00
78720b33b7
clean exit when auto subtitle extract fails 2022-02-12 18:52:03 +07:00
ce4fa8ee61
delete existing before of reindexing subtitles 2022-02-12 18:22:01 +07:00
13cbada539
add section about subtitles and extend integrations 2022-02-12 17:09:25 +07:00
a5f6be16e1
switch subtitle source order 2022-02-12 17:09:05 +07:00
5abf988810
add FAQ wiki page 2022-02-12 16:27:31 +07:00
b494fc10af
cover edge cases where end timestamp is after start timestamp of new cue 2022-02-12 16:03:04 +07:00
d99ce0d98e
add atomicparsley to container for better thumb embed, #155 2022-02-12 09:58:14 +07:00
09500557c8
open fail on subtitle line parse error 2022-02-11 18:47:29 +07:00
7524691b79
implement API token revoke 2022-02-11 18:19:10 +07:00
f1de8db4f3
hide API token by default 2022-02-11 17:18:37 +07:00
08f5248e7a
make subtitle index optional 2022-02-11 13:36:36 +07:00
1abe4fb4d6
add text/vtt content-type header to subtitle files 2022-02-11 13:06:13 +07:00
Stephen Herbein
b1435434e6
docs: add a note that importing requires there be no subdirectories (#170)
Also include some bash snippets to help users with existing video
libraries containing subdirectories get their files all in one directory
quickly.

Co-authored-by: Stephen Herbein <sherbein@DESKTOP-EAJL82P.localdomain>
2022-02-11 12:55:14 +07:00
Stephen Herbein
4467e97f3c
When no videos are found, add a hint to start a search/download (#167) 2022-02-11 12:52:26 +07:00
af8e01cd8c
fix clean exit if no subtitles selected 2022-02-11 09:03:56 +07:00
Nathan DeTar
656a0c7327
Added subtitle support to JS player. (#168) 2022-02-11 08:53:09 +07:00
3efa388b5a
add subtitle functionality, #build
Changes:
- merges new subtitle download and index functionality
- merges player improvements and api integrations from @n8detar
- merges fix for non ascii channel names
- merges fix for pagination error with 10k+ videos
2022-02-10 19:48:39 +07:00
16f33feda0
process subtitle media url paths 2022-02-10 19:45:22 +07:00
3ea5e9c537
bump dependencies 2022-02-10 19:27:05 +07:00
4d30bed3cc
extend delete video to also delete subtitles 2022-02-10 19:09:07 +07:00
0e56efc428
limit filesystem scan to mp4 files only 2022-02-10 18:48:35 +07:00
077692987b
fix multi language subtitle extractor, and better regex for timestamp matching 2022-02-10 18:32:23 +07:00
b071612038
better error raising for add player info 2022-02-10 17:34:21 +07:00
0414df0de0
fix key error for subtitle source 2022-02-10 17:10:30 +07:00
a2cae51f48
bulk import subtitle lines into es 2022-02-10 17:02:19 +07:00
9f652802ae
add new mapping for subtitle index 2022-02-10 11:47:14 +07:00
4e4cfe3334
pass whole video object into YoutubeSubtitle class 2022-02-09 23:40:15 +07:00
4e2d0fa464
bump es version 2022-02-09 23:38:18 +07:00
6cb892a811
integrate auto generated subtitle cleaner 2022-02-09 21:33:41 +07:00
5f6158243e
auto generated subtitle parser and cleaner 2022-02-07 21:18:52 +07:00
1664b0d4fc
restructure video tag to add subtitle tracks 2022-02-06 00:08:24 +07:00
e98ffc0050
add subtitles mapping to video index 2022-02-05 23:50:47 +07:00
52013aff3f
fix subtitle download of first video of channel without folder 2022-02-05 23:42:42 +07:00
44af78b7e3
handle NA in ffprobe duration extractor 2022-02-05 23:09:05 +07:00
2bf9e9683b
error handeling in _normalize_lang to skip livechat and ignore missing 2022-02-05 22:51:38 +07:00
f5f46349b2
handle rescan name change 2022-02-05 22:38:59 +07:00
851fbae900
fix video template dislike icon and add watched icon 2022-02-05 18:42:09 +07:00
91452b5114
remove redundant video player api endpoint 2022-02-05 18:35:02 +07:00
5b37bd059c Merge branch 'testing'
combine new api endpoints from #151
2022-02-05 18:27:24 +07:00
Nathan DeTar
9079a2a78b
Get Video Player Data Using New API (#151)
* Get  video player data using new API

* Spelling

* Removed extra data from play button

* Reworked createPlayer, switched functions to API

* Add theme to scrollbar

* Removed extra metadata from playlist page

* Removed extra metadat from channel page

* Reworked createPlayer, switched functions to API

* Update style.css

* Changed watched indicator to match createVideo()

* Fixed createPlayer() watched button

* Fix watched indicator duplication

* Minor clean up

* Removed player-wrapper background

* Added video/channel info to generated player

* Removed description due to textReveal() conflict

* Mark video as played at 90% playback

* Groundwork for saving video playback

* Add half and empty stars to getStarRating()

* Check videoProgress input.

* Added last refresh and date published

* Switched date in create functions to API

* Fomatted dates to match the old format

* Remove console log from formatDates()

* Cleaned up error on video player close

* Added check for ryd dislikes/rating

* Refined ryd check

* Simplified player

* Added player stats css formatting

* Formatting for playlist name/link

* Add playlist title/link to player

* Commented out no longer used code

* Fix missing end `"` on video-player class

* Additional playlist error checking

* Change setting video progress to html method

* center thumbs icon, add eye icon for watched

* add playerStats builder example, change some spacing

* Removed `-` before playlist, reordered cast button

* Minor cleanup of unused code.

* Corrected POST data formating

* consolidate video api calls into one

* remove redundant api calls for search result population

* do some jshint

* shorten unit and add K to formatNumbers

Co-authored-by: simon <simobilleter@gmail.com>
2022-02-05 18:26:31 +07:00
8fe00e2152
process api return values for frontend use 2022-02-05 17:46:14 +07:00
ac531affb5
standardize country specific subtitle language codes 2022-02-05 16:07:11 +07:00
3ef35a9d53
raise FileNotFoundError to catch for reindex 2022-02-05 09:30:34 +07:00
7aaf140ccb
index subtitle url to video 2022-02-04 17:14:00 +07:00
ad2647c4ba
upgrade libs 2022-02-04 17:13:30 +07:00
a82e78f8bf
index selected subtitles if available 2022-01-30 23:57:58 +07:00
365a2bf59f
add frontend subtitle dl settings 2022-01-30 20:10:29 +07:00
e5e83287ab
fix channel delete for channel_id fallback folders 2022-01-30 08:33:10 +07:00
8e860d4f01
fix last page error for more than 10k results, #156 2022-01-27 23:39:07 +07:00
0749202d5d
add fallback for none ascii channel names, #127 #146 2022-01-27 22:50:02 +07:00
160676acc1
add mapping for channel_tvart_url 2022-01-27 21:56:48 +07:00
8591c44ef2 major refactor, #build
Changes:
- merges new restructured and split up modules
- merges refactor channel, video, playlist index classes
- merges code clean up and readability improvements
2022-01-27 16:08:16 +07:00
2b2ff814e3
red hover logout button 2022-01-27 16:04:04 +07:00
87b72a571d
simplify reading json files 2022-01-27 15:32:58 +07:00
00e9e4bc53
bump python version 2022-01-27 15:08:26 +07:00
b93a6f689b
remove previous bug workaround to set django debug env, #159 2022-01-27 14:49:22 +07:00
b2f69d1433
untrack vscode folder 2022-01-26 20:21:08 +07:00
2eea07c85e
organize docker conf files 2022-01-26 20:05:52 +07:00
b6f9fb58ad refactor VideoDownloader class, better obs builder 2022-01-26 19:37:36 +07:00
2fc0cbacf5
update doc strings to represent new module structure 2022-01-23 19:32:08 +07:00
0fc0cc8e87
major refactor, split up modules 2022-01-22 22:13:37 +07:00
f3efca7464
bump yt_dlp version 2022-01-22 17:57:36 +07:00
c57d6c73cc
remove bandit, too many false positive 2022-01-22 17:52:13 +07:00
b64a2f8195
squash index.py refactor commits 2022-01-22 17:48:54 +07:00
2f4d4e715b
refactor index class in to base and video classes 2022-01-19 13:04:15 +07:00
44733adf4d Merge branch 'master' into testing 2022-01-18 17:28:50 +07:00
Nathan DeTar
26bc2d2af4
Add theme to scrollbar. (#153)
* Add theme to scrollbar.

* add firefox scroll bar color

Co-authored-by: simon <simobilleter@gmail.com>
2022-01-18 17:27:49 +07:00
68f19b1719
make SearchHandler use new ElasticWrap class 2022-01-18 13:37:22 +07:00
3eb0353fa9
new base class to make all es calls from 2022-01-18 13:36:41 +07:00
af2783c18a
remove unneeded auth 2022-01-18 13:35:48 +07:00
8b15ea5dc8
bump redis version 2022-01-18 11:27:24 +07:00
3d26f320bf
new logout icon 2022-01-18 11:26:26 +07:00
7028621bc5 merge new api view, #build
Changes:
- merges new cast improvements
- merges toggle invert
- merges new video player api endpoint
- merges basic browser extension example
2022-01-15 14:19:11 +07:00
Laurant Marijnissen
385771cba0
invert the hide button to more clearly show what it is currently set as. (#150) 2022-01-15 14:18:23 +07:00
79b0a989be
new api view to return video player 2022-01-15 14:14:18 +07:00
cccb8e570a Merge cast changes from 'master' into testing 2022-01-15 13:35:16 +07:00
Nathan DeTar
b7922d171d
Improved Cast Support (#143)
* Added cast integration requirements.

HTTPS and a supported browser are required for this integration.

* Improved cast handeling.

* Theme cast button.

* Improved cast support.

* Added proper cast button.

* Moved cast button location

* Moved button location

* Reorder cast button

* Fix typo

* Revert cast setting description.

* Match master branch

* Added comments

* Added id `cast-script` to cast-videos.js

* Reworked event listener

* Add cast  button to home player

* Check if active media on cast, pause browser video

* Commented out console logging

* Uncommented cast failed console log

* Cast video at current playback position

* use theme vars for cast color buttons

* add cast variable to base ArchivistViewConfig class

Co-authored-by: simon <simobilleter@gmail.com>
2022-01-15 13:33:16 +07:00
e1cdd79b45
added browser extension proof of concept 2022-01-15 13:03:44 +07:00
fec6237907
add chrome-extension to CORS_ALLOWED_ORIGIN 2022-01-15 12:27:36 +07:00
3df8f65db6
implement cors for browser extension 2022-01-14 14:46:00 +07:00
c703105c5e
fix ryd 404 error for reindex and deactivate 2022-01-11 18:54:40 +07:00
51f63f7b71 Merge api app from branch 'testing' 2022-01-11 18:43:03 +07:00
Nathan DeTar
45518dc3d2
Basic Google Cast Support (#140)
* Added Start and Stop cast buttons.

* Modified from the internet.

* Code to initialize casting

* Added `video-item` id to video

* Renamed function to make more sense

* Renamed cast functions to make more sense

* Renamed cast functions to make more sense

* Changed console logging message.

* Make cast buttons appear if enabled in settings.

* Make cast scripts only load if enabled in settings

* add cast configuration form, #140

* fix spelling

Co-authored-by: simon <simobilleter@gmail.com>
2022-01-11 18:31:22 +07:00
c4a547f407
cleanup and typos 2022-01-11 17:05:04 +07:00
b28773b3a0
add exmples, auth docs, and list endpoints 2022-01-11 16:53:58 +07:00
50006e423c
implement channel list and subscribe api 2022-01-11 16:53:02 +07:00
8d5b4ac242
implement api return status code 2022-01-11 16:16:28 +07:00
52a54fbe31
add to queue api endpoint 2022-01-11 15:58:50 +07:00
382e89abb7
implement api token auth 2022-01-11 14:15:36 +07:00
917e73ec4d
new django api app, implementing basic get views 2022-01-10 22:51:52 +07:00
Nathan DeTar
edc9f3fe15
Added a button to download a video to the local device. (#137)
* Add video download button.

* Swapped <a> and <button> tags to fix theme issue.

* Download button renamed to `Download File`
2022-01-10 09:00:29 +07:00
Sean
8410b9310f
feat(docker): uses named volumes in docker-compose (#133)
Closes #132
2022-01-10 07:54:23 +07:00
Crocs
fb2a7d59d4
Update README.md (#136)
misspelled :)
2022-01-10 06:25:26 +07:00
ee2025664f
update roadmap 2022-01-09 08:44:16 +07:00
b8c2c67707 fix unstable build arch issue for docker_publish 2022-01-09 08:42:59 +07:00
Sean
28923ea9c7
docs: add helm chart alternative install method (#130) 2022-01-09 08:33:33 +07:00
21a76595ec
fix new screenshot links in readme 2022-01-09 00:02:02 +07:00
e8a533bbbe
add social links and update to v0.1.0 2022-01-08 23:58:41 +07:00
9ad8177b7a
retry failed commit 2022-01-08 23:57:51 +07:00
709c7b88f5
wiki refresh for new search functionality 2022-01-08 21:21:49 +07:00
8ba9ced833
move ryd to avoid celery missing redis var 2022-01-08 21:10:38 +07:00
f62e75f343
add social links 2022-01-08 20:14:02 +07:00
1a95797997
improve scheduler validation with regex, #126 2022-01-08 20:04:51 +07:00
c660edd997
bump library versions 2022-01-07 18:35:59 +07:00
9498cf94f3
fix playlist view_origin 2022-01-07 18:30:40 +07:00
099f9dfe00
make search results follow default view styles 2022-01-07 18:29:25 +07:00
1cbe0bbfc0
delete playlists of channel when deleting channel, #118 2022-01-05 15:39:41 +07:00
49cd272557
size limit for ryd missing rating query 2022-01-05 15:10:33 +07:00
1c27934d77
remove redundant lock 2022-01-05 14:51:02 +07:00
c85be45846
extend ryd to refresh when missing average_rating 2022-01-05 14:43:24 +07:00
7a1f77e548
bump library versions 2022-01-05 14:42:28 +07:00
3999d679e3
fix linting 2022-01-05 14:09:35 +07:00
dc2fb65312
add optin returnyoutubedislike.com integration 2022-01-05 14:06:07 +07:00
6aef3dfb96
remove leftovers 2022-01-05 11:10:11 +07:00
49eb565e2a
fix sort_by selected attribute and animation toggle 2022-01-02 16:25:05 +07:00
2ce90077b6
fix notification for nownload now button 2022-01-02 15:47:32 +07:00
fd334bcafe
fix legacy import alias for yt-dlp 2022-01-02 15:38:45 +07:00
6d16d75ef9
bump es version 2022-01-02 12:24:25 +07:00
d5b3b90202
fix missing auth of search, reduce nginx alias to relevant paths only 2022-01-01 22:17:44 +07:00
37140551d2
improved build cache add nginx after pip 2022-01-01 22:16:34 +07:00
08f74caef0
simplify the sort_order and sort_by and standardize player location in page 2022-01-01 18:13:12 +07:00
f7fce001c4
simplify the subscribe buttons 2022-01-01 17:25:57 +07:00
4915aa0c11
remove now redundant search forms 2021-12-31 13:42:07 +07:00
5616d3ee0d
add search page link to top move about to footer 2021-12-31 12:41:54 +07:00
e823d6e1b3
add multi search js functions to dynamically populate results 2021-12-30 22:13:47 +07:00
e8eb7077ed
add initial search endpoint and improve results$ 2021-12-30 20:42:42 +07:00
5fb15b79a4
extend SearchForm class with multisearch method for frontend 2021-12-30 15:58:15 +07:00
2a774c3d3e
add english analyzer for main text fields for serching 2021-12-30 15:54:20 +07:00
b6424e0e56
update requirements libs 2021-12-30 15:53:38 +07:00
386220ee94
consolidate request attributes into parent class 2021-12-27 17:23:39 +07:00
4c46f0bdbd
refactor playlist and playlist-id views inheritance, #116 2021-12-27 16:58:08 +07:00
30cf54c49c
refactor channel and channel-id views inheritance, #116 2021-12-27 15:23:52 +07:00
fb512b26ea
further consolidate by adding query results in parent class 2021-12-27 12:01:49 +07:00
2ae25540d1
refacter DownloadView to use new inheritance structure, #116 2021-12-27 10:58:49 +07:00
6229d92333
add dedicated default_view for playlists 2021-12-26 22:51:37 +07:00
6e348892f2
refactor home view by inherinting from dedicated view classes, #115 #116 2021-12-26 22:49:00 +07:00
665d0a1b24
bump versions 2021-12-26 18:22:04 +07:00
42f4f4cb6f
improved sort order mobile layout on home 2021-12-18 18:38:01 +07:00
2d6cc43a9e
better label placement on toggle box 2021-12-18 18:22:57 +07:00
bf0b07f3d7
fix error when restarting player with same video 2021-12-18 17:15:53 +07:00
88ebb6d648
fix autodelete error on empty download queue 2021-12-18 17:05:49 +07:00
3015e59a29
fix styling of sub unsub frontent feedback with span tag 2021-12-18 16:56:32 +07:00
7a3609e611
add unstable tag to sync_docker deploy 2021-12-18 16:35:01 +07:00
ad8d75c3e8
add autodelete videos to ignore list, #112 2021-12-17 23:28:53 +07:00
f36ae6c4b9
hotfix: explicitly set DJANGO_DEBUG env, #111 2021-12-17 23:02:38 +07:00
8678cdcadb
add missing favicon to login template 2021-12-17 23:00:30 +07:00
1ac6da1f3e
bumb django version 2021-12-17 18:45:32 +07:00
e5b9b1caef
remove now unused favicon 2021-12-17 18:32:46 +07:00
8f80cf2d22
update roadmap 2021-12-17 18:29:25 +07:00
5f3d52c76a
update docs for v0.0.9 release 2021-12-17 16:59:52 +07:00
816c68464b
add unstable tag for docker deploy 2021-12-17 16:57:10 +07:00
a500f9ec63
add notifications and error messages to settings page 2021-12-17 15:09:21 +07:00
8e976922e9
add Scheduler Setup documentation 2021-12-17 11:52:32 +07:00
eb5483c6b2
bumb es version 2021-12-17 09:38:44 +07:00
3231dbe29a
the favicons the whole favicons and nothing but the favicons, #93 2021-12-16 21:23:54 +07:00
ae082eb309
add sync_redis_state before building schedule for update path 2021-12-16 21:22:05 +07:00
23f9894154
move validate_thumbnails out of startup has it's own schedule now 2021-12-16 21:20:14 +07:00
f6159a48d5
change sub and unsub to colored toggle button 2021-12-16 18:28:52 +07:00
ada2c1fe59
add autofocus and autocomplete to user form field, #104 2021-12-16 18:00:36 +07:00
5b59c3296f
port overwrite with TA_PORT and TA_UWSGI_PORT for collisions, #103 2021-12-16 17:42:59 +07:00
c9373eee15
add remember me checkbox to login view and set session expire, #77 2021-12-16 15:17:58 +07:00
e858bba944
fix linting, update doc string 2021-12-16 12:48:12 +07:00
9a2dead76c
implement autodelete watched videos after x days, #56 2021-12-16 12:44:37 +07:00
53f93a7bb9
fix missing average_rating due to lack of dislikes 2021-12-15 17:39:52 +07:00
7924f28ccb
implement backup rotate from config value 2021-12-14 19:40:46 +07:00
ff2de43752
update index restore information 2021-12-14 19:21:07 +07:00
275cf1263b
fix mobile backup-grid-row layout 2021-12-14 19:15:29 +07:00
f49895917a
change settings for backup restore 2021-12-14 19:06:47 +07:00
f7c73f7eba
change backup and restore to tag files 2021-12-14 19:05:58 +07:00
6ad1c8e73b
add reason to backup as file name tag 2021-12-13 21:20:48 +07:00
21f70493bb
add scheduler config to regular redis config 2021-12-13 20:28:41 +07:00
5cb6076a1c use config check_reindex_days for refresh_interval 2021-12-13 19:19:49 +07:00
Wesley Mauk
f660b05a20
Make copyright year dynamic (#107)
Never have to update this again!
2021-12-13 19:10:11 +07:00
8f7179ad0c
fix some spacing issues 2021-12-13 10:57:29 +07:00
3df9a53a24
add scheduler settings with some sane defaults 2021-12-13 10:55:57 +07:00
fde1a37563
add check_reindex_days and run_backup_rotate fields to form 2021-12-13 10:54:54 +07:00
c475700cdd
store beat schedule on volume 2021-12-08 16:15:25 +07:00
9bb68aac66
extend theater mode to video id page template 2021-12-08 14:30:13 +07:00
279c4538ca
fix player wrapper and player channel links 2021-12-07 08:25:46 +07:00
42eec604a7
reimagining the video player in theater mode, #98 2021-12-06 22:14:42 +07:00
e2238c16f5 restructure html to allow for non boxed-content classes within content blocks, #98 2021-12-06 18:07:57 +07:00
8c5bb0bc1f
add missing mapping for playlist_last_refresh to fix empty index scan, #101 2021-12-06 16:56:56 +07:00
5c26be43e6
skip instead of cancle update 2021-12-06 16:55:55 +07:00
82a71ed75d
clean up playlist subscribe notification 2021-12-05 22:35:46 +07:00
7516090e14
handle findPlaylists notification and fix spacing 2021-12-05 22:15:10 +07:00
8874168291
clean up progress hook title and speed up playlist validation 2021-12-05 21:57:33 +07:00
19871d55e2
faster release message timer with reduced redis exipre time on last message 2021-12-05 21:27:43 +07:00
c7d69b4fa1
use new notification for channel subscribe feedback 2021-12-05 20:26:39 +07:00
5b47c9cde7
use filter to search for relevant messages 2021-12-05 20:26:17 +07:00
67bde4c7ec
fix notification channel for video thumb download 2021-12-05 17:24:57 +07:00
a0d5837519
use new checkMessages for frontend button calls 2021-12-05 17:24:20 +07:00
fbdbfd744d
rewrite of progress.js, now potentially better and flexible 2021-12-05 16:42:33 +07:00
1d262fc936
fix old status variables for message 2021-12-05 16:41:06 +07:00
f7b5082983
use message:playlistscan for index_channel_playlists 2021-12-03 21:05:34 +07:00
b35440253d
transform add to queue, rescan, and download progress to channel messages 2021-12-03 19:47:43 +07:00
1691bdadf5
transform progress message to list, change subscribe messages 2021-12-03 19:00:26 +07:00
5a2d7c07bf
variable expire value and simpler REDIS_PORT declaration 2021-12-03 13:51:34 +07:00
3d0bb40da6
for some strange reason timezone needs to be defined here again... 2021-12-03 12:00:40 +07:00
0b0634273a
validate form entries, set auto sensible default 2021-12-03 11:27:26 +07:00
ab8dc0ddee
bump versions 2021-12-03 11:26:35 +07:00
4136a2a4f2
add rescan lock 2021-12-02 19:11:45 +07:00
40c7a6a3f7
initial scheduler_form for settings 2021-12-02 18:38:32 +07:00
b2861e0369
ScheduleBuilder config class for celery beat 2021-12-02 18:37:54 +07:00
012e28d4ef
initial beat scheduler setup 2021-12-02 15:54:29 +07:00
3cc5db7ad1
use TZ environ for scheduler 2021-12-02 14:44:37 +07:00
7e97284374
auto index playlists when adding to download 2021-11-29 15:49:45 +07:00
b8359a4249
match_all to show all playlists, even when empty 2021-11-29 14:28:23 +07:00
b14a820a4c
add 18 char len to valid playlists 2021-11-29 14:21:19 +07:00
929311a943 merge roadmap edits into testing 2021-11-28 19:16:16 +07:00
Simon
c754badbaa
Update roadmap 2021-11-28 19:13:29 +07:00
eacfd4bc84
refactor and move frontend PostData class to dedicated module 2021-11-28 18:42:04 +07:00
78b85fd42f
add note about channel playlists 2021-11-27 17:39:18 +07:00
525618a7a1
update footer to v0.0.8 2021-11-27 14:41:10 +07:00
436196738e
remove untested warning of arm64, specify broser codec limitations 2021-11-27 14:40:03 +07:00
d95bf4272c
speedup by only testing selected formats 2021-11-27 14:13:48 +07:00
5401722d88
bump versions 2021-11-27 14:13:10 +07:00
2d69f64121
fix some wording 2021-11-27 14:11:06 +07:00
b8f7aa3298
cleaner handeling of findPlaylists 2021-11-27 12:07:27 +07:00
64c9269ee2
fix channel info for playlistid view to use actual owner 2021-11-27 11:55:00 +07:00
295ea0cde0
handling deactivating playlist 2021-11-27 11:47:12 +07:00
1f82f0c40d
index playlist channel if doesn't exist and beter user feedback 2021-11-26 17:34:59 +07:00
31515961e1
fix prev and nex playlist order 2021-11-26 16:47:39 +07:00
5d7a609285
skip backing up not yet existing index 2021-11-26 16:19:18 +07:00
e3de9a0184
fix mobile playlist nav layout 2021-11-26 10:10:45 +07:00
ee436ea2d5
update docs with playlist info 2021-11-25 23:38:00 +07:00
32d2659658
handling genering index write errors, #91 2021-11-25 22:10:12 +07:00
3f31e50b69
add delete download queue pending or ignored, #85 2021-11-25 20:02:25 +07:00
408b0a0c34
fix mobile layout for playlist pages 2021-11-25 17:22:52 +07:00
39304ff2bd
add subscribe and unsubscribe buttons for channels and playlists, #81 2021-11-25 16:41:58 +07:00
bad129d630
consolidate subscribe to single task for channel and playlist 2021-11-25 15:49:08 +07:00
2ebd0a3e2f
extend unsubscribe for channels and playlists 2021-11-25 11:52:14 +07:00
407325e0a9
add original youtube link if available, #81 2021-11-25 11:32:51 +07:00
e3f9bd98de
use --check-formats for downloader, #90 2021-11-25 11:17:25 +07:00
b1783d6be3
handle multifeed videos with noplaylist 2021-11-22 22:58:25 +07:00
9fceb98f13
add playlists to reindex class 2021-11-22 20:40:11 +07:00
220d020c76
delete playlist buttons to frontend 2021-11-20 18:27:10 +07:00
b292a5e309
add delete playlist backend functionality 2021-11-20 14:32:36 +07:00
8d708fcdc8
add mark_playlist_watched and refactor mark_channel_watched to update_by_query 2021-11-20 10:58:25 +07:00
85d12d6c68
dont index playlists without videos 2021-11-19 16:57:07 +07:00
fef26a06b2
force refresh for new videos to avoid racing condition 2021-11-19 16:26:05 +07:00
3b6e70b4dc
progress message on validate_playlists 2021-11-19 15:53:06 +07:00
3881d305f9
add subscribe to playlist form and better task management 2021-11-19 11:52:27 +07:00
fcddf85245
validate_playlists after run_queue from VideoDownloader 2021-11-18 22:35:08 +07:00
d0e0903d48
use remote data for playlist find_missing 2021-11-18 21:50:35 +07:00
3efdc1962d
fix playlist nav builder using correct index 2021-11-18 21:16:18 +07:00
f26fbc0dc5
implement show_subed_only on playlist view 2021-11-18 17:14:11 +07:00
a1167bac4e
use same page size for playlist rescan 2021-11-18 16:58:39 +07:00
bb889f7f67
use find_missing to also add missing videos from playlist to download queue 2021-11-18 16:37:05 +07:00
1af0196208
add subscribe to playlist backend functionality 2021-11-18 16:00:55 +07:00
8b69be645c
use new IndexPaginate class for get_channels and get_playlists 2021-11-18 14:48:31 +07:00
f371a03cc7
use new IndexPaginate class for get_all_indexed videos 2021-11-18 12:16:21 +07:00
509b0097fe
bump celery version 2021-11-18 12:11:58 +07:00
7b36cc53e7
refactor get_all_pending to use new IndexPaginate class 2021-11-17 18:30:24 +07:00
ed9d5aef0a
fix playlist get_entries when not passing all youtube_ids 2021-11-17 18:16:22 +07:00
c4b0f900f8
dedicated search_after class to scroll through index 2021-11-17 17:54:47 +07:00
0e9c0d9f6b
add channel playlist link 2021-11-15 13:19:40 +07:00
d2414434fb
implement playlist earch form 2021-11-15 13:08:32 +07:00
2fe8936e85
add playlist position index 2021-11-15 13:00:17 +07:00
62ba1ecf4a
handle empty playlist nav 2021-11-14 19:48:03 +07:00
e450b38702
add video playlist navigation, previous and next 2021-11-14 19:34:57 +07:00
3d969c25fa
only show playlist if at least one entry 2021-11-14 15:51:55 +07:00
8932a6bc02
validate existence of playlist entry in index 2021-11-14 15:46:24 +07:00
e3f0075132
use original sort order for playlist_id list 2021-11-13 18:36:48 +07:00
b9ddf6a299
bump celery version 2021-11-13 17:54:07 +07:00
c3ece970ee
add playlist discovery button to channel_id page 2021-11-13 17:35:48 +07:00
ac14cd5ebb
playlist relation take 2 2021-11-13 17:34:58 +07:00
7930da5242
fix youtu.be extractor, #40 2021-11-12 19:26:47 +07:00
58303047aa
validate thumbnails after filesystem rescan 2021-11-12 17:12:53 +07:00
b1c82759bb
extend playlist_id with metadata and links 2021-11-12 15:01:39 +07:00
94576b4b76
initial PlaylistIdView paths and basic template 2021-11-12 11:44:18 +07:00
16833a4377
auto add videos to playlist 2021-11-12 11:43:44 +07:00
44e1720aab
add thumbnail extraction to channel playlist scraper 2021-11-11 21:17:04 +07:00
3485f9b1c8
define playlist field types in index 2021-11-11 20:57:28 +07:00
c499a130da
add sync playlist meta data and position to video index 2021-11-11 17:56:29 +07:00
824ba35c14
add basic playlists to template 2021-11-10 18:53:38 +07:00
Crocs
bb73d531a4
Update settings.html (#87)
* Update settings.html

Fixed the example as you wouldn't put KB/s at the end, reworded the explanation, and added "KB/s" at the end of the "Current throttled rate limit:"

Also added KB/s to the download speed limit, and added an example.

* Update settings.html
2021-11-10 17:59:11 +07:00
5ef9c5b059
download playlist artwork 2021-11-10 17:55:34 +07:00
2550016ac8
send playlist hits to template 2021-11-10 17:29:11 +07:00
eaf107d0d2
add new ta_playlist index and task to find playlists of channel 2021-11-08 14:54:17 +07:00
1bfb912d09
basic routes and template for playlist page 2021-11-08 14:52:46 +07:00
bd37b653c2
extend playlists to get all playlists of a channel and upload single playlist to index 2021-11-06 22:30:39 +07:00
15845da3a8
use check_formats to validate thumb url, #83 2021-11-06 20:23:59 +07:00
72bc6a4d02
basic methods of YoutubePlaylist class 2021-11-05 16:24:05 +07:00
661ee2616c
bump django version 2021-11-05 16:23:15 +07:00
3bc6074ef3
slimming some UI spacing issues 2021-11-04 15:53:47 +07:00
217 changed files with 10038 additions and 8156 deletions

28
.devcontainer/Dockerfile Normal file
View File

@ -0,0 +1,28 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.224.3/containers/python-3/.devcontainer/base.Dockerfile
# [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster
ARG VARIANT="3.10-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT}
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
RUN sed -i 's/required/sufficient/g' /etc/pam.d/chsh
# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
COPY tubearchivist/requirements.txt /tmp/pip-tmp/
RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
&& rm -rf /tmp/pip-tmp
# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends fish
ENV SHELL /usr/bin/fish
USER vscode
RUN fish -c "curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher"
# [Optional] Uncomment this line to install global node packages.
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1

View File

@ -0,0 +1,64 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.224.3/containers/python-3
{
"name": "Python 3",
"build": {
"dockerfile": "Dockerfile",
"context": "..",
"args": {
// Update 'VARIANT' to pick a Python version: 3, 3.10, 3.9, 3.8, 3.7, 3.6
// Append -bullseye or -buster to pin to an OS version.
// Use -bullseye variants on local on arm64/Apple Silicon.
"VARIANT": "3.10-bullseye",
// Options
"NODE_VERSION": "16"
}
},
// Set *default* container specific settings.json values on container create.
"settings": {
"python.defaultInterpreterPath": "/usr/local/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint",
"typescript.tsdk": "tubearchivist/www/node_modules/typescript/lib",
"terminal.integrated.defaultProfile.linux": "fish"
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"eamodio.gitlens",
"batisteo.vscode-django",
"christian-kohler.path-intellisense",
"quicktype.quicktype"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [3000, 8000],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "chsh -s /usr/bin/fish && fish -c 'fisher install matchai/spacefish'",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode",
"features": {
// "fish": "latest",
"github-cli": "latest",
"docker-in-docker": {
"version": "latest",
"moby": true
},
"git": "os-provided"
}
}

8
.env.local.example Normal file
View File

@ -0,0 +1,8 @@
# https://next-auth.js.org/configuration/options#nextauth_secret Used to encrypt JWT
NEXTAUTH_SECRET=
# https://next-auth.js.org/configuration/options#nextauth_url When deploying to production, set the NEXTAUTH_URL environment variable to the canonical URL of your site.
NEXTAUTH_URL=
# URL of the Tubearchivist server without a trailing /
NEXT_PUBLIC_TUBEARCHIVIST_URL=

3
.eslintrc.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}

27
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,27 @@
name: Node.js CI
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"
- run: yarn install --frozen-lockfile
- run: yarn build
- run: yarn lint

View File

@ -1,23 +0,0 @@
name: lint_python
on: [pull_request, push]
jobs:
lint_python:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- run: pip install --upgrade pip wheel
- run: pip install bandit black codespell flake8 flake8-bugbear
flake8-comprehensions isort
- run: bandit --recursive --skip B105,B108,B404,B603,B607 .
- run: black --check --diff --line-length 79 .
- run: codespell
- run: flake8 . --count --max-complexity=12 --max-line-length=79
--show-source --statistics
- run: isort --check-only --line-length 79 --profile black .
# - run: pip install -r tubearchivist/requirements.txt
# - run: mkdir --parents --verbose .mypy_cache
# - run: mypy --ignore-missing-imports --install-types --non-interactive .
# - run: python3 tubearchivist/manage.py test || true
# - run: shopt -s globstar && pyupgrade --py36-plus **/*.py || true
# - run: safety check

38
.gitignore vendored
View File

@ -1,5 +1,35 @@
# python testing cache # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
__pycache__
# django testing db # dependencies
db.sqlite3 /node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo

1
.husky/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
_

4
.husky/pre-commit Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

10
.prettierrc Normal file
View File

@ -0,0 +1,10 @@
{
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"trailingComma": "all",
"bracketSpacing": true,
"arrowParens": "always"
}

View File

@ -1,5 +0,0 @@
{
"python.linting.pylintEnabled": true,
"python.linting.pycodestyleEnabled": false,
"python.linting.enabled": true
}

View File

@ -5,7 +5,7 @@ If you haven't already, the best place to start is the README. This will give yo
## Report a bug ## Report a bug
If you notice something is not working as expected, check to see if it has been previously reported in the [open issues](https://github.com/bbilly1/tubearchivist/issues). If you notice something is not working as expected, check to see if it has been previously reported in the [open issues](https://github.com/tubearchivist/tubearchivist/issues).
If it has not yet been disclosed, go ahead and create an issue. If it has not yet been disclosed, go ahead and create an issue.
If the issue doesn't move forward due to a lack of response, I assume it's solved and will close it after some time to keep the list fresh. If the issue doesn't move forward due to a lack of response, I assume it's solved and will close it after some time to keep the list fresh.
@ -20,12 +20,12 @@ I have learned the hard way, that working on a dockerized application outside of
This is my setup I have landed on, YMMV: This is my setup I have landed on, YMMV:
- Clone the repo, work on it with your favorite code editor in your local filesystem. *testing* branch is the where all the changes are happening, might be unstable and is WIP. - Clone the repo, work on it with your favorite code editor in your local filesystem. *testing* branch is the where all the changes are happening, might be unstable and is WIP.
- Then I have a VM on KVM hypervisor running standard Ubuntu Server LTS with docker installed. The VM keeps my projects separate and offers convenient snapshot functionality. The VM also offers ways to simulate lowend environments by limiting CPU cores and memory. But you could also just run docker on your host system. - Then I have a VM on KVM hypervisor running standard Ubuntu Server LTS with docker installed. The VM keeps my projects separate and offers convenient snapshot functionality. The VM also offers ways to simulate lowend environments by limiting CPU cores and memory. But you could also just run docker on your host system.
- The `Dockerfile` is structured in a way that the actual application code is in the last layer so rebuilding the image with only code changes utilizes the build cache for everything else and will take just 2-3 secs. - The `Dockerfile` is structured in a way that the actual application code is in the last layer so rebuilding the image with only code changes utilizes the build cache for everything else and will just take a few seconds.
- Take a look at the `deploy.sh` file. I have my local DNS resolve `tubearchivist.local` to the IP of the VM for convenience. To deploy the latest changes and rebuild the application to the testing VM run: - Take a look at the `deploy.sh` file. I have my local DNS resolve `tubearchivist.local` to the IP of the VM for convenience. To deploy the latest changes and rebuild the application to the testing VM run:
```bash ```bash
./deploy.sh test ./deploy.sh test
``` ```
- The command above will also copy the file `tubarchivist/testing.sh` into the working folder of the container. Running this script will install additional debugging tools I regularly use in testing. - The command above will call the docker build command with `--build-arg INSTALL_DEBUG=1` to install additional useful debug tools.
- The `test` argument takes another optional argument to build for a specific architecture valid options are: `amd64`, `arm64` and `multi`, default is `amd64`. - The `test` argument takes another optional argument to build for a specific architecture valid options are: `amd64`, `arm64` and `multi`, default is `amd64`.
- This `deploy.sh` file is not meant to be universally usable for every possible environment but could serve as an idea on how to automatically rebuild containers to test changes - customize to your liking. - This `deploy.sh` file is not meant to be universally usable for every possible environment but could serve as an idea on how to automatically rebuild containers to test changes - customize to your liking.
@ -44,7 +44,12 @@ To fix a bug or implement a feature, fork the repository and make all changes to
## Releases ## Releases
Everything on the master branch is what's in the latest release and is what you get in your container when you `pull` either the *:latest* tag or the newest named version. If you want to test the newest changes and improvements, clone the repository and build the docker container with the Dockerfile from the testing branch. There are three different docker tags:
- **latest**: As the name implies is the latest multiarch release for regular usage.
- **unstable**: Intermediate amd64 builds for quick testing and improved collaboration. Don't mix with a *latest* installation, for your testing environment only. This is untested and WIP and will have breaking changes between commits that might require a reset to resolve.
- **semantic versioning**: There will be a handful named version tags that will also have a matching release and tag on github.
If you want to see what's in your container, checkout the matching release tag. A merge to **master** usually means a *latest* or *unstable* release. If you want to preview changes in your testing environment, pull the *unstable* tag or clone the repository and build the docker container with the Dockerfile from the **testing** branch.
## Code formatting and linting ## Code formatting and linting

View File

@ -1,21 +1,19 @@
# build the tube archivist image from default python slim image # multi stage to build tube archivist
# first stage to build python wheel, copy into final image
FROM python:3.9.7-slim-bullseye
# First stage to build python wheel
FROM python:3.10.4-slim-bullseye AS builder
ARG TARGETPLATFORM ARG TARGETPLATFORM
ENV PYTHONUNBUFFERED 1 RUN apt-get update
RUN apt-get install -y --no-install-recommends build-essential gcc curl
# install distro packages needed
RUN apt-get clean && apt-get -y update && apt-get -y install --no-install-recommends \
build-essential \
nginx \
curl && rm -rf /var/lib/apt/lists/*
# get newest patched ffmpeg and ffprobe builds for amd64 fall back to repo ffmpeg for arm64 # get newest patched ffmpeg and ffprobe builds for amd64 fall back to repo ffmpeg for arm64
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ] ; then \ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ] ; then \
curl -s https://api.github.com/repos/yt-dlp/FFmpeg-Builds/releases/latest \ curl -s https://api.github.com/repos/yt-dlp/FFmpeg-Builds/releases/latest \
| grep browser_download_url \ | grep browser_download_url \
| grep linux64-gpl-4.4.tar.xz \ | grep ".*master.*linux64.*tar.xz" \
| cut -d '"' -f 4 \ | cut -d '"' -f 4 \
| xargs curl -L --output ffmpeg.tar.xz && \ | xargs curl -L --output ffmpeg.tar.xz && \
tar -xf ffmpeg.tar.xz --strip-components=2 --no-anchored -C /usr/bin/ "ffmpeg" && \ tar -xf ffmpeg.tar.xz --strip-components=2 --no-anchored -C /usr/bin/ "ffmpeg" && \
@ -25,22 +23,49 @@ RUN if [ "$TARGETPLATFORM" = "linux/amd64" ] ; then \
apt-get -y update && apt-get -y install --no-install-recommends ffmpeg && rm -rf /var/lib/apt/lists/* \ apt-get -y update && apt-get -y install --no-install-recommends ffmpeg && rm -rf /var/lib/apt/lists/* \
; fi ; fi
# copy config files # install requirements
COPY nginx.conf /etc/nginx/conf.d/ COPY ./tubearchivist/requirements.txt /requirements.txt
RUN pip install --user -r requirements.txt
# build final image
FROM python:3.10.4-slim-bullseye as tubearchivist
ARG TARGETPLATFORM
ARG INSTALL_DEBUG
ENV PYTHONUNBUFFERED 1
# copy build requirements
COPY --from=builder /root/.local /root/.local
COPY --from=builder /usr/bin/ffmpeg /usr/bin/ffmpeg
COPY --from=builder /usr/bin/ffprobe /usr/bin/ffprobe
ENV PATH=/root/.local/bin:$PATH
# install distro packages needed
RUN apt-get clean && apt-get -y update && apt-get -y install --no-install-recommends \
nginx \
atomicparsley \
curl && rm -rf /var/lib/apt/lists/*
# install debug tools for testing environment
RUN if [ "$INSTALL_DEBUG" ] ; then \
apt-get -y update && apt-get -y install --no-install-recommends \
vim htop bmon net-tools iputils-ping procps \
&& pip install --user ipython \
; fi
# make folders # make folders
RUN mkdir /cache RUN mkdir /cache
RUN mkdir /youtube RUN mkdir /youtube
RUN mkdir /app RUN mkdir /app
# install python dependencies # copy config files
COPY ./tubearchivist/requirements.txt /requirements.txt COPY docker_assets/nginx.conf /etc/nginx/sites-available/default
RUN pip install --no-cache-dir -r requirements.txt --src /usr/local/src
# copy application into container # copy application into container
COPY ./tubearchivist /app COPY ./tubearchivist /app
COPY ./run.sh /app COPY ./docker_assets/run.sh /app
COPY ./uwsgi.ini /app COPY ./docker_assets/uwsgi.ini /app
# volumes # volumes
VOLUME /cache VOLUME /cache

183
README.md
View File

@ -1,158 +1,51 @@
![Tube Archivist](assets/tube-archivist-banner.jpg?raw=true "Tube Archivist Banner") # Tube Archivist Frontend
<center><h1>Your self hosted YouTube media server</h1></center> This repo is WIP, recreation of [Tube Archivist](https://github.com/tubearchivist/tubearchivist) frontend in NextJS/React.
## Table of contents: This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
* [Wiki](https://github.com/bbilly1/tubearchivist/wiki) for a detailed documentation
* [Core functionality](#core-functionality)
* [Screenshots](#screenshots)
* [Problem Tube Archivist tries to solve](#problem-tube-archivist-tries-to-solve)
* [Installing and updating](#installing-and-updating)
* [Getting Started](#getting-started)
* [Potential pitfalls](#potential-pitfalls)
* [Roadmap](#roadmap)
* [Known limitations](#known-limitations)
* [Donate](#donate)
------------------------ ## Setup your environment
Copy *.env.local.example* to *.env.local* and set:
- **NEXTAUTH_SECRET**: Some long random string
- **NEXTAUTH_URL**: Your frontend, most likely `http://localhost:3000`
- **NEXT_PUBLIC_TUBEARCHIVIST_URL**: Your Tube Archivist backend testing server, e.g. `http://localhost:8000`
## Core functionality In general: Use the [unstable builds](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#releases) from Tube Archivist or build the image yourself from *testing* branch.
* Subscribe to your favorite YouTube channels
* Download Videos using **yt-dlp**
* Index and make videos searchable
* Play videos
* Keep track of viewed and unviewed videos
## Screenshots
![home screenshot](assets/tube-archivist-screenshot-home.png?raw=true "Tube Archivist Home")
*Home Page*
![channels screenshot](assets/tube-archivist-screenshot-channels.png?raw=true "Tube Archivist Channels")
*All Channels*
![single channel screenshot](assets/tube-archivist-screenshot-single-channel.png?raw=true "Tube Archivist Single Channel")
*Single Channel*
![video page screenshot](assets/tube-archivist-screenshot-video.png?raw=true "Tube Archivist Video Page")
*Video Page*
![video page screenshot](assets/tube-archivist-screenshot-download.png?raw=true "Tube Archivist Video Page")
*Downloads Page*
## Problem Tube Archivist tries to solve
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 offline through a convenient web interface.
## Installing and updating
Take a look at the example `docker-compose.yml` file provided. Tube Archivist depends on three main components split up into separate docker containers:
### Tube Archivist
The main Python application that displays and serves your video collection, built with Django.
- Serves the interface on port `8000`
- Needs a volume for the video archive at **/youtube**
- And another volume to save application data at **/cache**.
- The environment variables `ES_URL` and `REDIS_HOST` are needed to tell Tube Archivist where Elasticsearch and Redis respectively are located.
- The environment variables `HOST_UID` and `HOST_GID` allows Tube Archivist to `chown` the video files to the main host system user instead of the container user. Those two variables are optional, not setting them will disable that functionality. That might be needed if the underlying filesystem doesn't support `chown` like *NFS*.
- Change the environment variables `TA_USERNAME` and `TA_PASSWORD` to create the initial credentials.
- `ELASTIC_PASSWORD` is for the password for Elasticsearch. The environment variable `ELASTIC_USER` is optional, should you want to change the username from the default *elastic*.
### Elasticsearch
Stores video meta data and makes everything searchable. Also keeps track of the download queue.
- Needs to be accessible over the default port `9200`
- Needs a volume at **/usr/share/elasticsearch/data** to store data
Follow the [documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html) for additional installation details.
### Redis JSON
Functions as a cache and temporary link between the application and the file system. Used to store and display messages and configuration variables.
- Needs to be accessible over the default port `6379`
- Needs a volume at **/data** to make your configuration changes permanent.
### Redis on a custom port
For some architectures it might be required to run Redis JSON on a nonstandard port. To for example change the Redis port to **6380**, set the following values:
- Set the environment variable `REDIS_PORT=6380` to the *tubearchivist* service.
- For the *archivist-redis* service, change the ports to `6380:6380`
- Additionally set the following value to the *archivist-redis* service: `command: --port 6380 --loadmodule /usr/lib/redis/modules/rejson.so`
### Updating Tube Archivist
You will see the current version number of **Tube Archivist** in the footer of the interface so you can compare it with the latest release to make sure you are running the *latest and greatest*.
* There can be breaking changes between updates, particularly as the application grows, new environment variables or settings might be required for you to set in the your docker-compose file. *Always* check the **release notes**: Any breaking changes will be marked there.
* All testing and development is done with the Elasticsearch version number as mentioned in the provided *docker-compose.yml* file. This will be updated when a new release of Elasticsearch is available. Running an older version of Elasticsearch is most likely not going to result in any issues, but it's still recommended to run the same version as mentioned.
### Alternative installation instructions:
- **arm64**: Newest Tube Archivist container is multi arch, so is Elasticsearch. RedisJSON doesn't offer arm builds, you can use `bbilly1/rejson`, an unofficial rebuild for arm64.
- NOTE: This is untested, looking for feedback.
- **Synology**: There is a [discussion thread](https://github.com/bbilly1/tubearchivist/discussions/48) with Synology installation instructions.
- **Unraid**: The three containers needed are all in the Community Applications. First install `TubeArchivist RedisJSON` followed by `TubeArchivist ES`, and finally you can install `TubeArchivist`. If you have unraid specific issues, report those to the [support thread](https://forums.unraid.net/topic/114073-support-crocs-tube-archivist/ "support thread").
## Potential pitfalls
### vm.max_map_count
**Elastic Search** in Docker requires the kernel setting of the host machine `vm.max_map_count` to be set to at least 262144.
To temporary set the value run:
```
sudo sysctl -w vm.max_map_count=262144
```
To apply the change permanently depends on your host operating system:
- For example on Ubuntu Server add `vm.max_map_count = 262144` to the file */etc/sysctl.conf*.
- On Arch based systems create a file */etc/sysctl.d/max_map_count.conf* with the content `vm.max_map_count = 262144`.
- On any other platform look up in the documentation on how to pass kernel parameters.
### Permissions for elasticsearch
If you see a message similar to `AccessDeniedException[/usr/share/elasticsearch/data/nodes]` when initially starting elasticsearch, that means the container is not allowed to write files to the volume.
That's most likely the case when you run `docker-compose` as an unprivileged user. To fix that issue, shutdown the container and on your host machine run:
```
chown 1000:0 /path/to/mount/point
```
This will match the permissions with the **UID** and **GID** of elasticsearch within the container and should fix the issue.
## Getting Started ## Getting Started
1. Go through the **settings** page and look at the available options. Particularly set *Download Format* to your desired video quality before downloading. **Tube Archivist** downloads the best available quality by default. To support iOS or MacOS a compatible format must be specified. For example:
First, run the development server:
```bash
npm run dev
# or
yarn dev
``` ```
bestvideo[VCODEC=avc1]+bestaudio[ACODEC=mp4a]/mp4
```
2. Subscribe to some of your favorite YouTube channels on the **channels** page.
3. On the **downloads** page, click on *Rescan subscriptions* to add videos from the subscribed channels to your Download queue or click on *Add to download queue* to manually add Video IDs, links, channels or playlists.
4. Click on *Start download* and let **Tube Archivist** to it's thing.
5. Enjoy your archived collection!
## Roadmap
This should be considered as a **minimal viable product**, there is an extensive list of future functions and improvements planned.
### Functionality ### Errors:
- [ ] User roles - *next command not found*: Install next with `npm install next`
- [ ] Create playlists - *Error: Invalid src prop [...] hostname [...] is not configured under images in your `next.config.js`*: Add the *NEXT_PUBLIC_TUBEARCHIVIST_URL* to the list of *domains*.
- [ ] Podcast mode to serve channel as mp3 - *CORS errors in console*: Set the environment variable `DISABLE_CORS=True` to the Tube Archivist container to circumvent this protection. NEVER do that on network accessible installation.
- [ ] Implement [PyFilesystem](https://github.com/PyFilesystem/pyfilesystem2) for flexible video storage
- [ ] Optional automatic deletion of watched items after a specified time
- [ ] Subtitle download & indexing
- [X] Access control [2021-11-01]
- [X] Delete videos and channel [2021-10-16]
- [X] Add thumbnail embed option [2021-10-16]
- [X] Un-ignore videos [2021-10-03]
- [X] Dynamic download queue [2021-09-26]
- [X] Backup and restore [2021-09-22]
- [X] Scan your file system to index already downloaded videos [2021-09-14]
### UI Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
- [ ] Show similar videos on video page
- [ ] Multi language support
- [ ] Show total video downloaded vs total videos available in channel
- [X] Grid and list view for both channel and video list pages [2021-10-03]
- [X] Create a github wiki for user documentation [2021-10-03]
You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
## Known limitations [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
- Video files created by Tube Archivist need to be **mp4** video files for best browser compatibility.
- Every limitation of **yt-dlp** will also be present in Tube Archivist. If **yt-dlp** can't download or extract a video for any reason, Tube Archivist won't be able to either.
- For now this is meant to be run in a trusted network environment. Not everything is properly authenticated.
- There is currently no flexibility in naming of the media files.
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
## Donate ## Learn More
The best donation to **Tube Archivist** is your time, take a look at the [contribution page](CONTRIBUTING.md) to get started.
Second best way to support the development is to provide for caffeinated beverages: To learn more about Next.js, take a look at the following resources:
* [Paypal.me](https://paypal.me/bbilly1) for a one time coffee
* [Paypal Subscription](https://www.paypal.com/webapps/billing/plans/subscribe?plan_id=P-03770005GR991451KMFGVPMQ) for a monthly coffee - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
* [co-fi.com](https://ko-fi.com/bbilly1) for an alternative platform - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 238 KiB

161
deploy.sh
View File

@ -1,161 +0,0 @@
#!/bin/bash
# deploy all needed project files to different servers:
# test for local vm for testing
# blackhole for local production
# docker to publish
# create builder:
# docker buildx create --name tubearchivist
# docker buildx use tubearchivist
# docker buildx inspect --bootstrap
# more details:
# https://github.com/bbilly1/tubearchivist/issues/6
set -e
function sync_blackhole {
# docker commands need sudo, only build amd64
host="blackhole.local"
read -sp 'Password: ' remote_pw
export PASS=$remote_pw
rsync -a --progress --delete-after \
--exclude ".git" \
--exclude ".gitignore" \
--exclude "**/cache" \
--exclude "**/__pycache__/" \
--exclude "db.sqlite3" \
. -e ssh "$host":tubearchivist
echo "$PASS" | ssh "$host" 'sudo -S docker buildx build --platform linux/amd64 -t bbilly1/tubearchivist:latest tubearchivist --load 2>/dev/null'
echo "$PASS" | ssh "$host" 'sudo -S docker-compose up -d 2>/dev/null'
}
function sync_test {
# docker commands don't need sudo in testing vm
# pass argument to build for specific platform
host="tubearchivist.local"
rsync -a --progress --delete-after \
--exclude ".git" \
--exclude ".gitignore" \
--exclude "**/cache" \
--exclude "**/__pycache__/" \
--exclude "db.sqlite3" \
. -e ssh "$host":tubearchivist
rsync -r --progress --delete docker-compose.yml -e ssh "$host":docker
if [[ $1 = "amd64" ]]; then
platform="linux/amd64"
elif [[ $1 = "arm64" ]]; then
platform="linux/arm64"
elif [[ $1 = "multi" ]]; then
platform="linux/amd64,linux/arm64"
else
platform="linux/amd64"
fi
ssh "$host" "docker buildx build --platform $platform -t bbilly1/tubearchivist:latest tubearchivist --load"
ssh "$host" 'docker-compose -f docker/docker-compose.yml up -d'
ssh "$host" 'docker cp tubearchivist/tubearchivist/testing.sh tubearchivist:/app/testing.sh'
ssh "$host" 'docker exec tubearchivist chmod +x /app/testing.sh'
}
# run same tests and checks as with github action but locally
# takes filename to validate as optional argument
function validate {
if [[ $1 ]]; then
check_path="$1"
else
check_path="."
fi
echo "run validate on $check_path"
echo "running bandit"
bandit --recursive --skip B105,B108,B404,B603,B607 "$check_path"
echo "running black"
black --diff --color --check -l 79 "$check_path"
echo "running codespell"
codespell --skip="./.git" "$check_path"
echo "running flake8"
flake8 "$check_path" --count --max-complexity=12 --max-line-length=79 \
--show-source --statistics
echo "running isort"
isort --check-only --diff --profile black -l 79 "$check_path"
printf " \n> all validations passed\n"
}
function sync_docker {
# check things
if [[ $(git branch --show-current) != 'master' ]]; then
echo 'you are not on master, dummy!'
return
fi
if [[ $(systemctl is-active docker) != 'active' ]]; then
echo "starting docker"
sudo systemctl start docker
fi
echo "latest tags:"
git tag
echo "latest docker images:"
sudo docker image ls bbilly1/tubearchivist
printf "\ncreate new version:\n"
read -r VERSION
echo "build and push $VERSION?"
read -rn 1
# start build
sudo docker buildx build \
--platform linux/amd64,linux/arm64 \
-t bbilly1/tubearchivist:latest \
-t bbilly1/tubearchivist:"$VERSION" --push .
# create release tag
echo "commits since last version:"
git log "$(git describe --tags --abbrev=0)"..HEAD --oneline
git tag -a "$VERSION" -m "new release version $VERSION"
git push all "$VERSION"
}
# check package versions in requirements.txt for updates
python version_check.py
if [[ $1 == "blackhole" ]]; then
sync_blackhole
elif [[ $1 == "test" ]]; then
sync_test "$2"
elif [[ $1 == "validate" ]]; then
validate "$2"
elif [[ $1 == "docker" ]]; then
sync_docker
else
echo "valid options are: blackhole | test | validate | docker"
fi
##
exit 0

View File

@ -8,36 +8,37 @@ services:
ports: ports:
- 8000:8000 - 8000:8000
volumes: volumes:
- ./volumes/tubearchivist/media:/youtube - media:/youtube
- ./volumes/tubearchivist/cache:/cache - cache:/cache
environment: environment:
- ES_URL=http://archivist-es:9200 - ES_URL=http://archivist-es:9200 # needs protocol e.g. http and port
- REDIS_HOST=archivist-redis - REDIS_HOST=archivist-redis # don't add protocol
- HOST_UID=1000 - HOST_UID=1000
- HOST_GID=1000 - HOST_GID=1000
- TA_USERNAME=tubearchivist - TA_USERNAME=tubearchivist # your initial TA credentials
- TA_PASSWORD=verysecret - TA_PASSWORD=verysecret # your initial TA credentials
- ELASTIC_PASSWORD=verysecret - ELASTIC_PASSWORD=verysecret # set password for Elasticsearch
- TZ=America/New_York # set your time zone
depends_on: depends_on:
- archivist-es - archivist-es
- archivist-redis - archivist-redis
archivist-redis: archivist-redis:
image: redislabs/rejson:latest image: redislabs/rejson:latest # for arm64 use bbilly1/rejson
container_name: archivist-redis container_name: archivist-redis
restart: always restart: always
expose: expose:
- "6379" - "6379"
volumes: volumes:
- ./volumes/tubearchivist/redis:/data - redis:/data
depends_on: depends_on:
- archivist-es - archivist-es
archivist-es: archivist-es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1 image: bbilly1/tubearchivist-es # only for amd64, or use official es 7.17.2
container_name: archivist-es container_name: archivist-es
restart: always restart: always
environment: environment:
- "xpack.security.enabled=true" - "xpack.security.enabled=true"
- "ELASTIC_PASSWORD=verysecret" - "ELASTIC_PASSWORD=verysecret" # matching Elasticsearch password
- "discovery.type=single-node" - "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits: ulimits:
@ -45,6 +46,12 @@ services:
soft: -1 soft: -1
hard: -1 hard: -1
volumes: volumes:
- ./volumes/tubearchivist/es:/usr/share/elasticsearch/data - es:/usr/share/elasticsearch/data # check for permission error when using bind mount, see readme
expose: expose:
- "9200" - "9200"
volumes:
media:
cache:
redis:
es:

View File

@ -1,24 +0,0 @@
# Channels Overview and Channel Detail Page
The channels are organized on two different levels:
## Channels Overview
Accessible at `/channel/` of your Tube Archivist, the **Overview Page** shows a list of all channels you have indexed.
- You can filter that list to show or hide subscribed channels from the drop down menu. Clicking on the channel banner or the channel name will direct you to the *Channel Detail Page*.
- If you are subscribed to a channel a *Unsubscribe* button will show.
The **Subscribe to Channels** button <img src="assets/icon-add.png?raw=true" alt="add icon" width="20px" style="margin:0 5px;"> opens a text field to subscribe to a channel. You have a few options:
- Enter the YouTube channel ID, a 25 character alphanumeric string. For example *UCBa659QWEk1AI4Tg--mrJ2A*
- Enter the URL to the channel page on YouTube. For example *https://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A*
- Enter the channel name for example: *https://www.youtube.com/c/TomScottGo*.
- Enter the video URL for any video and let Tube Archivist extract the channel ID for you. For example *https://www.youtube.com/watch?v=2tdiKTSdE9Y*
- Add one per line.
The search icon <img src="assets/icon-search.png?raw=true" alt="search icon" width="20px" style="margin:0 5px;"> opens a text box to search for indexed channel names. Possible matches will show as you type.
## Channel Detail
Each channel will get a dedicated channel detail page accessible at `/channel/<channel-id>/` of your Tube Archivist. This page shows all the videos you have downloaded from this channel plus additional metadata.
- If you are subscribed to the channel, an *Unsubscribe* button will show.
- You can *Show* the channel description, that matches with the *About* tab on YouTube.
- The **Mark as Watched** button will mark all videos of this channel as watched.
- The button **Delete Channel** will delete the channel plus all videos of this channel, both media files and metadata.

View File

@ -1,35 +0,0 @@
# Downloads Page
Accessible at `/downloads/` of your Tube Archivist, this page handles all the download functionality.
## Rescan Subscriptions
The **Rescan Subscriptions** icon <img src="assets/icon-rescan.png?raw=true" alt="rescan icon" width="20px" style="margin:0 5px;"> will start a background task to look for new videos from the channels you are subscribed to. You can define the channel page size on the [settings page](Settings#subscriptions). With the default channel page size, expect this process to take around 2-3 seconds for each channel you are subscribed to. A status message will show the progress.
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 before. All the other videos will get added to the download queue. Expect this to take around 1 second for each video as **Tube Archivist** needs to grab some additional metadata. New videos will get added at the bottom of the download queue.
## Download Queue
The **Start Download** icon <img src="assets/icon-download.png?raw=true" alt="download icon" width="20px" style="margin:0 5px;"> will start the download process starting from the top of the queue. Take a look at the relevant settings on the [Settings Page](Settings#downloads). Once the process started, a progress message will show with additional details and controls:
- The stop icon <img src="assets/icon-stop.png?raw=true" alt="stop icon" width="20px" style="margin:0 5px;"> will gracefully stop the download process, once the current video has been finished successfully.
- The cancel icon <img src="assets/icon-close-red.png?raw=true" alt="close icon" width="20px" style="margin:0 5px;"> 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.
## Add to Download Queue
The **Add to Download Queue** icon <img src="assets/icon-add.png?raw=true" alt="add icon" width="20px" style="margin:0 5px;"> opens a text field to manually add videos to the download queue. You have a few options:
- Add a link to a YouTube video. For example *https://www.youtube.com/watch?v=2tdiKTSdE9Y*.
- Add a YouTube video ID. For example *2tdiKTSdE9Y*.
- Add a link to a YouTube video by providing the shortened URL, for example *https://youtu.be/2tdiKTSdE9Y*.
- Add a Channel ID or Channel URL to add every available video to the download queue. This will ignore the channel page size as described before and is meant for an initial download of the whole channel. You can still ignore selected videos before starting the download.
- Add a channel name like for example *https://www.youtube.com/c/TomScottGo*.
- Add a playlist ID or URL to add every available video in the list to the download queue, for example *https://www.youtube.com/playlist?list=PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha* or *PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha*. Note that when you add a link to a video in a playlist, Tube Archivist assumes you want to download only the specific video and not the whole playlist, for example *https://www.youtube.com/watch?v=CINVwWHlzTY&list=PL96C35uN7xGLLeET0dOWaKHkAlPsrkcha* will only add one video *CINVwWHlzTY* to the queue.
- Add one link per line.
## The Download Queue
Below the three buttons you find the download queue. New items will get added at the bottom of the queue, the next video to download once you click on **Start Download** will be the first in the list.
Every video in the download queue has two buttons:
- **Ignore**: This will remove that video from the download queue and this video will not get added again, even when you **Rescan Subscriptions**.
- **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.
You can flip the view by activating **Show Only Ignored Videos**. This will show all videos you have previously *ignored*.
Every video in the ignored list has two buttons:
- **Forget**: This will delete the item form the ignored list.
- **Add to Queue**: This will add the ignored video back to the download queue.

View File

@ -1,27 +0,0 @@
# Tube Archivist Wiki
Welcome to the official Tube Archivist Wiki. This is an up-to-date documentation of user functionality.
Table of contents:
* [Main](Main): Tube Archivist landing page
* [Channels](Channels): Browse your channels, handle subscriptions
* [Downloads](Downloads): Scanning subscriptions, handle download queue
* [Settings](Settings): All the configuration options
* [Users](Users): User management admin interface
## Getting Started
1. [Subscribe](Channels#channels-overview) to some of your favourite YouTube channels.
2. [Scan](Downloads#rescan-subscriptions) subscriptions to add the latest videos to the download queue.
3. [Add](Downloads#add-to-download-queue) additional videos, channels or playlist - ignore the ones you don't want to download.
4. [Download](Downloads#download-queue) and let **Tube Archivist** do it's thing.
5. Sit back and enjoy your archived and indexed collection!
## General Navigation
* Clicking on the channel name or the channel icon brings you to the dedicated channel page to show videos from that channel.
* Clicking on a video title brings you to the dedicated video page and shows additional details.
* Clicking on a video thumbnail opens the video player and starts streaming the selected video.
* Hover over the playing video to show additional control options.
An empty checkbox icon <img src="assets/icon-unseen.png?raw=true" alt="unseen icon" width="20px" style="margin:0 5px;"> will show for videos you haven't marked as watched. Click on it and the icon will change to a filled checkbox <img src="assets/icon-seen.png?raw=true" alt="seen icon" width="20px" style="margin:0 5px;"> indicating it as watched - click again to revert.
When available the <img src="assets/icon-gridview.png?raw=true" alt="gridview icon" width="20px" style="margin:0 5px;"> gridview icon will display the list in a grid, the <img src="assets/icon-listview.png?raw=true" alt="listview icon" width="20px" style="margin:0 5px;"> listview icon will arrange the items in a list.

View File

@ -1,10 +0,0 @@
# Tube Archivist Home Page Functionality
This is the landing page, when you first open **Tube Archivist**. You have a few options to sort and filter that view:
- With the **Sort Order** you can select how the "Recent Videos" are sorted:
- **Date Published**: Sorts the list by date when the video was published on YouTube, newest on top.
- **Date Downloaded**: Sorts the list based on when you have downloaded the video to your archive, newest on top.
- With **Hide Watched** you can filter out videos you have already marked as watched to only show unwatched videos.
- You can use those two options together to for example filter the list to *Hide Watched* videos **and** sort by date downloaded.
Additionally the search icon <img src="assets/icon-search.png?raw=true" alt="search icon" width="20px" style="margin:0 5px;"> opens a text field to search your collection.

View File

@ -1,73 +0,0 @@
# Settings Page
Accessible at `/settings/` of your **Tube Archivist**, this page holds all the configurations and additional functionality related to the database.
Click on **Update Settings** at the bottom of the form to apply your configurations.
## Color scheme
Switch between the easy on the eyes dark theme and the burning bright theme.
## Archive View
- **Page Size**: Defines how many results get displayed on a given page. Same value goes for all archive views.
## Subscriptions
Settings related to the channel management.
- **Channel Page Size**: 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**, that's 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.
## Downloads
Settings related to the download process.
- **Download Limit**: Stop the download process after downloading the set quantity of videos.
- **Download Speed Limit**: Set your download speed limit in KB/s. This will pass the option `--limit-rate` to yt-dlp.
- **Throttled Rate Limit**: 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.
- **Sleep Interval**: Time in seconds to sleep between requests to YouTube. It's a good idea to set this to **3** seconds. Might be necessary to avoid throttling.
## Download Format
Additional settings passed to yt-dlp.
- **Format**: This controls which streams get downloaded and is equivalent to passing `--format` to yt-dlp. Use one of the recommended one or look at the documentation of [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.
- **Embed Metadata**: This saves the available tags directly into the media file by passing `--embed-metadata` to yt-dlp.
- **Embed Thumbnail**: This will save the thumbnail into the media file by passing `--embed-thumbnail` to yt-dlp.
# Actions
Additional database functionality.
## Manual Media Files Import
So far this depends on the video you are trying to import to be still available on YouTube to get the metadata. Add the files you like to import to the */cache/import* folder. Then start the process from the settings page *Manual Media Files Import*. Make sure to follow one of the two methods below.
### Method 1:
Add a matching *.json* file with the media file. Both files need to have the same base name, for example:
- For the media file: \<base-name>.mp4
- For the JSON file: \<base-name>.info.json
- Alternate JSON file: \<base-name>.json
**Tube Archivist** then looks for the 'id' key within the JSON file to identify the video.
### Method 2:
Detect the YouTube ID from filename, this accepts the default yt-dlp naming convention for file names like:
- \<base-name>[\<youtube-id>].mp4
- The YouTube ID in square brackets at the end of the filename is the crucial part.
### Some notes:
- 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.
- Maybe start with a subset of your files to import to make sure everything goes well...
- Follow the logs to monitor progress and errors: `docker-compose logs -f tubearchivist`.
## Embed thumbnails into media file
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 want to make sure all media files get the newest thumbnail. Follow the docker-compose logs to monitor progress.
## Backup Database
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 plus a complete export of the index in a set of conventional **json** files.
BE AWARE: This will **not** backup any media files, just the metadata from the Elasticsearch.
## Restore From Backup
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 snapshot. If there are multiple backup files in the folder, the newest one will take priority.
BE AWARE: This will **replace** your current index with the one from the backup file. This won't restore any media files.
## Rescan Filesystem
This function will go through all your media files and looks at the whole index to try to find any issues:
- 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.
- When you delete media files from the filesystem outside of the Tube Archivist interface, this will delete leftover metadata from the index.
- When you have media files that are not indexed yet, this will grab the metadata from YouTube like 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 does, particularly the YouTube ID needs to be at the same index in the filename, alternatively see above for *Manual Media Files Import*.
BE AWARE: There is no undo.

View File

@ -1,20 +0,0 @@
# User Management
For now, **Tube Archivist** is a single user application. You can create multiple users with different names and passwords, they will share the same videos and permissions but some interface configurations are on a per user basis. *More is on the roadmap*.
## Superuser
The first user gets created with the environment variables **TA_USERNAME** and **TA_PASSWORD** from your docker-compose file. That first user will automatically have *superuser* privileges.
## Admin Interface
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.
## Create additional users
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 password and click on *Save* to create the user.
## Changing users
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.
## Reset
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.
NOTE: Future improvements here will most likely require such a reset.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

5
next-env.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

9
next.config.js Normal file
View File

@ -0,0 +1,9 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
domains: ["localhost", "tube.stiforr.tech"],
},
reactStrictMode: true,
};
module.exports = nextConfig;

View File

@ -1,18 +0,0 @@
server {
listen 8000;
location /cache/ {
alias /cache/;
}
location /media/ {
alias /youtube/;
}
location / {
include uwsgi_params;
uwsgi_pass localhost:8080;
}
}

36
package.json Normal file
View File

@ -0,0 +1,36 @@
{
"name": "tubearchivist-frontend",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"prepare": "husky install"
},
"dependencies": {
"next": "12.1.1",
"next-auth": "4.7.0",
"react": "18.0.0",
"react-dom": "18.0.0",
"react-player": "2.10.0",
"react-query": "3.39.1",
"sharp": "0.30.3"
},
"devDependencies": {
"@types/node": "17.0.23",
"@types/react": "17.0.43",
"@types/react-dom": "17.0.14",
"eslint": "8.12.0",
"eslint-config-next": "12.1.1",
"husky": "7.0.4",
"lint-staged": "12.4.0",
"prettier": "2.6.1",
"typescript": "4.5.5"
},
"lint-staged": {
"*.{ts,tsx}": "eslint --cache --fix",
"*.{ts,tsx,css,md}": "prettier --write"
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/static/favicon/mstile-150x150.png"/>
<TileColor>#01202e</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
public/favicon/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,100 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1000.000000pt" height="1000.000000pt" viewBox="0 0 1000.000000 1000.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,1000.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4521 9370 c-4 -3 -7 -31 -6 -63 1 -32 -3 -61 -9 -66 -6 -5 -36 -12
-66 -16 -55 -7 -68 -9 -125 -19 -16 -3 -48 -8 -70 -12 -161 -24 -504 -118
-709 -193 -208 -77 -507 -215 -636 -294 -19 -12 -47 -29 -62 -37 -14 -8 -41
-24 -60 -34 -84 -48 -288 -189 -423 -293 -309 -239 -654 -606 -886 -943 -53
-78 -169 -258 -169 -264 0 -3 -21 -40 -47 -83 -97 -164 -313 -646 -294 -658
14 -8 670 -195 686 -195 8 0 15 9 15 19 0 11 5 23 10 26 6 3 10 13 10 21 0 8
14 44 30 79 17 35 30 67 30 70 0 3 21 48 47 100 l47 95 148 0 c81 0 276 1 433
1 157 0 310 -1 340 -1 l55 0 0 -615 0 -615 415 1 415 0 1 142 c0 78 0 355 1
615 l1 472 46 0 c25 0 322 0 659 0 l612 1 0 32 c1 44 -1 538 -2 660 0 63 -5
97 -12 98 -6 1 -581 1 -1278 0 -698 0 -1268 2 -1268 5 0 7 143 147 241 235 94
85 232 193 329 260 36 24 67 47 68 52 2 4 7 7 12 7 4 0 52 28 106 62 126 79
371 202 510 257 60 23 118 46 129 51 131 56 685 193 713 176 4 -2 7 -34 6 -70
l0 -66 162 0 162 0 0 503 0 502 -155 0 c-85 0 -158 -2 -162 -5z"/>
<path d="M5210 8905 l0 -365 48 -1 c26 0 54 -2 62 -4 8 -1 45 -5 82 -9 72 -6
198 -23 232 -31 12 -3 32 -7 46 -9 284 -48 643 -169 935 -314 527 -262 984
-651 1324 -1127 39 -55 75 -105 81 -112 5 -7 10 -17 10 -23 0 -5 4 -10 9 -10
5 0 14 -12 20 -27 6 -16 24 -48 40 -73 31 -47 61 -101 117 -208 30 -57 32 -65
16 -69 -75 -20 -117 -40 -113 -53 9 -35 83 -285 85 -287 1 -2 18 2 37 8 19 5
41 12 49 14 49 12 856 241 876 249 11 4 10 14 -2 57 -9 29 -17 60 -19 68 -7
32 -53 183 -57 186 -2 2 -22 -2 -43 -9 -93 -31 -88 -33 -126 46 -232 488 -557
933 -950 1303 -285 269 -647 520 -1014 705 -533 268 -1067 412 -1682 455 l-63
4 0 -364z"/>
<path d="M6122 7336 c-4 -6 -14 -31 -23 -56 -17 -47 -238 -630 -288 -760 -16
-41 -61 -160 -100 -265 -40 -104 -76 -199 -80 -210 -10 -23 -54 -138 -104
-275 -20 -52 -41 -108 -48 -125 -7 -16 -13 -32 -13 -35 -1 -3 -7 -18 -13 -35
-6 -16 -55 -145 -108 -285 -53 -140 -102 -271 -110 -290 -8 -19 -48 -125 -89
-235 -41 -110 -90 -240 -109 -290 -19 -49 -76 -200 -127 -335 -133 -356 -151
-402 -166 -437 -8 -17 -14 -34 -14 -37 0 -3 -15 -45 -34 -94 -19 -48 -61 -160
-95 -248 -33 -89 -65 -174 -72 -190 -22 -55 -28 -70 -98 -258 -39 -103 -71
-192 -71 -197 0 -5 182 -8 441 -7 l441 3 114 320 c63 176 126 352 140 390 14
39 46 129 70 200 25 72 50 139 55 150 5 11 22 58 38 105 29 84 89 254 171 480
23 63 47 133 54 155 12 36 70 199 131 365 13 36 60 169 105 295 44 127 85 239
90 250 4 11 62 173 129 360 197 557 186 530 195 504 3 -8 18 -52 35 -99 16
-47 54 -155 84 -240 30 -85 96 -272 146 -415 51 -143 96 -269 100 -280 5 -11
27 -72 49 -135 120 -343 143 -407 152 -422 6 -10 10 -24 10 -33 0 -8 6 -29 14
-47 8 -18 44 -116 80 -218 182 -521 327 -927 336 -942 6 -10 10 -23 10 -29 0
-9 134 -393 176 -502 8 -21 28 -78 45 -128 l31 -90 -49 -56 c-26 -31 -78 -88
-115 -127 -64 -68 -68 -70 -81 -51 -8 11 -28 37 -44 57 l-30 37 -124 -91 c-68
-50 -123 -96 -123 -104 1 -9 281 -404 327 -459 4 -5 62 -84 128 -175 65 -91
124 -166 129 -168 8 -3 73 39 90 58 3 3 42 32 88 64 l82 58 -40 56 -39 56 94
96 c558 566 945 1258 1130 2025 18 77 38 167 44 200 6 33 13 69 15 80 6 33 19
119 21 140 2 11 6 43 9 70 35 253 40 715 11 930 -2 17 -9 75 -15 129 -7 55
-16 109 -20 122 -5 12 -7 24 -5 26 11 11 -85 428 -98 428 -11 0 -680 -190
-685 -195 -2 -1 8 -47 21 -101 14 -55 28 -115 31 -134 3 -19 8 -46 11 -60 10
-53 19 -109 29 -195 4 -33 9 -70 11 -82 8 -53 18 -259 18 -369 -1 -400 -74
-812 -213 -1194 -23 -63 -44 -123 -47 -132 -9 -29 -20 -21 -35 25 -22 62 -198
529 -208 552 -5 11 -69 178 -141 370 -72 193 -187 499 -256 680 -68 182 -164
436 -213 565 -48 129 -93 246 -98 260 -6 14 -27 70 -47 125 -19 55 -40 109
-45 120 -8 18 -191 503 -224 595 -15 42 -95 253 -139 366 l-31 80 -398 0
c-270 0 -401 -3 -406 -10z"/>
<path d="M720 6002 c-47 -160 -68 -237 -64 -243 2 -4 28 -13 56 -19 29 -7 56
-14 59 -16 4 -2 3 -23 -1 -46 -5 -24 -11 -61 -14 -83 -4 -23 -8 -50 -10 -60
-2 -11 -7 -47 -10 -80 -4 -33 -9 -73 -11 -90 -31 -231 -26 -701 11 -955 3 -25
8 -61 10 -80 2 -19 5 -44 8 -55 3 -11 8 -42 12 -70 3 -27 8 -53 10 -56 2 -4 6
-24 10 -45 20 -134 154 -594 209 -719 7 -16 27 -66 45 -110 59 -147 189 -400
297 -579 89 -147 270 -400 359 -502 11 -12 39 -46 64 -75 74 -89 358 -369 465
-459 55 -46 110 -92 121 -102 22 -19 22 -19 107 99 48 65 90 123 94 128 35 42
243 336 242 342 0 5 -38 40 -85 78 -313 258 -611 618 -818 988 -63 114 -176
341 -176 355 0 5 -9 26 -19 48 -54 113 -171 502 -200 669 -6 33 -13 69 -15 80
-8 43 -21 134 -31 210 -19 156 -24 420 -12 605 8 119 13 166 33 295 5 28 7 53
6 58 -2 8 24 3 99 -18 l45 -13 23 82 c12 44 29 106 38 136 30 104 34 95 -54
118 -43 11 -109 29 -148 40 -38 11 -104 30 -145 41 -41 12 -79 23 -85 25 -5 1
-28 8 -50 14 -22 7 -112 33 -200 58 -88 25 -181 52 -207 59 l-48 14 -20 -67z"/>
<path d="M2693 5210 c-48 -11 -119 -56 -148 -95 -112 -146 -57 -352 115 -428
43 -19 68 -20 560 -21 449 -1 521 1 563 15 65 22 114 64 151 129 27 48 31 64
31 130 0 116 -49 200 -149 253 -41 22 -44 22 -566 23 -289 1 -539 -2 -557 -6z"/>
<path d="M6425 5138 c-50 -19 -102 -55 -128 -90 -56 -73 -55 -54 -55 -901 -1
-430 -1 -793 -2 -807 0 -21 -26 1 -169 148 -93 94 -173 172 -178 172 -4 0 -58
-50 -118 -110 l-110 -110 25 -24 c14 -12 202 -204 419 -424 217 -221 397 -402
401 -402 3 0 199 192 435 426 l429 425 -114 114 -115 114 -177 -178 -178 -178
-1 381 c-2 1238 -2 1258 -24 1301 -26 52 -71 98 -126 126 -51 26 -166 35 -214
17z"/>
<path d="M2814 4501 c-2 -2 -4 -415 -4 -918 l0 -913 415 0 415 0 0 28 c4 223
0 1795 -4 1799 -6 7 -816 10 -822 4z"/>
<path d="M3181 2038 c-8 -13 -44 -63 -81 -113 -36 -49 -101 -137 -143 -195
-42 -58 -80 -109 -84 -115 -16 -20 -88 -119 -103 -141 -8 -13 -48 -68 -89
-124 -40 -55 -72 -103 -70 -105 2 -2 60 -44 129 -94 l125 -91 25 32 c62 79 35
81 231 -15 382 -187 717 -298 1149 -382 8 -1 36 -5 61 -9 25 -4 57 -9 70 -11
45 -7 183 -24 264 -32 105 -10 629 -10 725 0 116 13 131 14 195 22 58 7 70 9
125 19 14 3 42 8 63 11 48 7 174 32 252 51 33 8 67 16 76 19 145 33 419 126
599 202 122 52 413 195 418 206 2 4 8 7 12 7 11 0 193 108 273 162 53 36 57
41 45 59 -107 155 -406 558 -415 558 -7 1 -44 -19 -82 -44 -236 -153 -537
-295 -814 -386 -97 -31 -291 -85 -342 -94 -16 -2 -41 -7 -55 -10 -39 -9 -240
-43 -288 -49 -212 -28 -609 -29 -822 -2 -14 2 -52 7 -85 11 -33 4 -69 9 -80
12 -11 2 -33 6 -50 9 -211 34 -520 123 -735 211 -86 36 -291 130 -299 138 -2
3 15 30 38 60 24 31 41 58 39 60 -11 11 -243 178 -252 181 -6 2 -17 -6 -25
-18z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,19 @@
{
"name": "TubeArchivist",
"short_name": "TubeArchivist",
"icons": [
{
"src": "/static/favicon/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/favicon/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#01202e",
"background_color": "#01202e",
"display": "standalone"
}

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

75
public/img/icon-exit.svg Normal file
View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="210mm"
viewBox="0 0 210 210"
version="1.1"
id="svg1566"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="Icons_exit 05.svg">
<defs
id="defs1560" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35355339"
inkscape:cx="963.7258"
inkscape:cy="291.01609"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata1563">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-87)">
<path
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.35654187;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
d="M 106.49932,87.901069 C 49.504302,87.900974 3.3006913,134.10459 3.3007713,191.0996 c 0,0.30098 0.003,0.60131 0.005,0.90167 v 0 c -0.003,0.29952 -0.006,0.59901 -0.006,0.89912 -8e-5,56.99502 46.2035307,103.19865 103.1985287,103.19854 23.01714,-0.0773 45.34783,-7.84709 63.44155,-22.07425 0,0 9.01874,-8.71006 2.40579,-16.41737 -6.61297,-7.70731 -19.11222,0.3185 -19.11222,0.3185 -13.60985,9.81394 -29.95596,15.11012 -46.73512,15.14236 -44.275428,0 -80.167758,-35.89234 -80.167758,-80.16778 0,-0.30097 0.003,-0.60148 0.006,-0.90166 h -5.2e-4 c -0.003,-0.29934 -0.006,-0.59901 -0.006,-0.89913 0,-44.27545 35.89234,-80.16777 80.167778,-80.16777 16.77916,0.0322 33.12527,5.32843 46.73512,15.14236 0,0 12.49925,8.02581 19.11222,0.3185 6.61295,-7.70732 -2.4058,-16.41739 -2.4058,-16.41739 C 151.84561,95.74815 129.51494,87.97828 106.4978,87.901069 Z m 54.30959,56.450221 -12.13663,11.69622 20.15864,20.93332 -93.932488,-1.4899 c -9.22763,-0.17349 -16.77655,6.07423 -16.92587,14.00904 l 0.002,0.002 c -0.0149,1.82673 -0.0235,3.40102 0,4.99598 l -0.002,0.002 c 0.14932,7.93483 7.69824,14.18254 16.92587,14.00905 l 93.932488,-1.48991 -20.15864,20.93333 12.13663,11.69622 34.0585,-35.35536 11.82982,-12.29208 h 0.003 l -9.9e-4,-0.002 9.9e-4,-9.9e-4 h -0.003 l -11.82982,-12.29208 z"
id="path1405"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccsccsccsccscccccccccccccccccccccc" />
<path
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.39729571;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
d="m 506.57967,92.503023 c -57.98068,-1e-4 -104.98336,47.002567 -104.98326,104.983257 1.9e-4,57.98049 47.00276,104.98284 104.98326,104.98273 23.42489,-0.0758 46.15146,-7.98387 57.83458,-18.08923 11.68313,-10.10537 12.15613,-18.62993 7.38675,-23.04107 v -0.002 c -4.7711,-4.41269 -12.38099,-1.9587 -17.69245,2.25103 -13.83538,9.99805 -30.45915,15.40285 -47.52888,15.4528 -45.04116,0 -81.55421,-36.51305 -81.5542,-81.55419 0,-45.04114 36.51307,-81.5542 81.5542,-81.5542 17.06933,0.0328 33.21884,5.19482 43.16812,12.86758 9.94929,7.67275 17.33418,9.17607 22.1053,4.76338 v -0.002 c 4.77116,-4.41278 5.55882,-12.9887 -0.73482,-18.60197 -18.40654,-14.47308 -41.1234,-22.377337 -64.5386,-22.455877 z m 55.24881,57.426467 -12.34652,11.8985 20.50728,21.29534 -95.55697,-1.51567 c -9.38721,-0.17649 -17.06669,6.17929 -17.21858,14.25133 l 0.003,0.002 c -0.15192,8.07203 7.28245,14.71295 16.66978,14.88953 l 95.22519,1.50947 -21.06332,20.28455 12.04579,12.49846 36.06808,-34.74464 0.005,0.005 12.34654,-11.89954 -12.03701,-12.50724 z m 35.17874,98.71801 0.69918,0.67386 c 0.13539,-0.22412 0.26991,-0.44874 0.4036,-0.67386 z"
id="path1405-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccsczccccccccccccccccccccccc" />
<path
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.39729571;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
d="m 740.89945,94.730897 c -57.98068,-9.6e-5 -104.98334,47.002563 -104.98325,104.983253 1.9e-4,57.98049 47.00276,104.98284 104.98325,104.98274 23.42488,-0.0758 46.15145,-7.98387 64.5635,-22.46581 l -17.03461,-16.41553 c -13.83537,9.99805 -30.45916,15.40285 -47.52889,15.4528 -45.04113,0 -81.55419,-36.51306 -81.55419,-81.5542 0,-45.04114 36.51306,-81.55419 81.55419,-81.55419 17.06934,0.0328 33.69814,5.42058 47.54336,15.40423 l 16.99534,-16.3773 c -18.40663,-14.4732 -41.12349,-22.377447 -64.5387,-22.455993 z m 55.24882,57.426473 -12.34653,11.8985 20.50728,21.29534 -95.55696,-1.51567 c -9.38721,-0.17649 -17.06668,6.17928 -17.21858,14.25132 l 0.002,0.002 c -0.1519,8.07203 7.28245,14.71295 16.66978,14.88953 l 95.22519,1.50947 -21.06332,20.28455 12.04578,12.49846 36.06808,-34.74465 0.005,0.005 12.34653,-11.89953 -12.03699,-12.50725 z m 35.17873,98.718 0.69919,0.67386 c 0.13538,-0.22412 0.26991,-0.44874 0.40359,-0.67386 z"
id="path1405-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccsccccccccccccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -15,7 +15,7 @@
version="1.1" version="1.1"
id="svg1303" id="svg1303"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)" inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="Icons_thumbs.svg"> sodipodi:docname="Icons_seen.svg">
<defs <defs
id="defs1297" /> id="defs1297" />
<sodipodi:namedview <sodipodi:namedview
@ -25,9 +25,9 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.71458126" inkscape:zoom="1.0105705"
inkscape:cx="-133.80736" inkscape:cx="84.208758"
inkscape:cy="163.34297" inkscape:cy="136.94831"
inkscape:document-units="mm" inkscape:document-units="mm"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
@ -55,9 +55,9 @@
id="layer1" id="layer1"
transform="translate(0,-164.70764)"> transform="translate(0,-164.70764)">
<path <path
style="opacity:1;fill:#1a1a1a;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
d="m 74.762046,169.84647 c -0.757275,-0.0266 -1.556205,0.0266 -2.398918,0.17006 -17.977757,2.9811 5.863528,29.19697 -15.075776,44.15933 -17.503229,14.60104 -23.870308,10.01972 -24.044759,14.80451 v 47.00292 c 2.623747,6.94761 20.093043,14.05087 38.660635,15.56434 18.567588,1.51346 44.529822,-2.41107 44.816272,-10.49357 0.15245,-7.31882 -4.01785,-7.48655 -4.01785,-7.48655 0,0 9.14077,-0.56532 9.44575,-8.4939 0.15212,-7.77626 -8.85445,-8.88809 -8.85445,-8.88809 0,0 11.53636,-0.3275 11.53636,-8.34902 0,-8.20546 -8.87381,-8.85175 -11.6189,-8.99092 1.70324,-0.10363 8.42562,-2.42967 8.3861,-10.53741 -0.0399,-8.37053 -12.87508,-7.67987 -35.956784,-9.20144 2.66326,-15.52873 4.52035,-48.76031 -10.87768,-49.26032 z m -63.387663,53.22425 c -2.167221,0 -3.911718,1.45375 -3.911718,3.25977 v 53.07599 c 0,1.80609 1.744497,3.25983 3.911718,3.25983 h 14.602385 c 2.167228,0 3.911725,-1.45374 3.911725,-3.25983 v -53.07599 c 0,-1.80602 -1.744497,-3.25977 -3.911725,-3.25977 z" d="M 66.145984,191.3255 A 71.797122,73.404487 0 0 0 2.5025987,230.88314 71.797122,73.404487 0 0 0 66.145984,270.38145 71.797122,73.404487 0 0 0 129.78937,230.82387 71.797122,73.404487 0 0 0 66.145984,191.3255 Z m -4.921549,7.22394 a 32.724755,32.724755 0 0 0 -13.334395,5.17759 12.828107,12.828107 0 0 1 2.180958,-0.18652 12.828107,12.828107 0 0 1 12.828141,12.82816 12.828107,12.828107 0 0 1 -12.828141,12.82822 12.828107,12.828107 0 0 1 -12.828192,-12.82822 12.828107,12.828107 0 0 1 0.04509,-0.91548 32.724755,32.724755 0 0 0 -3.86581,15.39964 32.724755,32.724755 0 0 0 27.161922,32.24981 A 59.09757,60.420619 0 0 1 13.7604,230.8774 59.09757,60.420619 0 0 1 61.224664,198.54948 Z m 10.482345,0.0563 a 59.09757,60.420619 0 0 1 46.82502,32.22523 59.09757,60.420619 0 0 1 -47.393377,32.32497 32.724755,32.724755 0 0 0 27.73169,-32.30187 32.724755,32.724755 0 0 0 -27.163333,-32.24833 z"
id="rect1278" id="path1091"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -15,7 +15,7 @@
version="1.1" version="1.1"
id="svg1303" id="svg1303"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)" inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="Icons_exit.svg"> sodipodi:docname="Icons_sort.svg">
<defs <defs
id="defs1297" /> id="defs1297" />
<sodipodi:namedview <sodipodi:namedview
@ -25,16 +25,16 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.66442107" inkscape:zoom="0.6482696"
inkscape:cx="161.45413" inkscape:cx="214.8721"
inkscape:cy="207.61753" inkscape:cy="136.02434"
inkscape:document-units="mm" inkscape:document-units="mm"
inkscape:current-layer="layer1" inkscape:current-layer="g855"
showgrid="false" showgrid="false"
units="px" units="px"
inkscape:window-width="1169" inkscape:window-width="957"
inkscape:window-height="893" inkscape:window-height="893"
inkscape:window-x="729" inkscape:window-x="941"
inkscape:window-y="13" inkscape:window-y="13"
inkscape:window-maximized="0" /> inkscape:window-maximized="0" />
<metadata <metadata
@ -58,10 +58,10 @@
id="g855" id="g855"
transform="matrix(1.9016362,0,0,1.9016362,-197.93838,-58.9418)"> transform="matrix(1.9016362,0,0,1.9016362,-197.93838,-58.9418)">
<path <path
inkscape:connector-curvature="0" style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.55118108;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
id="rect1208" d="M 341.125 82.275391 L 315.50977 106.92773 L 241.84375 177.89258 L 266.21289 203.17969 L 309.82617 161.17969 L 306.72266 379.375 C 306.36114 398.60059 319.37807 414.32761 335.91016 414.63867 L 335.91406 414.63477 C 352.44586 414.94597 366.04647 399.71987 366.4082 380.49414 L 369.5 162.97852 L 411.04297 206.11719 L 436.64062 181.44727 L 365.48242 107.57812 L 365.49609 107.5625 L 341.125 82.275391 z M 175.93359 82.277344 L 175.92969 82.28125 C 159.39782 81.970041 145.79728 97.196144 145.43555 116.42188 L 142.34375 333.9375 L 100.80078 290.79883 L 75.203125 315.46875 L 146.36133 389.33789 L 146.3457 389.35156 L 170.7168 414.63867 L 196.33203 389.98633 L 270 319.02344 L 245.63086 293.73633 L 202.01758 335.73633 L 205.12109 117.54102 C 205.48261 98.315428 192.46568 82.588409 175.93359 82.277344 z "
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" transform="matrix(0.13913489,0,0,0.13913489,104.08846,117.60887)"
d="m 124.57603,151.92962 c -0.0433,2.30016 2.0751,4.19245 4.75007,4.24278 l 30.26401,0.43007 -6.00195,5.78023 3.43246,3.56154 10.2778,-9.9006 0.002,0.002 3.5183,-3.3908 -3.42991,-3.564 -9.8737,-10.24989 -3.51834,3.39083 5.84388,6.06803 -30.35875,-0.43185 c -2.67494,-0.0503 -4.86301,1.76094 -4.90629,4.06112 z m -17.65039,-32.01644 v 64.95883 h 7.44347 v -58.27707 h 26.3896 v 18.5229 h 7.44296 v -25.20466 z m 33.83307,39.75416 v 25.20467 h 7.44296 v -25.20467 z" /> id="path814" />
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

76
public/img/icon-thumb.svg Normal file
View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 132.29197 132.29167"
version="1.1"
id="svg1303"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="icon_thumb.svg">
<defs
id="defs1297" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.5046797"
inkscape:cx="35.718548"
inkscape:cy="203.39339"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="80.99058,65.965029"
orientation="0,1"
id="guide816"
inkscape:locked="false" />
<sodipodi:guide
position="65.965178,49.107299"
orientation="1,0"
id="guide818"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata1300">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-164.70764)">
<path
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
d="m 72.35681,178.12175 c -0.545876,-0.0192 -1.121779,0.0192 -1.729242,0.12259 -12.959134,2.14891 4.226681,21.04642 -10.867262,31.83193 -12.617074,10.52505 -17.206737,7.22264 -17.332488,10.67172 v 33.88171 c 1.891308,5.00813 14.483922,10.12847 27.868234,11.21944 13.384309,1.09096 32.098988,-1.73801 32.305468,-7.56421 0.10989,-5.27572 -2.896223,-5.39662 -2.896223,-5.39662 0,0 6.589043,-0.40752 6.808883,-6.12278 0.10966,-5.60545 -6.38265,-6.40691 -6.38265,-6.40691 0,0 8.31589,-0.23607 8.31589,-6.01832 0,-5.91485 -6.39662,-6.38072 -8.37539,-6.48104 1.22776,-0.0747 6.07353,-1.75141 6.04505,-7.59582 -0.0287,-6.03384 -9.280896,-5.53597 -25.919173,-6.63279 1.919791,-11.19377 3.258461,-35.14851 -7.841097,-35.50894 z m -45.69253,38.36631 c -1.562226,0 -2.819733,1.04793 -2.819733,2.34979 v 38.25943 c 0,1.30191 1.257507,2.34983 2.819733,2.34983 h 10.526021 c 1.562231,0 2.819739,-1.04792 2.819739,-2.34983 v -38.25943 c 0,-1.30186 -1.257508,-2.34979 -2.819739,-2.34979 z"
id="rect1278"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 212 KiB

View File

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

148
public/js/cast-videos.js Normal file
View File

@ -0,0 +1,148 @@
function initializeCastApi() {
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID, // Use built in reciver app on cast device, see https://developers.google.com/cast/docs/styled_receiver if you want to be able to add a theme, splash screen or watermark. Has a $5 one time fee.
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);
// Add event listerner to check if a connection to a cast device is initiated
playerController.addEventListener(
cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
castConnectionChange(player)
}
);
playerController.addEventListener(
cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, function() {
castVideoProgress(player)
}
);
playerController.addEventListener(
cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function() {
castVideoPaused(player)
}
);
}
function castConnectionChange(player) {
// If cast connection is initialized start cast
if (player.isConnected) {
// console.log("Cast Connected.");
castStart();
} else if (!player.isConnected) {
// console.log("Cast Disconnected.");
}
}
function castVideoProgress(player) {
var videoId = getVideoPlayerVideoId();
if (player.mediaInfo.contentId.includes(videoId)) {
var currentTime = player.currentTime;
var duration = player.duration;
if ((currentTime % 10) <= 1.0 && currentTime != 0 && duration != 0) { // Check progress every 10 seconds or else progress is checked a few times a second
postVideoProgress(videoId, currentTime);
setProgressBar(videoId, currentTime, duration);
if (!getVideoPlayerWatchStatus()) { // Check if video is already marked as watched
if (watchedThreshold(currentTime, duration)) {
isWatched(videoId);
}
}
}
}
}
function castVideoPaused(player) {
var videoId = getVideoPlayerVideoId();
var currentTime = player.currentTime;
var duration = player.duration;
if (player.mediaInfo != null) {
if (player.mediaInfo.contentId.includes(videoId)) {
if (currentTime != 0 && duration != 0) {
postVideoProgress(videoId, currentTime);
}
}
}
}
function castStart() {
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
// Check if there is already media playing on the cast target to prevent recasting on page reload or switching to another video page
if (!castSession.getMediaSession()) {
var videoId = getVideoPlayerVideoId();
var videoData = getVideoData(videoId);
var contentId = getURL() + videoData.data.media_url;
var contentTitle = videoData.data.title;
var contentImage = getURL() + videoData.data.vid_thumb_url;
contentType = 'video/mp4'; // Set content type, only videos right now so it is hard coded
contentCurrentTime = getVideoPlayerCurrentTime(); // Get video's current position
contentActiveSubtitle = [];
// Check if a subtitle is turned on.
for (var i = 0; i < getVideoPlayer().textTracks.length; i++) {
if (getVideoPlayer().textTracks[i].mode == "showing") {
contentActiveSubtitle =[i + 1];
}
}
contentSubtitles = [];
var videoSubtitles = videoData.data.subtitles; // Array of subtitles
if (typeof(videoSubtitles) != 'undefined' && videoData.config.downloads.subtitle) {
for (var i = 0; i < videoSubtitles.length; i++) {
subtitle = new chrome.cast.media.Track(i, chrome.cast.media.TrackType.TEXT);
subtitle.trackContentId = videoSubtitles[i].media_url;
subtitle.trackContentType = 'text/vtt';
subtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
subtitle.name = videoSubtitles[i].name;
subtitle.language = videoSubtitles[i].lang;
subtitle.customData = null;
contentSubtitles.push(subtitle);
}
}
mediaInfo = new chrome.cast.media.MediaInfo(contentId, contentType); // Create MediaInfo var that contains url and content type
// mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; // Set type of stream, BUFFERED, LIVE, OTHER
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); // Create metadata var and add it to MediaInfo
mediaInfo.metadata.title = contentTitle.replace("&amp;", "&"); // Set the video title
mediaInfo.metadata.images = [new chrome.cast.Image(contentImage)]; // Set the video thumbnail
// mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
mediaInfo.tracks = contentSubtitles;
var request = new chrome.cast.media.LoadRequest(mediaInfo); // Create request with the previously set MediaInfo.
// request.queueData = new chrome.cast.media.QueueData(); // See https://developers.google.com/cast/docs/reference/web_sender/chrome.cast.media.QueueData for playlist support.
request.currentTime = shiftCurrentTime(contentCurrentTime); // Set video start position based on the browser video position
request.activeTrackIds = contentActiveSubtitle; // Set active subtitle based on video player
// request.autoplay = false; // Set content to auto play, true by default
castSession.loadMedia(request).then(
function() {
castSuccessful();
},
function() {
castFailed(errorCode);
}
); // Send request to cast device
}
}
function shiftCurrentTime(contentCurrentTime) { // Shift media back 3 seconds to prevent missing some of the content
if (contentCurrentTime > 5) {
return(contentCurrentTime - 3);
} else {
return(0);
}
}
function castSuccessful() {
// console.log('Cast Successful.');
getVideoPlayer().pause(); // Pause browser video on successful cast
}
function castFailed(errorCode) {
console.log('Error code: ' + errorCode);
}
window['__onGCastApiAvailable'] = function(isAvailable) {
if (isAvailable) {
initializeCastApi();
}
}

Some files were not shown because too many files have changed in this diff Show More