Releases: BluABK/sane-subfeed
Releases · BluABK/sane-subfeed
v0.6.2 (Further VideoTile redesign)
v0.6.2 Changelog
- Made sd warn and has-captions overlays optional (and made sd warning False by default due to recently buggy API data).
- Changed Function menu alt-key from F to u (overlapped with File menu).
- Shuffled around various settings to lessen a wasteful amount of tabs.
- Moved datestamp settings to its own Time & Date tab.
- Update text ellision values to work with the VideoTile redesign.
- Made config.ini only contain overrides instead of mirroring all defaults.
- Created (and added to UI) a FontPickerButton which lets users pick fonts and displays the current font in a
human readable format on the button. - Changed default Fonts from Helvetica to Noto Sans (likely the same font)
- Made all font read_config entries non-literal eval (i.e. read as string).
- Added utils function for checking if a string contains unicode.
- Removed size limit from TextPickleType due to lack of support.
- PostgreSQL doesn't seem to support strings with any length limit at all.
- Added some if coverage in debug tile colouring.
- ElidedLabel is now aligned to top and added spacer between thumb and title.
- Removed redundant (and also problematic) layout alignments.
- Removed maximum height sizing logic from VideoTile.
- Made Title, Channel and Date text fields optional if cfg lines == 0.
- Changed VideoTile sizing from fixed size to fixed width and max height.
- Changed ThumbnailTile sizing from fixed size to minimum width (scaled).
- Refactor renamed (and moved) VideoTileLabel to ElidedLabel.
- Changed start with stored videos to True by default.
- Changed VideoTileLabel font handling from plaintext to QFont.fromString.
- Added accidentally omitted config hotkey to defaults and sample config.
- Fixed critical DB creation failure bug introduced in commit 2da05b2 (Caused by IDE refactor move).
- Made PyYAML dependency in requirements.txt >= instead of ==.
- Made sample cfg/hotkeys if not exist use the new create_config_file function.
- Replaced copyfile(sample, cfg) with func that uses DEFAULTS dict directly.
- Made log_handler automatically create missing dirs and files.
- Made PyQt5 pip requirements >= instead of forcing specific version.
- Renamed subs list reload item, so it's harder to confuse with subfeed refresh.
- Hotfix: disabled elision by default and instead explicitly using it during init only, due to VideoTileLabel.width()
changing drastically later on. - Deleted deprecated debug_functions and cli arg --debug_open_1k_fds that was used for "too many file descriptors"
debugging. - Moved log_handler into handlers package.
- Moved plaintext_history_handler into handlers package.
- Moved default_application_handler into handlers package.
- Made pickle load callers handle and log ModuleNotFound (happens when restructuring) and unexpected exceptions.
- Moved more path constants out of classes and into absolute_paths.
- Moved misplaced logdir up to the project root level (was in sources root).
- Refactored lots of manual OS_PATH cases to use absolute_paths instead.
- Fixed config_handler OS_PATH pointing at wrong level after move.
- Fixed orphaned settings import of ROOT_PATH in main_window (due to abs path move).
- Moved history_handler into handlers package and renamed with suffix 'plaintext'.
- Moved config_handler into handlers package.
- Moved pickle_handler into handlers package.
- Moved (Youtube auth) generate_keys into youtube folder.
- Moved (YouTube API) authentication into youtube folder.
- Removed deprecated show_grab_method debug option and code.
- Made Title, Channel and Date VideoTile labels part of a class VideoTileLabel to avoid excessively redundant code.
v0.6.1 release (VideoTile rework)
Bumping to v0.6.1 already due to v0.6.0 having a pretty bad bug with font sizing/ellisson and this VideoTile rework is far better than what was previously. Elements should behave sanely now and there's no longer any need for setting pixel size and other hacks of that nature.
v0.6.1 Changelog
- Removed no longer necessary pixel size hacks from config.
- Made VideoTile element line height configurable.
- Reworked VideoTile element QLabel ellison logic; QLabel width * modifier (0.28) * lines.
- Reworked VideoTile element QLabel height logic; Set height equal to line amount and add some newline
spacing for unicode. - Changed VideoTile layout from VBox to Grid, because grid is not plagued by forced padding between all items.
- Changed broken update_font to an elide_text function and made VideoTile classes override setText to make ellison
default.
v0.6.0 release
Changelog:
- Added attrib original_text in VideoTile elements to save the unedited text before ellison overwrites it forever.
- Tuned all the pixel size, ellison and max size values to work with the new VideoTime system.
- Made all the new max size and ellison settings configurable.
- Fixed ellison inconsistency and mismatch issues by creating a function get_unicode_weight which calculates a
"width-weight" for unicode characters, and then that weight is subtracted from the ellison modifier. - Changed VideoTile sizing logic to use a maximum size instead of fixed size, which fixed the issue with QLabel text
going OOB. - Added debug tile coloring for padding debug.
- Made channel title and date text pixel size configurable
- Made title text weight configurable (Normal, DemiBold, Bold).
- Merged configurable database type and location into one single option 'url'.
- Fixed bug where timestamp wouldn't show the correct level, due to accidentally being offset by 1.
- Made config inform about which options require restart. Also: rearranged some options.
- Fixed broken thumbnail tooltip feature.
- Moved get_default_player from playback to super (VideoTile).
- Cleaned up keyboard modifiers code a bit.
- Fixed bad function signatures.
- Made player an optional kwarg in open_in_player()
- Refactored some strings.
- Deprecated and deleted config_play_video function.
- Made Subfeed context menu options on par with Playback's (alt players etc, mark watched, play w/o mark watched, etc...).
- Fixed buggy implementation of mousePressEvent in Subfeed that listened to all mouse events, not just LeftButton (whoops!).
- Added Playback's MidButton decrease_prio/mark_downloaded functionality to Subfeed.
- Created a function open_in_browser that properly opens a url in the web browser.
- Added some pydoc here and there.
- Made open_in_player compatible with being served URLs as well as file paths.
- Deprecated and deleted 'use_url_as_path' config hotfix.
- Added "restart may be required" signifier to config options w/o bindings.
- Fixed bug where timedelta years weren't subtracted by 10 when showing decades.
- Made youtube-dl an optional dependency, and removed tqdm entirely.
- Added in stock BreezeStyleSheets and made them load instead of the windows modded ones if you're on Linux. Also added
a missing README.md. - Added toolbar icon size modifier for use on High DPI displays.
- Implemented actions and kwargs bindings in GenericLineEdit.
- Tweaked Elided text modifier for video title to perfection (if text is bolded or otherwise it will cut off a little
sooner than this perfection, but that's why it's been made user configurable). - Explicitly set progress bars to blue instead of assuming it would be the default (varies with QStyle and QPalette).
- Fixed issue #5 (Launched players would quit along with Sane) by pre-pending 'nohup' to Popen arguments (if Linux).
- Changed timedelta formatting delimiter from % to $ due to shortcomings in ConfigParser (%% is an escaped percent sign,
so config parser finds it, but it doesn't actually do anything, but % isn't a valid string interpolation. so it fails. - Made video uploaded timedelta format customisable, and changed to use relativedelta with a string.Template to have
strftime-esque formatting (it only allows for [a-z], so had to go with repeating letters instead of dash. - Made GridView elided text values customisable.
- Fixed GridView text bleeding out of frame (length-wise, height cut-off issue is still unresolved).
- Made elided title text modifier customisable and moved out of place 'title pixel size' item in ConfigView.
- Removed mysterious hide_downloaded setting from GUI config (and MainWindowListener) that seemingly did nothing.
- Fixed bug where despawned Central Widgets were not respawning properly, leading it segfaults.
- Config checkboxes now support multiple functions where some don't have kwargs.
- Toggle for playback and download feature and debug mode now toggles the menubar and toolbar items as well.
- Created function to respawn menubar and toolbar in MainWindow (useful when config has changed to reflect hiding items)
- Extended GenericConfigCheckBox's function(**kwargs) capability to include lists of functions (and/or lists of kwargs).
- Added functionality for tabs to be inserted at their predetermined position instead of at end of row, and made it the
default. - Made Debug tab in ConfigView spawn and despawn when enable Debug option is checked/unchecked.
- Made Download tab in ConfigView spawn and despawn when enable PlaybackView option is checked/unchecked.
- Implemented ability for GenericConfigCheckBox to take checked/unchecked action functions and kwargs.
- Split ConfigView's populate_options into one function per tab, which allows for more fine grained adding/populating
in future. - Moved settings for enabling debug mode and GUI to a new "Advanced" tab in ConfigView.
- Made "Download" tab not show on startup if Playback view is disabled.
- Created del_tab and add_tab (and refactored add_tabs accordingly) in ConfigViewTabs.
- Moved Views to their own "Views" tab in ConfigView.
- Removed obsolete tab_id kwarg from InputSuper (ConfigView).
- Mask database location from being written to generated sample config.
- Made Database type and location customisable from config (default type: sqlite).
- Sample configuration files are now generated if none already exist.
- Fixed issue with log-to-file feature spawning a new file handler instance for each create_logger() call
(3000+ file descriptors). - Made Left mouse button action remappable (a little stop-gap pending full implementation of hotkeys, default: open in
default web browser) - Made Playback view (and implicitly downloading features) optional (default: disabled).
- Fixed bug that prevented QtWidget styles in Window->Theme->Style from working at all.
- Made DownloadView able to retry/re-add failed downloads.
- Made video download logic able to emit failed download signals to DownloadView and set info accordingly.
- Made downloader properly report and set failed download status to failed on pesky SSL Handshake errors (Errno 0).
- Updated MainWindow's confirmation_dialog function to make all args but message and action optional.
- Removed debug logging for unfinished downloads when clear finished downloads button is pressed.
- Made config text input fields actually set the the text variable to current config instead of just showing a
placeholder while text variable was Null (could potentially have lead to issues down the line) - Made config text input fields save-as-you-type instead of unintuitively requiring user to hit the return key.
- Added config option to adjust thumbnail tile overlay width and height
(NB: If you have enabled force AR width won't change) - Fixed bug where SaneInputDialog didn't auto close after OK was clicked.
- Added startup choice between build API key and oauth from string or load from file
- Updated startup checks to send in a cancel_action instead of needing to carry around (and update) two boolean
variables for whether or not public files were used. - Made it possible to bind actions to cancel button on SaneConfirmationDialog
- Implemented an init_ui() in SaneDialog, giving it new purpose.
- Made essential Sane{Confirmation,}Dialog args normal instead of kwarg
v0.5.1 release
- Made OAuth2 AppFlow run local server and open in browser when using GUI. This should entirely rid us of needing access to a console \o/
- Made application a bit more robust when tackling OAuth failures, be it aborted auth or missing files.
- Moved API Key/OAuth file exists logic to MainWindow and made it a pop-up. In the case of a missing key or client secret file, the user will from now on be prompted from GUI about whether they want to load their own or use the public set (NB: prone to exceeded quota).
- Made it possible again to run CLI commands without GUI, using the --no_gui flag.
- Added option for doing a single refresh and print of subfeed with --refresh_and_print_subfeed
- Made all icon constant variables in MainWindow default to the light version, to avoid false positive "NoneType" warnings in code.
- Changed Configuration pop-out window to a CentralWidget/View and added it to toolbar.
- Renamed all instances of "preferences" (both in code and files) to "config" to make it less confusing as the class itself is called ConfigView.
- Added --print_playlist_items cli option with and optional --print_playlist_items_url_only switch for use in exploding YouTube playlist IDs into individual video items.
- Fixed long lasting "Too many open files" bug caused by thread-unsafe google-api-client httplib2.
v0.5.0 release
- Refomatted CHANGELOG to over exceed 80 char line width
- Changed logging levels for DB to DEBUG6 and DB listener to DEBUG7
- Made geoblock if stmt look up partial match in list instead of exact, which makes it less susceptible to changes in
error message (which happens quite a lot) - Added some debug logging for Issue #36
- Implemented dark-mode icon set to be toggled on/off (Solves Issue #16)
- Muted non-critical KeyError errors about B/s speed in calc_avg_speed
- Refactored geo block if check to use a list of predefined strings
- Handle geo blocked videos that throw "This video is not available."
- Added Pipfile.lock to .gitignore and removed it from git cache (people need to re-run Pipenv lock)
- Added debugging code to arbitrarily open 1000 fds
- Added handling of OSError and other critical or unexpected exceptions in subfeed refresh (too many open files issue)
- Added fail, pause, finish and set_color functionality to ProgressBarListener
- Created a SaneAbortedOperation Exception which can hold other exceptions
- Removed coloured VideoTile logging of "likely vod" cases
- Updated youtube-dl dependency to latest version (fixes broken music video dl, somehow o0)
- Replaced all integer is obj comparisons with == and != across project
- Replaced all video kind obj comparisons with == to fix more potential issues project wide
- Replaced obj comparison with == to fix an issue where VIDEO_KIND_PREMIERE was not correctly evaluated on startup
- Simplified SubfeedGridViewTile contextMenu logic to avoid instability issues
- Commented out debug logging of inserting/deleting GridView items
- Added option to mark/unmark videos as liveBroadcastContent, as well as colouring them
- Cleaned up youtube_requests and removed debug list/search and needle (old debug code)
- Added SubSort section (PlaySort copy) and colouring and pinning of live broadcast content to config files and GUI
- Added confirmation dialog when left-clicking (download action) a non-VOD
- Added Video kind attribute to database
- Made liveBroadcastContent video tiles behave differently to VODs
- Added livestream (live/upcoming) handling and added a video kind attr
- Reduced unnecessary SubFeed tile removal on-download by reloading it before PlayView
- Fixed CVE-2017-18342 (pyaml >= 4.2b1)
- Fixed pesky SubFeed redraw glitch introduced by GridViewListener rewrite
- Added thumbnail overlay functionality to SubFeedView
- Added Downloaded video overlay and darkened bg of Watched overlay so it's not eerily similar to the Discarded overlay
- Created repaint_video(s) and singular redraw_video functions and split VideoTile setPixmap into own function:
set_thumbnail_pixmap - Fixed accidental removal of already existing video ptr
- Reverted rest of update_grid code to avoid possible ptr issues
- Reverted q_labels_keys_to_delete code to avoid possible ptr issues
- Added some documentation to GridView functions and debug of update_grid
- Added missing return in calc_avg_speed KeyError exception handling.
- Added Handling of 'B/s' cases in determine_si_unit
- Added cli options to print downloaded, discarded and/or watched videos (--print_downloaded_videos,
--print_watched_videos, --print_discarded_videos) - Fixed issue with get_single_video being broken due to referencing the static PlaybackGridViewListener instead of the
instantiated one from MainModel (more listener rewrite bugs) - Fixed all issues with tile glitchyness (introduced by listener rewrite) both when showing and not showing videos that
are watched/discarded/downloaded. Videos will only be hidden/unhidden if the respective watched/discarded/downloaded
option is False, in the case of those options the video will skip hide/unhide calls and just do the redraw. - Fixed issue with downloaded videos not disappearing from Subfeed
- Obliterated Issue #32 by always passing in a widget_id to hide/unhide functions (deprecates all the messy
"determine which view" code - Moved download and related listeners into PlaybackViewListener and made GridViewListener an inheritable
structure/model - Split GridViewListener into Subfeed and Playback listeners respectively
- Created a Video.str override that prints "channel - title [url]" (allowed for changing all instances of
{} - {} [{}]".format(video.channel_title, video.title, video.url_video) to the more sensible "{}".format(video) - Moved listeners.py listeners into their own files
- Moved DatabaseListener to new listener structure
- Renamed DownloadHandler to DownloadViewListener and structured it
- Removed redundant logging of 404 thumbnails that gets handled by caller
- Fixed broken logic in GridView tile listeners (fixes issues #31 and #32)
- Removed exception hook parsing deprecated by SaneExceptionHandler
- Renamed strangely named 'purl' video file metadata tag to the established standard 'url'
- Deleted deprecated test_file.py from eons past
- Moved MainWindow stuff out of init and into functions; renamed and restructured all the Views, added some missing
pydoc here and there and fixed a lot of stuff in MainWindow in general - Merged pull request #30 from skandix/master (things found in .py files, that obviously need to be fixed)
- Mapped global hotkey Ctrl+Z to undo action
- SaneHistory can now undo prio, watched and discarded actions (created anti-functions for watch,
discard and decrease_watch_prio) - Implemented SaneHistory in QMainWindow and related
- Fixed peculiarities in SaneHistory/SaneHistoryItem's str and log (also fixed bug where entries got removed
even if Exception was raised) - Renamed the old history system to plaintext_history (now legacy, should be removed at a later point)
- Remade SaneGridViewHistory to SaneHistory, and made it a global history.
- Created a SaneGridViewHistory(QObject) for better history control
- Implemented sort-by channel title in Play View (with some FIXME caveats)
- Added average download speed indicator and most common ETA speed indicator (default ticks = 50)
- Removed nonsensical ability to pause a finished download (with no effect, backend)
- Added a started/finished on field to Download View
- Properly implemented duration field in Download view
- Added support for deleting incomplete entries from DownloadView (context menu on the video/item tile)
- Hotfixed issue #28 (Low priority UI Visual Bug)
- Fixed bug where a successful geo block proxy download would be set as failed
- Removed useless "pause/resume" context menu from finished downloads
- Made Download view progress bar say "Postprocessing..." during mux (and optionally postprocessing) stage
- Fixed issue with Total size only showing audio track size on finished download.
- Added paused and failed status to ProgressBar Status field (WIP: failed not yet handled anywhere)
- Made youtube_dl_handler detect and report failed downloads (WIP: Not yet handled anywhere)
- Changed to a saner colour scheme (darker variety)
- Made DownloadView and ProgressBar handle paused videos + misc small stuff
- Recoded sane_try to take a func parameter and apply args and kwargs on it
- Added option to display all exceptions in GUI dialogs (useful for testing/debug)
- Made Sane able to display exceptions in GUI using the SaneTextViewDialog
- Made MainWindow use the new SaneExceptionHandler and added necessary functions
- Created a SaneExceptionHandler(QObject) and made the cli.py hook legacy.
- Created an exceptions list that the sys_excepthook appends to so others can poll it for exceptions
- Created an exception_pyqt_slot that wraps the pyqtSlot in order to handle backend Exceptions in frontend (very WIP)
- Added a debug menu with some subitems that raises generic Exceptions
- Fixed startup failures caused by missing {clients_secret,keys}.json by copying over public no no custom keys/secret
exists - Fixed CVE-2018-18074 by updating 'requests' dependency to >=2.20.0
- Removed leftover PlayView ThumbnailTile debug.
- Added a big red SD definition indicator at top left of video thumbs to make it easier to spot still-processing
(youtube's end) videos - Added cli option --print_subscriptions to print subscriptions (from DB) and quit.
- Reclassified Database logging from DEBUG to DEBUG5 and DEBUG4 in order to make it easier to filter out DB logging
when it's not relevant (it's raaather spammy) - Added more logging levels (DEBUG2-5) and pydoc
- Fixed false-positive bug in thumbnail matching for YouTube 404 image in cases the check shouldn't be run.
- Make "Initializing UI" info logging a bit less vague by specifying who logged it
- Added has_captions overlay to thumbnail tile (where applicable) and re-aligned duration position
- Fixed headache-inducing bug where an if test for None also reacted to False
- Added checks in write_operations for videos missing the newly implemented extra video info columns (helps with
backwards compatibility) - Added new video DB extra video info columns
- Removed video response logging debug
- Fixed bug in yt_duration_to_timedeltat() regex that failed matching durations with hours
- Fixed broken bool input validation in boolify_string()
- Fixed issue #26 by making MainWindow omit the 'Manual dir search' submenu if yt_file_path is unset in config.
- Handle regionRestrictions not always existing in YouTube API contentDetails resource
- Added extra video info properties (has_caption, dimension, definition, projection, region_restriction_allowed,
region_restriction_blocked) to Video object and Database - Fixed duration check accidentally setting has_captions property on videos and actually implement has_caption
- Add forced garbage collection at end of refresh_videos() to combat "Too many open files" bug
- Added logging of 'ulimit -a' on Linux to debug "Too many open files" bug
- Removed debug log spam from on_any_event in dir_handler and add info logging to on_moved and on_created
- Made (G...
Release v0.4.1
- Made MainWindow read hotkeys from ini file instead of using hardcoded ones
- Fixed bug where hotkeys parser read the wrong ini file
- "Download video by URL/ID" now handles URLs with '&' params
- Changed SaneInputDialog from QInputDialog to QDialog and added support for QValidator
- Added info about log level 1 (Enable all) in ConfigView
- Removed deprecated config.ini file/gui mismatch check
- Fixed white text on white background tooltip issue in breeze light theme
- Changed various config defaults for GUI
- Video duration is now displayed on thumbnail tiles
- Renamed functions from *filename to *filepath where applicable, and made filepath function os.path.join its return value and send paths - not names - to SaneFFmpegMergerPP
- Split output filename detection into functions and created a new one for finding incomplete downloads
- Made SaneFFmpegMergerPP attempt merge as follows: 1. Attempt to encode audio to aac, 2. Attempt to encode video to h264 or 3. Encode both audio and video to above formats (worst case scenario)
- Added handling of incompatible container audio and video stream muxing (mostly MP4) where youtube_dl would just die to an unhandled Exception
- Made SaneFFmpegPostProcessor use config.ini options instead of youtube_dl's _downloader.params
- Added postprocessing section and options to config files and gui
- Forked own version of youtube_dl's ffmpeg.py to override some hardcoded stuff