Tags: abhiTronix/vidgear
Tags
🎉 Release VidGear Stable v0.3.5 [#451] ### New Features * ✨ **FFGear API:** * Introduced a brand-new high-performance, multi-threaded video decoding Gear built on top of DeFFcode's `FFdecoder` API. * Supports real-time FFmpeg subprocess pipelines, low-overhead hardware-accelerated decoding (e.g., CUDA/NVDEC), flexible pixel format conversions, and asynchronous per-frame metadata extraction. * Includes dedicated parameters: `source_demuxer`, `frame_format`, `custom_ffmpeg`, and `extract_metadata`. * ⚡️ **Unified Backend Selection (`Backend` Enum):** * Introduced a unified `api` parameter accepting a new `Backend` enum (`Backend.CAMGEAR`, `Backend.PIGEAR`, `Backend.FFGEAR`) across `VideoGear`, `WebGear`, `WebGear_RTC`, and `NetGear_Async`. * Replaces the legacy `enablePiCamera` boolean flag with a clean, explicit enumeration-based backend selection. * ⚡️ **Plugin-Ready Stabilizer Architecture:** * Refactored the monolithic `Stabilizer` class into a plugin-style `stabilizer/` sub-package with a shared `_StabilizerBase`, an `ASWStabilizer` implementation, and a factory `Stabilizer()` function. * Added a new `StabilizerMode` enum for selecting stabilization backends via `VideoGear`'s `STABILIZER_MODE` option, with clean provisions for upcoming real-time backends (e.g., Kalman tracking). * 🚩 **WriteGear: Discard `-vcodec` via `None`:** * Setting `-vcodec` or `-c:v` to `None` in `output_params` now cleanly omits the video codec parameter, letting FFmpeg auto-select the encoder (useful for GIF output and similar workflows). * 📦️ **Poetry Package Management:** * Added an official Poetry installation guide and ecosystem support for Poetry-managed environments. ### Updates/Improvements * **Packaging Infrastructure Modernization:** * Migrated build and metadata configurations from legacy `setup.py`/`setup.cfg` to modern `pyproject.toml` configuration standards. * Switched to automatic package discovery via setuptools, excluding tests and docs from distribution builds. * **Toolchain Overhaul (Ruff Migration):** * Completely replaced `flake8` and `black` with `ruff` for unified, high-speed linting and formatting across the entire codebase. * **Type Hint Modernization:** * Systematically updated type hints to leverage native Python 3.10+ structures, including PEP 604 union types (`X | Y`) and built-in collection generics. * **PEP 561 Compliance:** * Added a `py.typed` marker file so external type checkers (e.g., `pyright`, `mypy`) properly recognize VidGear as an inline-typed package. * **CamGear YouTube Backend Refactor:** * Extracted `YT_backend` into a dedicated `yt_backend` module for cleaner separation of concerns and improved maintainability. * **Asyncio CLI Updates:** * Replaced boolean string arguments with proper `store_true` flags for `-S`, `-yt`, `-l`, and `-ep`. * Added `-a`/`--api` flag for backend selection (`camgear`/`pigear`/`ffgear`) and FFGear-specific arguments (`-sd`, `-ff`, `-cf`). * Marked `--enablePiCamera` as a deprecated CLI flag with a runtime warning. * **CI & Pipeline Enhancements:** * Upgraded AppVeyor CI testing images to Visual Studio 2022 environments. * Integrated path-filtering flags to intelligently skip docs-only CI pipeline runs. * Centralized test utility paths into a shared `vidgear/tests/utils/helpers.py` module. * **Documentation Updates:** * Added comprehensive FFGear documentation: overview, usage examples, advanced guides (CUDA transcoding, camera/screen capture, WriteGear integration), FAQs, and API reference. * Updated `VideoGear`, `WebGear`, `WebGear_RTC`, and `NetGear_Async` docs to reflect the new `Backend` enum API and FFGear backend parameters. * Added `StabilizerMode` usage examples, FAQs, and parameter documentation across all relevant Gears. ### Breaking Updates/Changes * **Deprecated `enablePiCamera`:** * The `enablePiCamera` boolean flag has been officially deprecated across all core capture APIs (`VideoGear`, `WebGear`, `WebGear_RTC`, `NetGear_Async`) in favor of the explicit `api=Backend.PIGEAR` enumeration syntax. * Using the old flag will emit a `DeprecationWarning` at runtime. It will be removed in a future release. ### Bug-fixes * **Stabilizer Memory Leak:** * Fixed a severe memory bottleneck where `self.__transforms` tracking records grew unbounded over the entire runtime duration (O(total_frames) → O(smoothing_radius)), eliminating an out-of-memory hazard for long-running sessions. * **FFGear Metadata Tuple Handling:** * Fixed `read()` to correctly enqueue and return `(frame, metadata)` tuples when `extract_metadata` mode is enabled. * **Helper Utilities:** * Fixed `validate_video` to verify file path existence before processing. * Fixed missing demuxer header handling in `get_supported_demuxers`. * Corrected `StopIteration` handling in default video codec selection logic. * Fixed `IndexError` in `validate_audio` bit-depth parsing by replacing bare `re.findall` indexing with guarded `re.search` and adding a fallback parser for planar sample formats (`fltp`, `s16p`, `u8p`, etc.). * Fixed `get_supported_demuxers` to expand all comma-separated demuxer aliases (e.g. `"matroska,webm"` now yields both entries instead of only the last).
🎉 Released VidGear Stable `v0.3.3` [#411] This update significantly enhances Vidgear's capabilities, ensuring better performance, broader compatibility, and improved user experience. The introduction of the Picamera2 API support, enhanced error handling, and detailed documentation updates are pivotal in making Vidgear more robust and user-friendly. ==================== ### New Features ✨ - **PiGear:** + Official Support for Picamera2 API backend (Fixes #342) * This massive update brings official support for the new Picamera2 API, unlocking powerful features for Raspberry Pi Camera Modules and limited USB camera support. * **Seamless Python wrapper:** A robust wrapper around Picamera2 API library simplifies integration with minimal code changes for existing PiGear users. * **Enhanced camera control:** Leverages libcamera API under the hood for Raspberry Pi Camera Modules. * **Existing compatibility:** Maintains compatibility with PiGear's existing super-charged multi-threaded and colorspace manipulation framework. * **Proper Resource management:** Ensures proper resource release during PiGear termination. * **USB camera support (limited):** Provides basic functionality for USB webcams. PiGear could accurately differentiates between USB and Raspberry Pi cameras using metadata. * **Backward compatibility:** Seamlessly switches to the legacy Picamera library backend if Picamera2 is unavailable. * **Standalone functionalities:** Standalone functionalities for both legacy `picamera` and newer `picamera2` backends for clarity. * **Advanced optional parameters handling:** Handles camera configurational parameters and user-defined settings for various camera types. * **New optional configurational parameters:** Currently Supports "sensor", "format", "controls", "transform", "stride", "buffer_count", and "queue" with sanity checks. Seperated Raspberry Pi camera module exclusive and Unified USB cameras supported optional parameters. * **New user-defined optional parameters:** Such as `auto_align_output_config`, `enable_verbose_logs`, and more. - **StreamGear:** * Introduced new `-enable_force_termination` attribute for immediate FFmpeg process termination. - **Helper:** * Added support for SRTP/RTSPS in `is_valid_url` function (Fixes #410) + Enhanced `is_valid_url` in `helper.py` to recognize and support both `rtsp` and `rtsps` protocols. (Suggested by @jonra1993) + SRTP/RTSPS extends RTSP/RTP to encrypt video and audio data using the same ciphers as HTTPS, typically AES with a 128-bit key length. * Added a custom deprecated decorator to mark deprecated functions and parameters to display a warning message when a deprecated one is used. - **Docs:** * Overhauled mkdocs theme. + Added `unrecognized_links: ignore` to `mkdocs.yml` for validations. + Added custom admonition icons to mkdocs.yml + Added new `git-authors` plugin in mkdocs.yml + Added new tables markdown extension in mkdocs.yml + Added custom fences to `pymdownx.superfences` markdown extension. + Added `line_spans: __span` and `pygments_lang_class: true` parameters to `pymdownx.highlight` markdown extension. + Added `normalize_issue_symbols: true` to `pymdownx.magiclink` markdown extension. + Added new mkdocs feature dependency `mkdocs-git-authors-plugin`. * Added the use of new `-enable_force_termination` parameter. * Added a new FAQ entry about the deprecated `rgb_mode` parameter. * Added new `screengear_error11.png` asset. - **CI:** * Added test cases for `import_dependency_safe` function to validate different scenarios and error handling in `import_dependency_safe`. ### Updates/Improvements ⚡️ - Core: * Improved exception handling for module imports: + Updated `import_dependency_safe` in `helper.py`: * Added specific handling for `ModuleNotFoundError`. * Included original exception in `ImportError` for better error tracing. * Enhanced logging to include exception traceback when error is set to "log". + Enhanced `import_core_dependency` in `__init__.py`: * Added specific handling for `ModuleNotFoundError`. * Included original exception in `ImportError` for better error tracing. * Improved colorspace handling in videocapture gears: + Logged a warning and discarded invalid colorspace values instead of raising an exception. + Consolidated colorspace logging into a single line using a ternary operation. - Asyncio: * Replaced deprecated Starlette's `on_shutdown` parameter with an async context manager `lifespan` in WebGear and WebGear_RTC APIs. (Fixes #397) + Moved shutdown logic for VideoGear and peer RTC connections to this new `lifespan` context manager. + Added new `contextlib` import for using `asynccontextmanager`. - NetGear_Async API: * Modified `__init__` method to handle event loop more robustly: + Try to get the running event loop using `asyncio.get_running_loop()` + If no running event loop found, create a new one with `asyncio.new_event_loop()` + Log if creating a new event loop * Changed launch method to use `self.loop.create_task()` instead of `asyncio.ensure_future()` + Ensures the task is created using the correct event loop instance. * Moved the event loop initialization code to an earlier point before setting event loop policy to ensure it is set up correctly before selecting `WindowsSelectorEventLoop` policy. + On Windows, vidgear requires the `WindowsSelectorEventLoop`, but Python 3.8 and above defaults to the `ProactorEventLoop` which is not compatible. * Removed redundant python version check to set `WindowsSelectorEventLoop` policy, as minimum supported version is already `3.8`. * Move event loop setup and policy assignment to the beginning of `__init__` before zmq Context creation. * Refactored return data handling. - StreamGear: * Updated `close()` methods for handling gracefully signal interruptions based on different operating systems with device audio streams. * Deprecated `terminate()` method, introducing `close()` for safer process termination. * Enhanced stream copy support in Single Source mode (Fixes #396). + Moved settings for "-vf" and "-aspect" inside conditional blocks. + Added warnings and discarded these parameters in stream copy mode. + Ignored stream copy parameter in Real-time Frames Mode or Custom Streams with appropriate warnings. + Updated `-acodec` handling: * Default to `aac` for Custom Streams. * Use stream copy (`-acodec copy`) for input video’s audio when Custom Streams are disabled. + Refined `-livestream` parameter usage to Real-time Frames Mode only. + Adjusted video and audio bitrate assignment to skip when stream copy is enabled. + Improved log message for `-clear_prev_assets` parameter. * Restricted `-livestream` parameter to Real-time Frames Mode only. + Disabled live streaming for video files and updated relevant logging. * Enhanced warning messages and clarified description. - PiGear: * Logging optimization with warning for common `libcamera` messages. * Lowered `framerate` minimum value to `0.0`. * Moved `sensor` optional parameter to commonly supported picamera2 configurational parameters. * Removed unsupported `bit_depth` optional parameters. * Updated PiGear API tagline and introduction. - NetGear: * Enhanced logging and error handling for secure mode. * Logged Authenticator start/stop events. * Handled socket session expiration more gracefully in `recv_handler`. * Ensured proper termination of the ZMQ context and socket when closing the NetGear instance. - WebGear: * Enhanced error messages for WebGear auto-generation workflow (Fixes #403) + Updated `homepage`, `not_found`, and `server_error` methods to include more detailed JSON error messages. + Added specific error and message prefixes to improve clarity. - WebGear_RTC: * Optimized peer connection closure to avoid redundant closures. * Reduced unnecessary logging by only logging ICE connection state changes when they are not in a "failed" state. - WriteGear: * Simplified the logic for formatting output parameters. * Improved error handling in `execute_ffmpeg_cmd` method: + Raised `ValueError` with descriptive messages for `BrokenPipeError` or `IOError`. + Updated error handling per PEP 409 to preserve original exception context or suppress it based on logging settings. - CamGear: * Removed GStreamer support check. * Improved readability of livestream warning logs. - Setup.py: * Dropped legacy picamera dependency in `setup.py`. * Updated setup.py to use the latest `pyzmq` version to address installation issues (Fixes #399). - Helper: * Added patch for substring index bug in `get_supported_demuxers` helper method. * Updated `extract_time` helper function regex to handle milliseconds. - Docs: * Update StreamGear documentation: + Updated documentation to deprecated `terminate()` method, and introducing `close()` for safer process termination. + Improved the overview section's description and wording. + Updated usage examples for both Single-Source Mode and Real-time Frames Mode. + Updated StreamGear usage examples for device audio input. + Refactored sections for Live Streaming usage. * Added warning for unsupported `-livestream` parameter in Single-Source Mode. + Added a tip box on benefits of using stream copy (`-vcodec copy`) for faster HLS/DASH transcoding. * Highlighted limitations of stream copy, including incompatibility with Real-time Frames Mode and Custom Streams. * Clarified automatic audio stream copy (`-acodec copy`) usage with input video’s audio stream. + Updated usage example for device video source. + Addressed deprecation of the `terminate()` method in favor of the new `close()` method. + Updated respective notices for the deprecated `terminate()` method and `rgb_mode` parameter. + Added a deprecation warning admonition for the `rgb_mode` parameter in the `stream()` method. + Removed the obsolete usage example for deprecation RGB mode with StreamGear. + Added documentation and usage of the new `-enable_force_termination` parameter. + Modified the warning message to mention that forced termination can cause corrupted output in certain scenarios. + Updated the docstring for the `stream()` method and `transcode_source()` method. + Refactored the StreamGear API Parameters documentation to enhance clarity and readability. + Refined the description of the `-streams` attribute of the StreamGear API. * Update PiGear documentation: + Added a warning advising users to disable common `libcamera` messages when logging is disabled. + Updated Picamera2 installation instructions _(including `apt`, `pip`, pre-installation on Raspberry Pi images, and compatibility warnings)_ + Moved legacy Picamera library installation instructions to an admonition. + Removed Importing section from overview to avoid confusion. * Update NetGear documentation: + Added Admonition for warning users about the Client's end must run before the Server's end to establish a secure connection in Secure Mode. + Added warning log for potential issues with `flag=1` (NOBLOCK). (Fixes #390) * Changed default value of `copy` to `True` in NetGear API documentation. + Noted that `track` option is ignored when `copy=True`. * Update WriteGear documentationL + Updated the documentation for the `-disable_force_termination` parameter. * Update `README.md`: + Replaced deprecated options (`frame_jpeg_quality`, `frame_jpeg_optimize`, `frame_jpeg_progressive`) with their newer equivalents (`jpeg_compression_quality,` `jpeg_compression_fastdct`, `jpeg_compression_fastupsample`) in WebGear usage example. * Update `mkdocs.yml`: + Set `edit_uri` for GitHub edit links. + Add new theme features like content actions, tooltips, etc. + Update palette settings for light/dark mode. + Enable new markdown extensions. + Add custom javascript hook support. + Migrated to new Google Analytics 4. + Replaced depreciated `materialx `with supported emoji extension. + Replaced permalink icon with default one. + Change system mode toggle icon and name in `mkdocs.yml`. * Improved overall documentation quality by added detailed explanations, practical examples, following best practices, and clearer usage patterns. * Updated sections, code examples, admonitions, and comments for better readability, consistency, and precision. * Added missing version contributors to `changelog.md`. * Added new icons to make headings more readable. * Replaced unsupported admonitions with supported ones. * Removed all custom admonition icons and color CSS from `custom.css`. * Removed Twitter section from help and docs site metadata. * Updated Zenodo badge and BibTeX entry. * Added workaround for 'AttributeError: 'DXCamera' object has no attribute 'is_capturing'' error on Windows. * Remove script tags from `main.html` and use a custom hook for adding javascripts on certain pages. * Refactored all APIs and bonus examples to use `linenums` and `hl_lines` which makes it easier to highlight specific lines in code blocks. * Removed Gitter community chat sidecard JS file. * Redefined spacing between sections. * Add failure warning in various docs about `picamera` incompatibility on 64-bit OS. * Update announcement icon in `main.html`. * Remove `site.webmanifest` file. - Maintenance: * Improved logging, parameter validation, and added descriptive dialogs across various APIs. * Moved logging enablement before version logging for consistency in vidgear APIs. * Removed redundant boolean assignment for various APIs internal logging. * Simplified conditional statements and assignments using short-circuiting, Boolean operations, and ternary operators across various APIs and tests. * Refactored vidgear code to improve readability, maintainability, and performance. * Added `.cache` directory to `.gitignore`, * Updated vidgear library version to `v0.3.3`. * Improved code efficiency with short-circuiting and formatting. * Updated logging practices to be more developer-friendly. * Removed unnecessary parentheses and type checks. * Removed unused imports. * Updated code comments. - CI: * Temporarily removed PiGear API from code coverage due to hardware limitations. * Deprecated custom `event_loop` fixture overrides in WebGear_RTC and NetGear_Async tests + Removed redundant `pytest.mark.asyncio` decorators from several test functions. * Add a new `event_loop_policy` fixture for pytest to override the event loop policy: + Added new recommended approach of using `pytest.mark.asyncio(scope="module")` to mark all WebGear_RTC and NetGear_Async tests as asynchronous and utilize the same event loop throughout the module. + Log the event loop being used for debugging. * Updated NetGear unit tests to reflect the new default for `copy`. * Ensured coverage for `raise`, `log`, `silent`, and unknown error types. * Improved parameterized test cases to support floating point values. * Updated StreamGear tests to use the new `close()` method instead of the deprecated terminate() method. * Updated tests of various APIs for better coverage and reliability. * Enabled `kill=True` in `close()` in NetGear Tests. * Removed pinned `cryptography==38.0.4` dependency. * Remove unused imports and code cleanup. * Rearranged the dependencies. ### Breaking Updates/Changes 💥 - StreamGear: * Deprecated `terminate()` method and introduce `close()` method. + The `terminate()` method in StreamGear is now deprecated and will be removed in a future release. Developers should use the new `close()` method instead, which provides a more descriptive name like in WriteGear API for terminating StreamGear processes safely. * Deprecated `rgb_mode` parameter in `stream()` method. + This parameter will be removed in a future version, and only BGR format frames will be supported. * Restricted -livestream parameter to Real-time Frames Mode only. + Live streaming is intended for low-latency streaming of real-time frames, where chunks contain only the most recent frames. It doesn't make sense when streaming from a video file, as the entire file can be streamed normally without the need for live streaming. ### Bug-fixes 🐛 - PiGear: * Modify PiGear class behavior when `enforce_legacy_picamera=True` on unsupported system + Instead of silently disabling `picamera2` API directly, PiGear now raises an error if `picamera` is unavailable or unsupported + Prevented incorrect initialization of `PiGear` class on unsupported 64-bit OS systems. * Fixed `UnboundLocalError` bug for 'picamera2' variable assigment. * Fixed `UnboundLocalError` bug for 'queue' variable assignment. * Fixed colorspace typo bug. - StreamGear: * Fixed incompatibility of stream copy with Real-time Frames Mode. + Added warnings and discarded `-vcodec copy` when using this mode. * Removed non-essential aspect ratio parameter to prevent unwanted distortions (Fixes #385). * Moved handle streaming format to beginning to fix 'StreamGear' object has no attribute '_StreamGear__format' bug. - NetGear: * Fixed Secure Mode failing to work on conflicting ZMQ Contexts: + Handled "Address in use" error more gracefully and disabled secure mode if errors occur. + Improved handling of ZMQ Authenticator and Certificates. * Fixed `msg_json` undefined when terminating context in the `recv_handler` method. - CamGear: * Fixed logging condition for yt-dlp (Fixes #394) + Updated `no_warnings` parameter in `CamGear` to be `False` when logging is enabled and `True` otherwise. - Docs: * Replaced buggy kofi widget with a button image in `index.md`. * Fixed Ko-fi sponsorship heart hover effect in footer + Replaced `twemoji` heart emoji with `heart-pulse` fontawesome SVG * Fixed titles and indentations in various admonitions. * Fixed various issues in code comments, and hyperlinks URLs. * Fixed typos, formatting, code highlighting, and grammar inconsistencies. * Fixed minor typo in `js_hook.py`. - CI: * Fixed simplejpeg and opencv not compatible with `numpy==2.x.x` versions. + Pinned `numpy<2.0.0` in all CI envs. * Fixed expected duration value in parameterized test case from `8` to `8.44` since `test_extract_time` function now supports floating point values. * Fixed `test_secure_mode` NetGear test: + Added `"127.0.0.1"` address to allow common endpoint for connection. + Added `"jpeg_compression":False` to disable frame compression, allowing frame to be the same while assertion. * Fixed `pip install` hash bug in Azure Pipelines CI. * Fixed various typos and code issues in tests. * Fixed invalid escape sequence in testcase string. * Fixed python environment bugs in `appveyor.yml`.
🎉 Released VidGear Stable `v0.3.2` [#379] ### New Features ✨ - **NetGear:** * Added new `kill` parameter to `close()` method to forcefully kill ZMQ context instead of graceful exit only in the `receive` mode. * Added new `subscriber_timeout` integer optional parameter to support timeout with `pattern=2` _(or Publisher-Subscriber)_ pattern. + Receiver will exit safely if timeout defined(any value(in milliseconds) > 0), and timeout occurs in Receiver Mode with `pattern=2`. + 💬 Note: Default behavior still is to block the thread till infinite time. - **WriteGear:** * Added new `-disable_ffmpeg_window` optional Boolean flag to enable patch that prevents FFmpeg creation window from opening when building `.exe` files on Windows OS. _(PR by @ibtsam3301)_ + 💬 Note: `-disable_ffmpeg_window` optional Boolean flag is only available on Windows OS with logging disabled(`logging=False`) in compression mode. + Use Case: This flag can be useful while creating an `.exe` file for a python script that uses WriteGear API. On windows even after creating the `.exe` file in windowed mode or no-console mode, the `ffmpeg.exe` command line window would pop up while its being used by WriteGear API. - **Setup.py** * Added official support for python `3.11.x` legacies. * Bumped version to `0.3.1`. - **Docs** * Added doc for `subscriber_timeout` optional Integer parameter in NetGear. * Added doc for `disable_ffmpeg_window` optional Boolean parameter in WriteGear. * Added new asset `screengear_region.png`. - **CI** * Added python 3.11 legacy support for MacOS, Windows and Linux environments. * Added kill argument to close() method in various NetGear tests. ### Updates/Improvements ⚡️ - Asyncio: * Formatted TemplateResponse class parameters w.r.t new changes in backend Starlette API. - Setup.py: * Readded latest patch to `uvicorn`, `starlette`, `pyzmq` dependencies. * Removed `3.7` legacy from Programming Language metadata. - Maintenance: * Added GitHub sponsors and dropped liberapay from `Funding.yml`. * Removed redundant code. - Docs: * Updated information related to Supported Dimensional Attributes in ScreenGear docs. * Updated minimum python to version `3.8` while installing vidgear in docs. * Updated API-specific dependencies in docs. * Updated changelog.md - CI: * Updated Azure Pipeline workflow. * Updated Appveyor Pipeline workflow. * Updated GitHub Actions Pipeline workflow. * Migrated python version to `3.9` in `deploy_docs.yml` workflow. * Removed deprecated python `3.7` legacy support. * Increased code coverage by updating tests. * Updated tests for `subscriber_timeout` optional Integer parameter in NetGear. * Updated tests for `disable_ffmpeg_window` optional Boolean parameter in WriteGear. ### Breaking Updates/Changes 💥 - [ ] Setup.py: * Removed support for python-3.7 legacies + Raised `python_requires` to `>=3.8`. Thereby python `3.7` and any before legacy are no longer supported. ### Bug-fixes 🐛 - ScreenGear: * Fixed swapped region dimensions bug with dxcam backend. * Fixed "mss" backend disabled when `monitor` parameter is not defined. - Docs: * Fixed missing `compression_mode` flags in WriteGear API docs. * Fixed missing hyperlinks. * Fixed typos and context. - CI: * Temporary fix for AST constructor depth mismatch in pytest on python `3.11.x`, More information: pytest-dev/pytest#10874 + Made temporary fix platform independent. + Extended fix to all Webgear_RTC tests. * Fixed NetGear tests bugs. * Fixed condition logic bug.
🎉 Released VidGear Stable v0.3.0 [#352] 📓 Complete Release Notes: https://abhitronix.github.io/vidgear/latest/changelog/#v030-2023-01-26 #### New Features ✨ - **WriteGear:** * Added support for user-defined and higher than 8-bit depth input frames pixel-format. + Added support for higher than 8-bit depth frames with datatypes of unsigned integer(`uint`) kind and element size `2`. + Added `dtype` parameter to internal `Preprocess` method for passing input frames datatype. + Implemented auto-calculation of input pixel-format based on number of channels in higher than 8-bit depth frames. + Added various known working pixel-formats(based on number of channels), supported by all prominent computer vision libraries. + Added support for up to 1-channel(`gray16-le/be`) to all the way up to 4-channels(`bgra64-le/be`) in input frames. + Added endianness little(`le`) or big(`be`) at the suffix of pixel-format based on byte-order of input frames datatypes. + Extended support for higher RGB 8-bit depth frames through RGB mode. * Added support for user-defined custom input pixel-format. + Added new `-input_pixfmt` attribute to `output_params` dictionary parameter for easily specifying custom input pixel-format. + Added newly implemented `get_supported_pixfmts` method import for verifying user-defined input pixel-format against Installed FFmpeg supported pixel-formats. Unsupported values will be discarded. + Implemented runtime datatype validation check, such that all input frames must have same datatype. * Added support for Context Managers for proper handling of resources via `with` statement for allocating and releasing resources precisely. (Suggested by @sueskind) + Implement the `__enter__()` and `__exit__()` methods. + Added `__enter__` method that returns reference to the WriteGear Class. + Added `__exit__` method that automatically executes `close()` for performing the cleanup operations and handling exception gracefully. - **StreamGear:** * Added support for Context Managers for proper handling of resources via `with` statement for allocating and releasing resources precisely. (Suggested by @sueskind) + Implement the `__enter__()` and `__exit__()` methods. + Added `__enter__` method that returns reference to the StreamGear Class. + Added `__exit__` method that automatically executes `close()` for performing the cleanup operations and handling exception gracefully. - **WebGear:** * Added way to completely disable Data-Files Auto-Generation WorkFlow. + Added new `skip_generate_webdata` boolean optional attribute(`False` by default) to completely disable Data-Files Auto-Generation WorkFlow. + This flag enables only `/video` route for disabled Data-Files Auto-Generation WorkFlow. + Implemented JSONResponse as placeholder response instead of Index, `404` and `500` HTML pages, when workflow is disabled. _(Note: Index HTML page will throw `404` status code.)_ + Added necessary imports. - **Helper:** * Added more robust implementation of validate_audio method. + Added new more robust regex pattern for extracting audio-samplerate. + Added new `validate_audio` method for calculating accurate bitrate(in kbps) from audio samplerate, channels, bit-depth values. + Implemented new patterns and logic for accurately extracting audio channels and bit-depth from given metadata. * Added support for Linux video device path _(such as `/dev/video0`)_. - **Maintenance:** * Logging current vidgear version when vidgear APIs are called, not at import. + Added `logcurr_vidgear_ver` helper function to facilitate logging current vidgear version, when called within a API. + Implemented `ver_is_logged` global variable in helper to log version only once, which can modifiable with `logcurr_vidgear_ver` method only. Followed recommendation given in official python docs: https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables-across-modules + Current version can only be logged by VidGear APIs with the logging turned on _(i.e. `logging=True`)_. - **Docs:** * Added new WriteGear Bonus Example: + Added "Using WriteGear's Compression Mode with `v4l2loopback` Virtual Cameras bonus python example. + Added related prerequisites and dependencies for creating `v4l2loopback` Virtual Cameras on Linux machines. + Added both With/Without-Audio cases for "Using WriteGear's Compression Mode for YouTube-Live Streaming". * Added `content.code.copy` and `content.tabs.link` features. * Added docs related to `skip_generate_webdata` optional attribute. * Added feedback features to mkdocs.yml. * Added `404.html` static template to `mkdocs.yml`. - **CI:** * Added v4l2loopback support for testing `/dev/video0` device on Linux machines. * Added test cases for newer implementation of `validate_audio` method. * Added `test_skip_generate_webdata` to test `skip_generate_webdata` optional attribute. * Added tests for user-defined and higher than 8-bit depth input frames pixel-format. #### Updates/Improvements ⚡️ - WriteGear: * Completely revamped code structure and comments. + Updated comments, description, and logging messages to more sensible and developer friendly. + Implemented operator short-circuiting to cleanup code as much as possible. + Renamed `startFFmpeg_Process` internal class method to `start_FFProcess`. + Renamed `Preprocess` internal class method to `PreprocessFFParams`. + Renamed `startCV_Process` internal class method to `start_CVProcess`. + Renamed `initiate` internal class parameter to `initiate_process`. + Renamed `force_termination` internal class parameter to `forced_termination`. + Enabled `output_params` parameters logging in both modes. + Improved `compression` and `logging` parameters boolean value handling. + Impelemented `stdout` closing to cleanup pipeline before terminating. - Helper: * Updated `validate_audio` method with improved and more robust regex patterns for identifying audio bitrate in ay audio file. - Setup.py: * Bumped version to `0.3.0`. * Replaced `>=` comparsion operator with more flexible `~=`. * Replaced `distutils.version.LooseVersion` with `pkg_resources.parse_version`. - Maintenance: * Replaced depreciated `LooseVersion` with `parse_version`. * Updated `Retry` package to be imported from `requests.adapters`. * Moved terminal and python code text area to Question GitHub Form Schema. * Removed unnecessary imports. * Removed redundant code. * Improved logging messages. * Updated code comments. * Updated method descriptions. * Refactored code. * Increased coverage. - Bash Script: * Updated FFmpeg Static Binaries links to latest date/version tag to `12-07-2022`. * Removed depreciated binaries download links and code. - Docs: * Replaced all `raw.githubusercontent.com` GIF URLs with `user-images.githubusercontent.com`. * Reformatted `custom.css` and added missing comments. * Updated sponsor block. * Enabled Code Highlights. * Updated announcement bar. * Reduced `webgear_rtc.gif` size. * Updated Zenodo badge and the BibTeX entry. - CI: * Added more flexible formats to `return_testvideo_path` function. * Updated `test_write` test for higher than 8-bit depth input frames pixel-format in WriteGear's Compression Mode. * Updated `actions/checkout` to `v3`. * Updated `actions/setup-python` to `v4`. * Updated `codecov/codecov-action` to `v3`. * Moved `test_colorspaces` test to CamGear tests. * Added deffcode library import. * Re-stuctured yaml code. #### Breaking Updates/Changes 💥 - WriteGear: * Renamed `output_filename` string parameter to `output`. + Since WriteGear API accepts all sorts of streams _(such as valid filename/path/URL)_ for encoding, thereby changing parameter name to `output` will be more true to its purpose. + Renaming `output_filename` to `output` in WriteGear API will also help user to not accidentally assume WriteGear supports only encoding of video files. * It matches the `output` parameter in StreamGear which basically does the same thing. * Renamed `cmd` parameter in `execute_ffmpeg_cmd()` class method to more sensible `command`. * `ValueError` will be raised if datatype of input frames mismatches Writegear API #### Bug-fixes 🐛 - Camgear: * Fixed `CamGear.read()` blocked unnecessarily. + 💬 When `THREADED_QUEUE_MODE` is enabled `CamGear.read()` blocks for an excessive duration when attempting to read past the end of a stream. + Added `None` frame to the queue at the end to signal we're done. + Added `terminate` Event check before continuing. * Fixed deadlock on exit. + 💬 The deadlock is due to `self.__queue.get(timeout=self.__thread_timeout)` line in `read()` method, which still waits for timeout(thread_timeout) to happen when main `update()` thread was already terminated on exit and queue was empty. Since there was no way to signal queue that stream is already ended, the blocking `queue.get()` keeps on waiting until timeout occurs. + The solution was to signal `queue.get()` that stream is already ended by putting `None` in queue on exiting the main `update()` thread. - ScreenGear: * Fixed `ScreenGear.read()` blocked during cold startup. + 💬 During startup, `ScreenGear.read()` doesn't checks if queue is empty before continuing. - WriteGear: * Fixed gstpipeline_mode not activating when wrongly assuming `output` value as valid path. * Fixed name 'compression' is not defined bug. * Fixed `AttributeError`. - Helper: * Fixed `fltp` keyword in regex pattern causing non-ftlp streams to be not recognized. * Fixed response.headers returning `content-length` as Nonetype since it may not necessarily have the Content-Legth header set. + Reason: The response from gitlab.com contains a Transfer-Encoding field as `'Transfer-Encoding': 'chunked'`, which means data is sent in a series of chunks, so the Content-Length header is emitted. More info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding#Directives * Fixed Linux video device paths still not working. + Moved `helper.py` logic to WriteGear and StreamGear APIs resp. * Fixed KeyError for empty metadata. - Setup: * Pinned `pyzmq==24.0.1` working version. * Removed redundant patch for the issue. - Maintaince: * Fixed missing pkg name `import_dependency_safe` functions calls. - Bash Script: * Fixed gstreamer installation. - CI: * Fixed missing v4l2loopback apt dependency on Linux envs. * Added fix for RTCPeerConnection fails to create RTCDtlsTransport (Related issue: aiortc/aiortc#804) + Pinned `cryptography==38.0.4` in dependencies. * Pinned Linux image to `ubuntu-20.04` in github actions. * Fixed No module named 'httpx' bug. + Added `httpx` library import. * Fixed F821 undefined name bug. * Fixed Gstreamer bug. - Docs: * Fixed hyperlinks to new GitHub's form schemas. * Fixed non-rendering images in README.md + Replaced all relative image/gifs paths with absolute URLs in README.md. * Fixed badges/shields#8671 badge issue in README.md * Fixed GitLab CDN links throwing blocked by CORS policy bug. + Replaced gitlab GitHack CDN links with with bitbucket. * Fixed DASH playback failing by setting the `maxAttempts` to Infinity. * Removed `x-sign` glow-text effect CSS. * Fixed several typos (suggested by @timgates42) * Fixed coverage badge.
🔖Released VidGear Stable v0.2.6 [#321] 📓 Complete Release Notes: https://abhitronix.github.io/vidgear/latest/changelog/#v026-2022-07-05 New Features ✨ - **Docs:** * Added new bonus example for RSTP/RTP Live-Streaming using WriteGear's Compression Mode. * Added "How to resolve zmq.error.ZMQError" FAQ for NetGear API.(PR by @iandol) - **Maintenance:** * Added new patterns to `.gitignore` to ignore pypi's `build` directory and `egg-info` files. - **CI:** * Switched to new Issue GitHub's form schema using YAMLs. Updates/Improvements ⚡️ - Setup.py: * Replaced `>=` comparsion operator with more flexible `~=`. * Replaced `distutils.version.LooseVersion` with `pkg_resources.parse_version`. - Docs: * Updated Site Navigation. + Added new notices to inform users more effectively about bonus examples. + Added new `Bonus` section to navigation and moved suitable pages under it. * Redesigned and Rewritten Donation and Contribution section to README.md * Updated Zenodo badge and bibtex entry. - API: * Updated depreciated `tostring()` to `tobytes()` for the purposes for clarity in Python 3.2. https://docs.python.org/3/library/array.html#array.array.tobytes - CI: * Added more paths and files to skip commits. Breaking Updates/Changes 💥 - `-input_framerate` parameter now accepts any positive value for WriteGear and StreamGear APIs. Bug-fixes 🐛 - API: Fixed `-input_framerate` less than 5 does not get used in WriteGear and StreamGear APIs.(PR by @freol35241) - CamGear: Fixed Yt-dlp generated HTTP DASH Segments URLs not supported by OpenCV's VideoCapture(PR by @DynamiteC) - StreamGear: * Fixed `hls_segment_type` not working bug. (PR by @enarche-ahn) * Fixed critical logging parameter bug + Fixed debug logs even when `logging=False` in StreamGear's Real-time Mode. (patch suggested by @enarche-ahn) + Added length check to `-video_source` attribute to correctly infers it as empty(or invalid). - CI: * Xfailed RSTP CamGear CI test. * Fixed pinned version syntax bug in docs_deployer workflow. * Fixed typos in Github forms and its context. * Added missing dependency. - Docs: * Fixed jinja2 `3.1.0` or above breaks mkdocs. + `jinja2>=3.1.0` breaks mkdocs (mkdocs/mkdocs#2799), therefore pinned jinja2 version to `<3.1.0`. * Fixed support for new `mkdocstring` versions + Replaced rendering sub-value with options. + Removed pinned `mkdocstrings==0.17.0` version. * Fixed Netgear+Webgear bonus example code bugs.(PR by @iandol) + Added a missing import. + Removed `self.` typo. + Replaced the `return` value with `break` in the async as it triggers an error. * Fixed external bug that causing "Home" tab to irresponsive randomly when accessed from other tabs.
Released VidGear Stable v0.2.5 [#286] - **WriteGear:** * Add support for GStreamer pipeline in WriteGear API's Non-Compression mode: + Implemented GStreamer Pipeline Mode to accept GStreamer pipeline as string to its output_filename parameter. + Added new special `-gst_pipeline_mode` attribute for its output_params parameter. + This feature provides flexible way to directly write video frames into GStreamer Pipeline with controlled bitrate. + Added new docs and updated existing docs with related changes. * Added new `-ffpreheaders` special attribute to WriteGear's options parameter: + This attribute is specifically required to set special FFmpeg parameters in Compression Mode that are present at the starting of command(such as `-re`). + This attribute only accepts **list** datatype as value. + Added related docs. - **NetGear:** * Added bidirectional data transfer support by extending Bidirectional mode support to exclusive Multi-Clients and Multi-Servers modes: + Users will now able to send data bidirectionally in both Multi-Clients and Multi-Servers exclusive modes. + Bidirectional mode will no longer disables automatically when Multi-Clients and Multi-Servers modes already enabled. + Added new docs and updated existing docs with related changes. - **Maintenance:** * ***Added official support for **Python-3.10** legacies.*** * Added `float` value support to `THREAD_TIMEOUT` optional parameter. * Added info about dropped support for Python-3.6 legacies through announcement bar. * Added `config.md` file for Issue templates. * Added title to Issue templates. - **Docs:** * Added new Code Annotations * Added new icons to headings. * Added Advanced VideoGear usage example with CamGear backend. - Setup.py: * Dropped support for Python-3.6 and below legacies. * Updated logging formatting. * Updated python_requires to `>=3.7`. * Bumped version to `0.2.5`. - Helper: * Vidgear will now report current version on every run. - Docs: * Updated SSH tunneling docs context. * Excluded `docs` directory from CI envs. * Updated Zenodo badge and BibTeX entry. * Updated dark theme hue to `260`. * Updated Admonitions. * Additional warnings against pushing PR against VidGear's `testing` branch only. * Updated code comments. - CI: * Removed support for Python-3.6 legacies from all workflows. * Updated NetGear's Exclusive Mode tests. * Added GStreamer Pipeline Mode tests. - Maintenance: * Updated Issue and PR templates. * Updated metadata. - **⚠️ Dropped support for Python-3.6 legacies from vidgear.** - NetGear: Fixed bidirectional mode overriding multi-clients mode's data. - WriteGear: * Fixed wrongly defined ffmpeg_preheaders. * Fixed condition logic bugs. * Fixed UnboundLocalError bug. - Setup: Fixed uvicorn and aiortc dropped support for Python-3.6 legacies. - CI: * Fixed GitHub Actions interprets 3.10 as 3.1 if used without strings. * Fixed naming error in azure YAML. - Docs: * Fixed codecov badge URL in README.md * Fixed hyperlinks in README. * Fixed indentation and spacing. * Fixed typos and updated context. * Removed dead code. - Maintenance: * Removed depreciated condition checks.
Released VidGear Stable v0.2.4 [#275] # New Features ✨ - **CamGear:** * Added a new YT_backend Internal Class with YT-DLP backend: + Implemented `YT_backend` a new CamGear's Internal YT-DLP backend class for extracting metadata from Streaming URLs. + Added support for pipeling (live) video-frames from all yt-dlp supported streaming sites: https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md#supported-sites + Implemented algorithm from scratch for auto-extracting resolution specific streamable URLs for pipelineing. + Implemented logic for auto-calculating `best` and `worst` resolutions. + Added new `ytv_metadata` global parameter to CamGear for accessing video's metadata(such as duration, title, description) on-the-go. +⚠️ Playlists are still unsupported. - **WebGear_RTC:** * Implemented a new easy way of defining Custom Streaming Class with suitable source(such as OpenCV): + Added new `custom_stream` attribute with WebGear_RTC `options` parameter that allows you to easily define your own Custom Streaming Class with suitable source(such as OpenCV). + This implementation supports repeated Auto-Reconnection or Auto-Refresh out-of-the-box. + This implementation is more user-friendly and easy to integrate within complex APIs. + This implementation requires at-least `read()` and `stop()` methods implemented within Custom Streaming Class, otherwise WebGear_RTC will throw ValueError. + This implementation supports all vidgear's VideoCapture APIs readily as input. - **Maintenance:** * Added new `.gitignore` for specifying intentionally untracked files to ignore + Added more files entries to `.gitignore`. * Added new `.gitattributes` to manage how Git reads line endings. + Enabled `auto` default behavior, in case people don't have `core.autocrlf` set. + Enforced LF line-endings for selective files types. + Added Binary data files that specifies they are not text, and git should not try to change them. + Added Language aware diff headers. + Added Linguist language overrides. - **Docs:** * Added bonus example to add real-time file audio encoding with VideoGear and Stabilizer class. * Added complete usage docs with new CamGear's Internal Class with YT-DLP backend. * Added instructions to extract video's metadata in CamGear. * Added donation link in page footer with bouncing heart animation through pure CSS. * Added info about critical changes in `v0.2.4` and above installation through new announcement bar. * Added related usage docs for new WebGear_RTC custom streaming class. * Added changes for upgrading mkdocs-material from `v7.x` to newer `v8.x`. * Added outdated version warning block. # Updates/Improvements ⚡️ - CamGear: * Added `is_livestream` global YT_backend parameters. * Added default options for yt-dlp for extracting info_dict(metadata) of the video as a single JSON line. * Completely removed old logic for extracting streams using pafy. * Removed all dead code related to streamlink backend. - Setup.py: * Moved all API specific dependencies to `extra_requires` under the name `"core"`. **[PR #268 by @zpapakipos]** * Added rule to replace GitHub heading links in description. * Updated `extra_require` dependencies. * Removed `streamlink` dependency. * Removed `pafy` dependency. * Removed `pyzmq` from latest_version group. * Updated SEO Keywords. - Docs: * Re-written `pip` and `source` installation docs. * Added warning for using `-disable_force_termination` flag for short duration videos. * Added `permalink_title` entry to mkdocs.yml. * Updated CamGear parameters. * Updated Admonitions with related information. * Updated Functional Block Diagram(`gears_fbd.png`) image. * Updated installation instructions. * Updated Advanced examples using WebGear_RTC's custom streaming class. * Updated code highlighting. * Updated zenodo badge. * Updated BibTex for project citation. * Replaced incorrect API parameter docs. * Updated WebGear_RTC parameters. - CI: * Updated CI tests for new WebGear_RTC custom streaming class. * Restored `test_stream_mode` CamGear test. * Updated Streaming Sites test links. * Added more tests cases. - Maintenance: * Updated spacing in logger formatting. * Renamed Asyncio Helper logger name. * Changed logging colors. * Updated logging messages. # Breaking Updates/Changes 💥 - Installation command with `pip` has been changed in `v0.2.4`: * The legacy `pip install vidgear` command now installs critical bare-minimum dependencies only. Therefore in order to automatically install all the API specific dependencies as previous versions, use `pip install vidgear[core]` command instead. - CamGear: * Removed `streamlink` backend support from `stream_mode` in favor of more reliable CamGear's Internal YT-DLP backend class for extracting metadata from Streaming URLs. + CamGear will raise `ValueError` if streaming site URL is unsupported by yt-dlp backend. + CamGear will raise `ValueError` if `yt-dlp` isn't installed and `stream_mode` is enabled. * Removed automatic enforcing of GStreamer backend for YouTube-livestreams and made it optional. + The CamGear will not raise ValueError if GStreamer support is missing in OpenCV backends. - WebGear_RTC: * Removed support for assigning Custom Media Server Class(inherited from aiortc's VideoStreamTrack) in WebGear_RTC through its `config` global parameter. * WebGear_RTC API will now throws ValueError if `source` parameter is NoneType as well as `custom_stream` attribute is undefined. - Helper: * Removed `restore_levelnames` method. * Removed `youtube_url_validator` helper method. # Bug-fixes 🐛 - CamGear: * Fixed KeyError Bug for missing attributed in meta_data json in some streaming sites. - Helper: * Removed unused imports. - Docs: * Removed slugify from mkdocs which was causing invalid hyperlinks in docs. * Fixed GitHub hyperlinks in README.md. * Fixed hyperlink in announcement bar. * Fixed content tabs failing to work. * Fixed line-endings and usage example code. * Removed any `pafy` and `streamlink` references. * Fixed context and typos. - CI: * Fixed NameError bugs in WebGear_RTC CI test. - Maintenance: * Removed dead logger code causing Python's Built-in logging module to hide logs. * Removed unused `logging` import. * Updated code comments.
Release VidGear Stable v0.2.3 [#262] # New Features ✨ - CamGear: * Added support for `4K` Streaming URLs. - Helper: * Implemented logging ColorFormatter string alignment. + Center aligned logging Level-name and Class-name. + Changed `%` formatting style with modern `{`. + Re-added `asctime` value to Formatter string. + Re-arranged parameter positions in Formatter string. - Maintenance: * Added new `.gitignore` for specifying intentionally untracked files to ignore + Added more files entries to `.gitignore`. * Added new `.gitattributes` to manage how Git reads line endings. + Enabled `auto` default behavior, in case people don't have `core.autocrlf` set. + Enforced LF line-endings for selective files types. + Added Binary data files that specifies they are not text, and git should not try to change them. + Added Language aware diff headers. + Added Linguist language overrides. - Docs: * Added new ScreenGear with WebGear_RTC API bonus example. * Added support for `hl_lines` argument for highlighting specific code lines. * Added drop-shadow effects for its `slate` theme to improve visibility. # Updates/Improvements ⚡️ - CamGear: * Replaced `youtube-dl` with `yt-dlp` as pafy backend for YouTube videos pipelining. + Implemented hack to trick pafy into assuming `yt-dlp` as `youtube-dl`. + Using `sys.modules` to present `yt-dlp` as `youtube-dl`. + `yt-dlp` python API functions exactly similar to `youtube-dl`. + Replaced `youtube-dl` dependency with `yt-dlp`. + Replaced `youtube-dl` imports with `yt-dlp`. - StreamGear: * Updated default `stream_count` internal dict key value to 1. - Maintenance: * Introduced python short-circuiting for handling logging logic. * Enabled logging for `check_WriteAccess` method in WriteGear, StreamGear and NetGear APIs. - Docs: * Added warning for ScreenGear outputting RGBA frames instead of default BGR frames with `mss` backend. * Added warnings for properly formatting `output_params` when assigning external audio-source in WriteGear. * Added depreciation notice for Python 3.6 legacies. * Restructured docs to make it more user-friendly. * Updated, Extended and Improved context. * Improved code comments. * Updated docs admonitions. * Updated `Zenodo` badge. - CI: * Migrated to new Codecov Uploader in Azure Pipelines. + Support for the Bash Uploader will be deprecated on February 1st, 2022. See: https://docs.codecov.com/docs/about-the-codecov-bash-uploader + Added commands for signature and SHASUM verification to ensure integrity of the Uploader before use. + Replaced related bash commands. * Replaced `env` with `export` in ci_linux.yml. * Replaced `bubkoo/needs-more-info@v1` with `wow-actions/needs-more-info@v1`. * Added codecov secret token through `env` variable. * Added wildcard to skip CI tests for doc(`.md`) files. * Added `.md` files to Codecov ignore list. * Update vidgear's banner image. # Breaking Updates/Changes 💥 - [ ] `check_WriteAccess` will now return as invalid path if writing directory does not exists. This will effect output file handling in WriteGear and StreamGear APIs. # Bug-fixes 🐛 - StreamGear: * Fixed StreamGear Malformed URI Error with HLS Segments [PR #243 by @Vboivin] + Removed the extra `'%'` character from the naming convention for segment files. + Used `stream_count` internal dict variable to alter template for HLS segment filenames. - WriteGear: * Fixed bug in disable_force_termination logic which accidentally disables force termination. - WebGear_RTC: * Fixed `name 'VideoStreamTrack' is not defined` bug. - Setup.py: * Fixed `TypeError` bug. * Fixed invalid `latest_version` retrieval. - Helper: * Fixed `check_WriteAccess` failing to recognize correct permission for writing the output file on windows platform. + Implemented separate logic for `Windows` and `*nix` platforms. + Added new `stat` import. + Improved warnings and error handling. + Added logging parameter to `check_WriteAccess`. * Fixed bug in check_WriteAccess that throws `OSError` while handling URLs. - Docs: * Fixed bugs in WriteGear's Compression Mode with Live Audio Input example. * Fixed "drop-shadow" property via `filter` function conflicting with sidecard button. + Added new CSS classes for image, admonitions and code highlight in dark theme. * Several internal and external webpage links typos fixed. * Fixed several language typos. - CI: * Fixed Azure Pipeline coverage upload bugs. * Fixed random errors in CamGear `stream_mode` test. - Bash: * Removed the Windows carriage returns from the shell scripts to be able to execute them on Linux. - Fixed logging comments.
PreviousNext