* [Unrelated] updated module name for existing liveview module
* Updated toggle component and moved MP index table to a liveview
* [WIP] reverted MP index table; added source count to MP index
* Moved new live table to sources index
* Added 'enabled' boolean to sources
* Got 'enabled' logic working re: downloading pending media
* Updated sources context to do the right thing when a source is updated
* Docs and tests
* Updated slow indexing to maintain its old schedule if re-enabled
* Hooked up the enabled toggle to the sources page
* [Unrelated] added direct links to various tabs on the sources table
* More tests
* Removed unneeded guard in
* Removed outdated comment
* [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
* [WIP] Got query kinda working, now to refactor other queries
* Refactored all query methods to use dynamic snippets
* Refactored tab layout to grab tabs by name
* Removed standalone show buttons from in-app tables
* Removed unneeded comment
* 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
* Hooked up series directory finding to source metadata runner
* Fixed aired NFO tag for episodes
* Updated MI NFO builder to take in a filepath
* Hooked up NFO generation to the source worker
* Added NFO controls to form
* Improved the way the source metadata worker updates the source
* Consolidated NFO selection options in media profile instead of source
* 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)
* Added new uploaded_at column to media items
* Updated indexer to pull upload date
* Updates media item creation to update on conflict
* Added download cutoff date to sources
* Applies cutoff date logic to pending media logic
* Updated docs
* Made method to getting singular media details; Renamed other related method
* Takes a fun and flirty digression to remove abstractions around yt-dlp since I'm 100% committed to using it exclusively
* Removed commented test code
* Lays the groundwork for fast indexing
* Added module for working with youtube RSS feed
* Added methods to kick off indexing workers from RSS response
* Improve short detection (#59)
* Made media attribute-related yt-dlp calls return a struct
* Added shorts attribute to media items
* Added ability to discern a short from yt-dlp response
* Updated search to use new shorts attribute
* Fast index UI (#63)
* Added fast_index field and adds it to source form
* Added fast indexing to source changeset operations
* Added fast indexing worker and updated other modules to start using it
* Handled fast index worker on source update
* Add support modals (#65)
* Added fast indexing upgrade modal
* Improved modal on smaller screens
* Updated links to work again
* Added donation modal
* Reverted source fast index to 15 minutes
* Removed unneeded HTML attributes from old alpine approach
* Updated download options to take a media item; allowed for specifying custom output path template options
* Fixed bug where indexing job wouldn't run for the first time
* Renamed friendly_name to custom_name
* Added new options to default template and UI
* Improved explainer UI
* Updated config path to specify metadata storage path
* Removed metadata column from DB, replacing it with filepath columns
* Updated app to store compressed metadata; automatically download thumbnails
* Ensured metadata is deleted when other files are deleted
* Updated docs
* Added inets to application start so http calls work in prod
* Updated project to use sqlite
* Edited migrations directly because I fear no man
* Updated search functions and tests to work with sqlite
* Updated build tools to remove postgres
* Added method for deleting media files and their content
* Adds controllers and methods for deleting media and files
* Improved tmpfile setup and teardown for tests
* Actually got tmpfile cleanup running once per suite run
* Finally fixed flash messages
* 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
* Adds options + option builder + metadata parsing for media thumbnails
* Added release-type options to media profile; built option parser for indexing operations
* Added new media_profile options to creation form; made show helper for rendering database items
* Added options for downloading/embedding metadata
* Adds option on sources to not download media (index only)
* reformatted docs
* [WIP] updated the output of VideoCollection to include playlists
* Updated source's name to collection_name; supported playlist ID/name fetching
* Hooked up collection_type to form; refactored enqueue_pending_media_downloads
* Added friendly_name to form
* Added media profile link to source view
* Updates comment
* Ensure channel detail lookup doesn't download the video - oops
* Ran the needful migrations for replacing channels with sources
* got media source test back working
* channel tasks test
* Media indexing worker test
* media tests
* Got all tests working except controller tests
* got all tests working
* Renamed Channel struct to Source
* renamed ChannelTasks
* More renaming; renamed channel details module
* Removed Channel yt-dlp module, instead throwing things in the VideoCollection module
* Renamed what looks like the last of the outstanding data
* Added subtitle options to media profile model
* Updated media profile form
* Adds subtitle-based options in options builder
* Updates metadata parser to include subtitles
* Adds subtitle_filepaths to media_item
* renamed video_filepath to media_filepath
* Added more fields to media profile show page
* 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