All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning (as of version 2.1.15).
### Fixed
- Check for empty playlists after filtering, and after downloading videos (#375)
--type
CLI argument is now deprecated (will be removed in next major)
- Raise exception if there are no videos in the playlists (#347)
- Drop
--type
CLI argument and guess--id
type (#361) - Always reencode using our presets (even for high quality) and choose best format when downloading from Youtube (#356)
- Filter-out non-public videos and properly cleanup unsuccessful videos (#362)
- Use proper ZIM metadata key for
Scraper
andTags
(#369) - Add missing
playsinline
attribute for Video.JS on iOS (#368)
--type user
is now deprecated (will be removed in next major)
- Ignore empty playlists (#340)
- Fix
format
setting passed to yt-dlp (#351)
- Merge behaviors of user/channel types and add support for
forHandle
(#339, fix for #338) - Update layout of
Videos
tab inzimui
to display videos from all playlists in the ZIM (#337)
- Report scraper progress in a JSON file specified with
--stats-filename
(#228)
- Fix main playlist selection to respect the order of provided playlist IDs (#286)
- Fix
PLAYLISTS
tab not being highlighted when the page is reloaded (#299)
- Update dependencies, including zimscraperlib 4 (#306)
- Update
zimui
title dynamically with the selected playlist/video title (#298)
- Disable preloading of subtitles in video.js in
zimui
(#38) - Fix scraper to exit properly when
Too much videos failed to download
exceptions are raised (#285) - Clean up temporary files properly in case of exceptions during scraper run (#288)
- Implement infinite scroll for video/playlist lists and add loading spinners in
zimui
(#284) - Update video.JS to 8.17.3, brings support for Chrome 58 and 59 (#275)
This release represent a very significant update of the scraper UI and the underlying technology (use Vue.JS 3 JS framework).
- Move scraper files to
scraper
subfolder and update workflows - Bump
requests
package from 2.32.0 to 2.32.2 - Initialize new Vue.js project in
zimui
subfolder - Update dependencies in pyproject.toml (pydantic, pyhumps, python-slugify)
- Update scraper to generate JSON files for
zimui
(#212) - Remove old UI files and methods: template files (home.html, article.html) and
make_html_files
method in scraper.py - Remove
--locale
arg, broken locale folder, files used for translation; translation will be restored with #222 - Create "Videos" and "Playlists" tabs for homepage in new Vue.js UI (#213, #214)
- Create video player page in new Vue.js UI (#215)
- Add support for variable playback speed in video player (#174)
- Updgrade to zimscraperlib 3.4.0 (including new webm encoder presets to migrate to VP9 instead of VP8) (#204)
- Add playlist panel for playing videos in a playlist (#216)
- Remove
--autoplay
CLI argument and set autoplay to always be true (#233) - Add playlist view page in new Vue.js UI (#223)
- Add support for ogv.js in video-js player (#230)
- Remove openzim.toml and install all dependencies using Yarn (#218)
- Validate if ZIM cannot be created at given output location (#204)
- Add videos, subtitles, thumbnails and channel branding to the ZIM "on the fly" (#209)
- Remove
--no-zim
,--keep
CLI arguments - Add support to index content from
zimui
JSON files in the ZIM using customIndexData
(#224) - Add integration tests to check the content of the ZIM created by the scraper (#268)
- Add an overlay image for the channel banner (#279)
- New
long_description
CLI argument to set the ZIM long description - New
disable_metadata_check
CLI argument to disable the metadata checks which are automated since zimscraperlib 3.x
- Changed default publisher metadata to 'openZIM'
- Validate ZIM metadata (tags, title, description, long_description) as early as possible
- Migrate to zimscraperlib 3.3.2 (including new VideoLowWebm encoder preset version 2)
- Upgrade Python dependencies, including migration to Python 3.12
### Changed
- Using zimscraperlib 2.0.0 (#171)
- Using python 3.10 + debian bookworm (dropped support for older Python versions) (#180)
- Adopt Python bootstrap conventions (including hatch) (#180)
- Fixed local path media (profile, banner) not working (#178)
- Unset
metadata_from
inyoutube2zim-playlists
(#185) - Do not move local banner and profile images, copy them instead #179
- Switched to yt-dlp instead of youtube_dl
- Added fallback for subtitle languages with IDs-like suffixes (#161)
- Removed a reference to ZIM namespace that would break if first video has subtitles
- Fixed expected returncodes on errors (#166)
- Using ogv.js 1.8.9, videojs 7.20.3 and latest videojs-ogvjs (master)
- Using zimscraperlib 1.8.0
- Fixed typo breaking JS
- Fixed Jinja2's dependency: Markup_safe version (#156)
- Additional YT language code mapping: zh-Hant-HK, zh-Hans-SG
- using zimscraperlib 1.6.2
- fixed crash adding ogvjs's js.mem file
- fixed playlists switching removing videos
- Removed inline JS to comply with some CSP (#154)
- More YT language code mapping
- fixed inter-dependencies issue
- removed banner retrieval due to API change
- fixes to Webp for apple polyfill
- fixed WebP poster for apple on video pages
- fixed subtitles not showing on homepage preview video
- fixed crash on iw (Hebrew) subtitles
- fixed usage on older browsers (without ES6 support)
- use WebP for thumbnails
- fix seeking on Apple browsers
- using zimscraperlib 1.2.0
- replaced zimwriterfs with pylibzim
- tmp-dir now sanitized as build-dir
- fixed --debug not forwarded in playlists mode
- changed workdir to /output in docker image
- using video-js-7.8.1
- Added youtube2zim-playlists script to create one zim per playlist
- --zim-file now supports the
{period}
replacement string to insert date (#99) - picture-in-picture toggle now hidden
- using zimscraperlib to encode videos
- logging transfer before starting them
- added video_encoding_tester script in contrib/
- --tmp-dir option to set where temp files are downloaded/handled (system temp otherwise)
- thumbnail now converted to JPEG if received as WebP
- thumbnail resize now supports upscaling if original is too small
- thumnail resize and conversion from zimscraperlib
- using zimscraperlib 1.1.2
- removed skip-download option
- removed only_test_branding option
- docker to use zimwriterfs 1.3.10
- Fixed regression causing S3 to only use videos from cache (never youtube)
- Fixed compression issue on system without swap (#75)
- Using 44kHz audio sample rate on low-quality to save some space (#74)
- Added S3 Optimization Cache support (#69 #80)
- Bumped some dependencies (zimscraperlib, kiwixstorage)
- Filtering out videos with missing channel (#76)
- Fixed regresssion on --low-quality not working anymore
- Fixed video without sound due to change on Youtube side (#70)
- Using zimscraperlib
- Fixed not working with too much videos (URI too long)
- Secondary color now using 2nd most used color in profile picture
- Display playlists select only if there is multiple playlists
- Added --autoplay option
- Added kiwix-desktop workaround (no status check on XHR)
- Added support for playlists with missing videos
- Added period (YYYY-MM) to filename
- Fixed crash if using subtitles with non-iso language code
- Fixed missing subtitles (non-auto-generated)
- Added --pagination option to set max number of videos per page
- Added subtitles to welcome video as well
- Use (and convert from)
best
format if chosen (mp4|webm) not available - Fixed colors assignation
- Added --only-test-branding option to generate a fake home page to test branding/colors
- Fixed playlists list for channels not saved to cache
- Removed
chosen
style on playlist select element (back to native) - Playlists now sorted by title. First playlist remains
Uploads
one though. - Docker container auto-updates youtube-dl on start
- Added concurrency via --concurrency (defaults to none)
- Fixed date formatting: localized medium-sized version as in Youtube
- Displaying error messages from youtube on API errors
- Fixed API requests for large number of videos in playlist
- Made --name mandatory
- Tags now specified as comma-separated list
- Fixed channel info retrieval in some cases
- Don't fail on non-matching language-to-locale (defaults to EN)
- Added --locale to specify locale to use for translations/dates
- Splitted logs into stdout and stderr
- Failed to download videos don't stop the process. Nb of failed displayed on stderr
- Rewrote scraper script
- using Youtube API instead of parsing DOM
- simpler code (less)
- using youtube-dl to download video, thumbnail, subtitles
- faster (bundled download for video, thumbnail and subtitles – single ytdl call)
- option to use auto-generated subtitles
- added favicon in HTML (for kiwix-serve use)
- kept FFMPEF options code for lower-quality
- kept UI: html, css, js.
- updated videojs
- added support for webm in all browsers via ogv.js and videosjs-ogvjs
- defaults to webm
- made sure video are included only once (even if on multiple playlists)
- Dockerfile runs current code, not a pypi version
- improved UI on mobile/responsive
- translatable UI-texts, using --language (supports EN,FR atm.)
- fixed audio in low-quality mp4 files on quicktime-based platforms
- Known bugs:
- --all-subtitles is slow #38
- Safari (iOS/macOS) via kiwix-serve:
- Fullscreen is broken in Safari #33
- firefox/chromium via kiwix-serve:
- Controls buggy in firefox/chrome #34
- Fullscreen-exit is broken in firefox/chrome #35
- android:
- No fullscreen support in android #36
- exit rotation is buggy on android #37
- iOS:
- fullscreen is broken on iOS #39
- macOS:
- not working on macOS #40
- desktop (linux/windows):
- no fullscreen support on kiwix-desktop #42
- subtitles don't work on kiwix-desktop #41
- Make it as python package
- Get playlist or user channel (and playlist of user) from youtube
- the most view video is show on top and bigger
- --lowquality option for downloading in mp4 and re-encode aggressively in webm