* Add option to use existing Media Profile as template for new profile
* Forgot to commit the edit form too
* Reset deletion mark on Source controller
* Add test for new preload profile feature
* mix check
* [WIP] started on source deletion
* Removed unneeded test blocks
* Added marked_for_deletion_at to sources and media profiles
* Hooked up async deletion to media profiles as well
* 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
* [WIP] renamed current settings module and tables to have backup suffix
* Created new settings table, schema, and context
* Migrated from old settings module to new one
* Removed settings backup modules
* Added some tests and docs
* Add media profile presets (#85)
* Added presets for output templates
* Added presets for the entire media profile form
* Append `-thumb` to thumbnails when downloading (#87)
* Appended -thumb to thumbnails when downloading
* Added code to compensate for yt-dlp bug
* Squash all the commits from the other branch bc I broke things (#88)
* Adds a basic settings model
* Added more settings methods; Hooked up initial settings runner to app boot
* Update onboarding flow to use settings model instead of session data
* Removed collection_type user input instead inferring from yt-dlp response
* Updated docs
* Added delete buttons for source; Refactored the way deletion methods work
* Update source to always run an initial index
* Added deletion to the last models
* Improved clarity around deletion operation
* Improved task fetching and deletion methods
* More tests
* Added scratchpad dir
* Installed Alpine
* [WIP] began integrating Tailwind and accompanying theme
* [WIP] Set up basic views for sources
* Adds new UI to media profiles page
* Removes unneeded view
* 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