* Added last_error to media item table
* Error messages are now persisted to the last_error field
* Minor layout updates
* Added help tooltip to source content view
* Added error information to homepage tables
* Remove unneeded index
* Added docs to tooltip component
* Added sleep interval to settings
* Added new sleep setting to yt-dlp runner and added tests
* Added setting for form; updated setting name
* Updated form label
* Prevented saving/updating of media items if being throttled by youtube
* Added the bot message to the list of non-retryable errors
* Fixed typo
* [WIP] renamed and migrated upload_date column
* Refactored yt-dlp media module
* Refactored parse_upload_date
* Refactored media item upload_date_index
* Got media tests running
* Refactored media item table live
* Cleaned up the stragglers
* Fixed old oversight re: original_url
* Namespaced notification modules under lifecycle
* Added a JSON encoder for all the main model types
* Added startup task to create user script file
* Hook up user script event to media download
* Hooked up media deletion user script
* Added jq to docker deps
* Updated README
* Properly escaped NFO file contents
* Added an NFO backfill worker
* Added a try-catch to the backfill since I _really_ don't want failures to halt app boot
* Add media streaming (#108)
* [WIP] set up streaming route
* Added UUID to sources and media items
* Added media preview to MI show page
* Added plug to strip file extensions
* [VERY WIP] basic podcast RSS setup
* [WIP] got basic podcast RSS working
* [WIP] more expanding on RSS
* Comment
* [WIP] Working on refactoring feed
* Added UUID backfill to a migration
* [WIP] Moar refactoring
* [WIP] Adding UI for getting RSS feed
* Many tests
* Added conditional routing for feed URLs
* Removed the need for url_base to be set
* Updated preset name
* Rendered certain fields HTML-safe; Added logging to confirm range request support
* Fixed incorrect scheme issue
* Updated env var
* Updated other UI to use dropdown
* removed commented code
* Generate rss feeds (#123)
* Added plug to strip file extensions
* [VERY WIP] basic podcast RSS setup
* [WIP] got basic podcast RSS working
* [WIP] more expanding on RSS
* [WIP] Working on refactoring feed
* Added UUID backfill to a migration
* [WIP] Moar refactoring
* [WIP] Adding UI for getting RSS feed
* Many tests
* Added conditional routing for feed URLs
* Removed the need for url_base to be set
* Updated preset name
* Rendered certain fields HTML-safe; Added logging to confirm range request support
* Fixed incorrect scheme issue
* Updated env var
* Updated other UI to use dropdown
* removed commented code
* docs
* Added unique index to UUID fields
* [WIP] break out a few contexts, start refactoring fast index modules
* [WIP] more contexts, this time around slow indexing and downloads
* [WIP] got all tests passing
* [WIP] Added moduledocs
* Built a genserver to rename old jobs on boot
* Added a module naming check; moved things around
* Fixed specs
* Adds description to media items; hooks it up to indexing/media downloading
* Added a search method using postgres fulltext search
* Hooked up search functionality to the search form
* Added persistence to the search form when on search page
* Bumped up the line length because I fear no man
* Refactored indexing
Previously, indexing worked by collecting the video IDs of only videos
that matched indexing criteria. This new model instead stores ALL videos
for a given source, but will only _download_ videos that meet that criteria.
This lets us backfill without indexing, makes it easier to add in other
backends, lets us download one-off videos for a source that don't quite
meet criteria, you name it.
* Updated media finders to respect format filters; Added credo file
* Updated package.json (and made an excuse to make a branch)
* Video filepath parser (#6)
* Restructured files; Added parser placeholder
* More restructuring
* Added basic parser for hydrating template strings
* Improved docs
* More docs
* Initial implementation of media profiles (#7)
* [WIP] Added basic video download method
* [WIP] Very-WIP first steps at parsing options and downloading
* Made my options safe by default and removed special safe versions
* Ran html generator for mediaprofile model - leaving as-is for now
* Addressed a bunch of TODO comments
* Add "channel" type Media Source (#8)
* [WIP] Working on fetching channel metadata in yt-dlp backend
* Finished first draft of methods to do with querying channels
* Renamed CommandRunnerMock to have a more descriptive name
* Ran the phx generator for the channel model
* Renamed Downloader namespace to MediaClient
* [WIP] saving before attempting LiveView
* LiveView did not work out but here's a working controller how about
* Index a channel (#9)
* Ran a MediaItem generator; Reformatted to my liking
* [WIP] added basic index function
* setup oban
* Added basic Oban job for indexing
* Added in workers for indexing; hooked them into record creation flow
* Added a task model with a phx generator
* Tied together tasks with jobs and channels
* Download indexed videos (#10)
* Clarified documentation
* more comments
* [WIP] hooked up basic video downloading; starting work on metadata
* Added metadata model and parsing
Adding the metadata model made me realize that, in many cases, yt-dlp
returns undesired input in stdout, breaking parsing. In order to get
the metadata model working, I had to change the way in which the app
interacts with yt-dlp. Now, output is written as a file to disk which
is immediately re-read and returned.
* Added tests for video download worker
* Hooked up video downloading to the channel indexing pipeline
* Adds tasks for media items
* Updated video metadata parser to extract the title
* Ran linting