dirkf [Tue, 4 Jul 2023 15:06:21 +0000 (16:06 +0100)]
[Misc] Fixes for 2.6 compatibility
dirkf [Fri, 30 Jun 2023 02:52:39 +0000 (03:52 +0100)]
[workflows/ci.yml] Fix test support for Py 2.6
dirkf [Thu, 29 Jun 2023 14:27:12 +0000 (15:27 +0100)]
[workflows/ci.yml] Restore test support for Py 3.2
dirkf [Thu, 22 Jun 2023 23:15:06 +0000 (00:15 +0100)]
[workflows/ci.yml] Restore test support for Py 3.3, 3.4, and add 2.6
dirkf [Thu, 22 Jun 2023 22:10:04 +0000 (23:10 +0100)]
[YouTube] Avoid crash in author extraction
dirkf [Thu, 22 Jun 2023 16:24:48 +0000 (17:24 +0100)]
[workflows/ci.yml] Replace actions/setup-python for legacy Pythons
Thanks MatteoH2O1999: https://github.com/MatteoH2O1999/setup-python
pukkandan [Thu, 22 Jun 2023 07:53:31 +0000 (13:23 +0530)]
[YouTube] Improve nsig function name extraction
Fixes player
b7910ca8, using `,` vs `;`
See https://github.com/ytdl-org/youtube-dl/issues/32292#issuecomment-
1602231170
Co-authored-by: dirkf
dirkf [Sat, 17 Jun 2023 23:52:18 +0000 (00:52 +0100)]
[YouTube] Improve fix for
ae8ba2c
Thx: https://github.com/yt-dlp/yt-dlp/commit/
01aba25
dirkf [Sat, 17 Jun 2023 14:36:39 +0000 (15:36 +0100)]
[YouTube] Fix `KeyError QV` in signature extraction failed
* temporarily force missing global definition into sig JS
* improve test: thanks https://github.com/yt-dlp/yt-dlp/issues/7327#issuecomment-
1595274615
* resolves #32314
dirkf [Sat, 17 Jun 2023 14:43:10 +0000 (15:43 +0100)]
[jsinterp] Don't find unrelated objects
dirkf [Sat, 17 Jun 2023 14:34:11 +0000 (15:34 +0100)]
[jsinterp] Fix test for failed match in extract_object()
dirkf [Sun, 11 Jun 2023 12:33:50 +0000 (13:33 +0100)]
[jsinterp] Fix div bug breaking player
8c7583ff
Thx bashonly: https://github.com/ytdl-org/youtube-dl/issues/32292#issuecomment-
1585639223
Fixes #32292
dirkf [Fri, 26 May 2023 19:25:25 +0000 (20:25 +0100)]
[core] Revise
1f7c6f8 to help downstream merger (possibly)
dirkf [Tue, 23 May 2023 16:11:22 +0000 (17:11 +0100)]
[compat] Fix casefold import __all__ syntax in
a19855f
dirkf [Tue, 23 May 2023 15:19:55 +0000 (16:19 +0100)]
[ITV] Fix UA capitalisation in
384f632
dirkf [Fri, 19 May 2023 12:12:59 +0000 (13:12 +0100)]
[core] Further improve platform debug log
* see
d1c6c5c
dirkf [Fri, 19 May 2023 12:09:18 +0000 (13:09 +0100)]
[jsinterp] Small updates for
a85a875
* update signature tests
* clarify NaN handling
dirkf [Thu, 11 May 2023 20:17:31 +0000 (21:17 +0100)]
[core] Improve platform debug log, based on yt-dlp
dirkf [Thu, 11 May 2023 20:02:01 +0000 (21:02 +0100)]
[jsinterp] Add short-cut evaluation for common expression
* special handling for (d%e.length+e.length)%e.length speeds up ~6%
dirkf [Thu, 11 May 2023 19:59:30 +0000 (20:59 +0100)]
[jsinterp] Handle NaN in bitwise operators
* also add _NaN
* also pull function naming from yt-dlp
dirkf [Thu, 11 May 2023 19:53:07 +0000 (20:53 +0100)]
[utils] Fix `compiled_regex_type` in
249f2b6
dirkf [Sun, 23 Apr 2023 21:58:35 +0000 (22:58 +0100)]
[YouTube] Support Releases tab
dirkf [Fri, 21 Apr 2023 13:04:30 +0000 (14:04 +0100)]
[jsinterp] Minimally handle arithmetic operator precedence
Resolves #32066
dirkf [Wed, 12 Apr 2023 23:15:07 +0000 (00:15 +0100)]
[DashSegmentsFD] Correctly detect errors when `fragment_retries` == 0
* use the success flag instead of the retry count
* establish the fragment_url outside the retry loop
* only report skipping a fragment once.
* resolves #32033
dirkf [Tue, 11 Apr 2023 16:36:27 +0000 (17:36 +0100)]
[YouTube] Simplify signature patterns
Gabriel Nagy [Wed, 12 Apr 2023 22:40:38 +0000 (01:40 +0300)]
[core] Sanitize info dict before dumping JSON (fixes
fe7e130) (#32032)
* follow up to
fe7e130 which didn't fix everything.
Co-authored-by: dirkf <fieldhouse@gmx.net>
dirkf [Mon, 10 Apr 2023 16:12:31 +0000 (17:12 +0100)]
[core] Add and use sanitize_info() method from yt-dlp
dirkf [Thu, 6 Apr 2023 18:49:46 +0000 (19:49 +0100)]
[core] No longer importing copy
dirkf [Thu, 6 Apr 2023 18:42:36 +0000 (19:42 +0100)]
[core] Avoid deepcopy of ctx dict (fix
f35b757) (Pt 2)
dirkf [Thu, 6 Apr 2023 13:11:18 +0000 (14:11 +0100)]
[core] Avoid deepcopy of ctx dict (fix
f35b757)
* may now contain `LazyList`s
* resolves #31999
dirkf [Wed, 5 Apr 2023 17:50:25 +0000 (18:50 +0100)]
[options] Add --mtime option, unsets default --no-mtime
* resolves #1709 (!)
dirkf [Wed, 5 Apr 2023 17:47:49 +0000 (18:47 +0100)]
[devscripts] Improve hack to convert command-line options to API options
* define equality for DateRange
* don't show default DateRange
dirkf [Wed, 5 Apr 2023 17:39:54 +0000 (18:39 +0100)]
[compat] Add and use `compat_open()` like Py3 `open()`
* resolves FIXME: ytdl-org/youtube-dl/commit/
dfe5fa4
dirkf [Wed, 5 Apr 2023 17:29:24 +0000 (18:29 +0100)]
[FragmentFD] Fix iteration with infinite limit
* fixes ytdl-org/youtube-dl/
baa6c5e
* resolves #31885
dirkf [Mon, 3 Apr 2023 20:07:10 +0000 (21:07 +0100)]
[test] Update tests for Ubuntu 20.04
* 18.04 test runner was withdrawn
* for now, disable Py 3.3/3.4 tests
pukkandan [Thu, 9 Mar 2023 16:39:23 +0000 (22:09 +0530)]
[extractor/youtube] Bypass throttling for `-f17`
and related cleanup
Thanks @AudricV for the finding
Ref: yt-dlp/yt-dlp/commit/
c9abebb
pukkandan [Sun, 12 Mar 2023 09:16:09 +0000 (14:46 +0530)]
[extractor/youtube] Construct fragment list lazily
Ref: yt-dlp/yt-dlp/commit/
e389d17
See: yt-dlp/yt-dlp#6517
dirkf [Sun, 19 Mar 2023 02:27:46 +0000 (02:27 +0000)]
[utils] Ensure `allow_types` for `variadic()` is a tuple
dirkf [Sun, 19 Mar 2023 00:51:44 +0000 (00:51 +0000)]
[downloader/http] Only check for resumability when actually resuming
dirkf [Tue, 14 Mar 2023 13:01:32 +0000 (13:01 +0000)]
[AENetworksBaseIE] Report missing show data instead of crash
dirkf [Tue, 14 Mar 2023 00:58:59 +0000 (00:58 +0000)]
[devscripts] Add a hack to convert command-line options to API options
dirkf [Mon, 13 Mar 2023 19:45:54 +0000 (19:45 +0000)]
[core] Handle `/../` sequences in HTTP URLs
* use Python's RFC implementation for embedded sequences
* hack: strip unbalanced leading `../` from path, like eg Firefox
See https://github.com/yt-dlp/yt-dlp/issues/3355
dirkf [Sat, 11 Mar 2023 12:17:00 +0000 (12:17 +0000)]
[FragmentFD] Respect `--no-continue`
* discard partial fragment on `--no-continue`
* continue with correct progress display otherwise
Resolves #21467
dirkf [Sat, 11 Mar 2023 12:09:55 +0000 (12:09 +0000)]
[downloader] Let _ffmpeg_ handle DASH segments
Fixes https://github.com/ytdl-org/youtube-dl/issues/31792 after
3da1783.
dirkf [Thu, 9 Mar 2023 16:40:30 +0000 (16:40 +0000)]
[doc] Improve "guidance" on bug reporting
Sophira [Tue, 7 Mar 2023 15:49:31 +0000 (15:49 +0000)]
[doc] Recommend "Get cookies.txt LOCALLY" extension in README.md (#31763)
* remove link to suspect "Get cookies.txt" extension, dropped from Chrome store
* link to new Manifest V3-compatible open-source "Get cookies.txt LOCALLY" extension.
Fixes #31465.
dirkf [Sun, 5 Mar 2023 23:07:07 +0000 (23:07 +0000)]
[jsinterp] Fix regexp parsing and .replace[All] method
* For performance, make regexp object instantiation lazy
* Other small performance improvements
pukkandan [Fri, 3 Mar 2023 11:18:54 +0000 (16:48 +0530)]
[jsinterp] Handle `Date` at epoch 0
See yt-dlp/yt_dlp#6400
pukkandan [Tue, 28 Feb 2023 17:33:44 +0000 (23:03 +0530)]
[Youtube] Construct dash formats with `range` query
See yt-dlp/yt_dlp#6369
dirkf [Fri, 24 Feb 2023 02:48:37 +0000 (02:48 +0000)]
[YouTube] Support @owner format in uploader_id etc
* implement https://github.com/ytdl-org/youtube-dl/issues/31530#issuecomment-
1435734719
* update affected tests
* misc clean-ups
dirkf [Fri, 24 Feb 2023 02:32:40 +0000 (02:32 +0000)]
[test] Support test-case with volatile ID (eg live show)
Signalled by regexp ID value, eg: `'id': r're:[\da-zA-Z_-]{8,}'`
pukkandan [Tue, 1 Jun 2021 12:35:41 +0000 (18:05 +0530)]
Escape URLs in `sanitized_Request`, not `sanitize_url`
d2558234cf5dd12d6896eed5427b7dcdb3ab7b5a added escaping of URLs while sanitizing. However, `sanitize_url` may not always receive an actual URL. Eg: When using `youtube-dl "search query" --default-search ytsearch`, `search query` gets escaped to `search%20query` before being prefixed with `ytsearch:` which is not the intended behavior. So the escaping is moved to `sanitized_Request` instead.
df [Mon, 20 Feb 2023 01:41:46 +0000 (01:41 +0000)]
[Vimeo] Fix
e19ec52 for tween-age Pythons
* a check in older Pythons in the 2.7 and earlier, 3.3, 3.4 series caused "sre_constants.error: nothing to repeat"
* satisfy the check by avoiding nested qualifiers that can match empty string
Resolves #31597
dirkf [Sun, 19 Feb 2023 13:47:49 +0000 (13:47 +0000)]
[jsinterp] Fix dict comprehension for Py2.6
Resolves #31600
dirkf [Fri, 17 Feb 2023 11:16:54 +0000 (11:16 +0000)]
[YouTube] Avoid crash if uploader_id extraction fails
See #31530.
dirkf [Tue, 14 Feb 2023 16:33:01 +0000 (16:33 +0000)]
[test] Avoid name TestIE which causes a pytest warning
See: https://github.com/yt-dlp/yt-dlp/commit/
060ac76257a8c1f7370a8a571821c1d73377701f
dirkf [Tue, 14 Feb 2023 02:47:09 +0000 (02:47 +0000)]
[InfoExtractor] Handle unquoted values in OpenGraph searches
fonkap [Sat, 11 Feb 2023 02:54:45 +0000 (03:54 +0100)]
[StreamsbIE] Add extractor for streamsb.com (viewsb.com) (#31517)
* Add extractor for streamsb.com (viewsb.com)
* make data url using app.js version
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
fonkap [Sat, 11 Feb 2023 02:47:43 +0000 (03:47 +0100)]
[KommunetvIE] Add extractor for kommunetv.no (#31516)
* Add extractor for kommunetv.no
* Using utils.update_url instead of regex
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
fonkap [Sat, 11 Feb 2023 02:37:45 +0000 (03:37 +0100)]
[FileMoonIE] Add extractor for filemoon.sx (#31515)
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
teddy171 [Thu, 9 Feb 2023 20:19:27 +0000 (04:19 +0800)]
[feat]: Add support to external downloader aria2p (#31500)
* feat: add class Aria2pFD
* feat: create call_downloader function
* feat: a colorful download interface to aria2pFD
* feat: change value name
* Apply suggestions from code review
Co-authored-by: dirkf <fieldhouse@gmx.net>
* Typo in suggestion
* fix: remove unused value
* fix: add not function to return value(0 is normal); add total_seconds to download.eta(timedelta object); add waiting status when hook progress
* fix: remove unuse method ..utils.format_bytes
* fix: be up to flake8
* fix: be up to flake8
* Apply suggestions from code review
* [feat] test external downloader aria2p
* [feat] test external downloader aria2p
* [fix] test_external_downloader.py
* Apply suggestions from code review
Co-authored-by: dirkf <fieldhouse@gmx.net>
* Apply suggestions from code review
Co-authored-by: dirkf <fieldhouse@gmx.net>
* Update test/test_external_downloader.py
Co-authored-by: dirkf <fieldhouse@gmx.net>
* Update test/test_external_downloader.py
Co-authored-by: dirkf <fieldhouse@gmx.net>
* Update youtube_dl/downloader/external.py
Co-authored-by: dirkf <fieldhouse@gmx.net>
* refactoring code and fix bugs
* Apply suggestions from code review
* Rename test_external_downloader.py to test_downloader_external.py
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
Valentin Metz [Thu, 9 Feb 2023 11:25:28 +0000 (12:25 +0100)]
[rbgtum] Add new extractor (#31305)
* [rbgtum] Add new extractor
* Small update, force CI
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
dirkf [Wed, 8 Feb 2023 18:16:51 +0000 (18:16 +0000)]
[YouTube] Fix tests
dirkf [Mon, 6 Feb 2023 16:19:21 +0000 (16:19 +0000)]
[YouTube] Refresh compat/utils usage
* import parse_qs()
* import parse_qs in lazy_extractors (clears old TODO)
* clean up old compiled lazy_extractors for Py2
* use update_url()
dirkf [Mon, 6 Feb 2023 15:50:28 +0000 (15:50 +0000)]
[compat] Update test_compat
[skip ci]
dirkf [Sun, 5 Feb 2023 13:46:43 +0000 (13:46 +0000)]
[utils] Add parse_qs, update_url
[skip ci]
dirkf [Sun, 5 Feb 2023 15:43:43 +0000 (15:43 +0000)]
[compat] Systematise compat_ naming
[skip ci]
dirkf [Sat, 4 Feb 2023 23:18:24 +0000 (23:18 +0000)]
[test] Fix TestAgeRestriction
* age restriction may cause DownloadError
* update obsolete test URLs
[skip ci]
dirkf [Mon, 20 Jun 2022 22:15:20 +0000 (23:15 +0100)]
[YouTube] Add `signatureTimestamp` for age-gate bypass
dirkf [Mon, 31 Jan 2022 04:28:54 +0000 (04:28 +0000)]
[YouTube] Bypass age-gating for certain restricted videos
* Use TVHTML5_SIMPLY_EMBEDDED_PLAYER client
* Also add and fix tests
* Introduce and use new utility function `update_url()`
dirkf [Sat, 11 Feb 2023 03:25:14 +0000 (03:25 +0000)]
[Vimeo] Support /user{video_id}/{slug} URL format
dirkf [Sat, 4 Feb 2023 00:21:35 +0000 (00:21 +0000)]
[Vimeo] Fix `Unable to extract info section` redux
* as reported in yt-dlp/yt-dlp#6149
* also allow newline in target JSON object
dirkf [Sat, 4 Feb 2023 01:53:47 +0000 (01:53 +0000)]
[jsinterp] Nits
dirkf [Sat, 4 Feb 2023 00:19:48 +0000 (00:19 +0000)]
[IGN] Overhaul extractor to avoid URL redirection loop
Consequently/also:
* centralise video data extraction
* detect 404 and 503 expected errors
* handle the test video in IGNVideo
* handle two additional page formats for the tests in IGNArticle
dirkf [Fri, 3 Feb 2023 21:10:07 +0000 (21:10 +0000)]
[ITV] Overhaul ITV extractor (#30266)
* support ITVX URLs (thanks Vangelis66)
* support legacy ITV Hub URLs
* include extraction fix
4c57dd2 from sleaux-meaux 3 May 2021
* include extraction fix
6fbcc16, fix by staubichsauger & pukkandan
* work-around duration parsing pending fix to utils.parse_duration
* apply default vanilla UA for pages and media to avoid site blocking
* also detect and report `Episode not found` instead of generic 404
* rework ITVBTCCIE with geo-block detection, best effort geo-restriction handling, news article support
* fix tests
dirkf [Thu, 2 Feb 2023 23:25:44 +0000 (23:25 +0000)]
[myvideoge] Add new extractor (#31360)
NB download tests on CI servers blocked
Co-authored-by: Alfonso Solbes <fonk666@gmail.com>
afterdelight [Thu, 2 Feb 2023 23:20:14 +0000 (06:20 +0700)]
[xhamster] add support for new domain xhvid.com (#31370)
dirkf [Thu, 2 Feb 2023 23:19:03 +0000 (23:19 +0000)]
[FIFA] Back-port extractor from yt-dlp (#31385)
Epsilonator [Thu, 2 Feb 2023 17:33:09 +0000 (23:03 +0530)]
[Blerp] Add new extractor (#31398)
Co-authored-by: dirkf <fieldhouse@gmx.net>
zhangeric-15 [Thu, 2 Feb 2023 17:26:31 +0000 (12:26 -0500)]
[YouTube] Fix not finding videos listed under a channel's "shorts" subpage. (#31409)
Resolves #31336
Co-authored-by: Jouni Järvinen <rautamiekka@users.noreply.github.com>
Co-authored-by: dirkf <fieldhouse@gmx.net>
Ruowang Sun [Thu, 2 Feb 2023 17:21:05 +0000 (12:21 -0500)]
[Callin] Add new extractor (#31414)
Co-authored-by: dirkf <fieldhouse@gmx.net>
Leon Etienne [Thu, 2 Feb 2023 17:13:39 +0000 (18:13 +0100)]
[pr0gramm] implement InfoExtractor, Resolves #31433 (#31434)
* [pr0gramm] implement infoextractor
* [pr0gramm] remove misplaced comment, uncapture regex-group
* [pr0gramm]: specify utf-8 coding
* [pr0gramm]: add trailing comma to lists for maintainability
* [pr0gramm]: ie only sets upload_date attribute
* [pr0gramm]: add video_id to title
* [pr0gramm]: more forgiving _valid_url regex
* [pr0gramm]: add uploader to title, if set
* Discriminate URL pattern
---------
Co-authored-by: dirkf <fieldhouse@gmx.net>
JChris246 [Thu, 2 Feb 2023 17:12:36 +0000 (13:12 -0400)]
[cammodels] fix and improve extractor (#31453)
Co-authored-by: dirkf <fieldhouse@gmx.net>
Rodrigo Dias [Thu, 2 Feb 2023 17:10:09 +0000 (17:10 +0000)]
[doc] Fixed typo appearing to promise an example (#31489)
Resolves #31425
Co-authored-by: dirkf <fieldhouse@gmx.net>
Brian Marks [Thu, 2 Feb 2023 16:58:21 +0000 (11:58 -0500)]
[americastestkitchen] Add support for downloading entire series (#31493)
Also
* support new sites and URL patterns
* back-port from yt-dlp
Co-authored-by: dirkf <fieldhouse@gmx.net>
dirkf [Thu, 2 Feb 2023 14:28:32 +0000 (14:28 +0000)]
[jsinterp] Improve parsing
* support subset `... else if ...`
* support `while`
* add `RegExp` class
* generalise `new` support
* limited more debug strings
* matching test changes
pukkandan [Wed, 1 Feb 2023 04:09:49 +0000 (09:39 +0530)]
Support `if` statements
Fix for yt-dlp/yt_dlp#6131
Closes #31509
dirkf [Sun, 13 Nov 2022 15:09:29 +0000 (15:09 +0000)]
[generic] Improve KVS (etc) extraction
dirkf [Sun, 13 Nov 2022 14:59:30 +0000 (14:59 +0000)]
[generic] Improve KVS (etc) extraction
* detect kt_player('kt_player', 'https://.../kt_player.swf?v=5...
* detect age limit if 18 USC 2257 is mentioned
* test with shooshtime.com
Partially resolves #31332.
FraFraFra-LongD [Sun, 13 Nov 2022 13:22:04 +0000 (14:22 +0100)]
Added ThisVid.com support (#29187)
* add ThisVidIE, ThisVidMemberIE, ThisVidPlaylistIE
* redirect embed to main page for more metadata
* use KVS extraction newly added to GenericIE and remove duplicate tests
* also add MrDeepFake etc compat to GenericIE
(closes #22390)
Co-authored-by: dirkf <fieldhouse@gmx.net>
dirkf [Sat, 12 Nov 2022 11:55:05 +0000 (11:55 +0000)]
[generic] Add KVS player extraction
dirkf [Fri, 11 Nov 2022 00:49:13 +0000 (00:49 +0000)]
[common:jwplayer] Improve jwplayer extraction and parsing (#31000)
* don't crash parser if jwplayer_data is invalid (empty, or no formats)
* use `label` in `sources[n]` as `format_id`
* relax `jwplayer().setup(...)` RE (also rework PR #27274 enhancement)
* detect more manifest formats in _parse_jwplayer_formats() (from PR #29596)
* improve metadata extraction (from PR #25433)
* remember URLs in a set
* use parse_resolution() in format
* extract filesize in format (from yt-dlp)
Co-authored-by: kikuyan <kikuyan@users.noreply.github.com>
Co-authored-by: martin54 <martin54@users.noreply.github.com>
Moises Lima [Wed, 9 Nov 2022 20:26:30 +0000 (17:26 -0300)]
[PeekVids, PlayVids] Add new extractor (#29765)
* Merge back-port from yt-dlp
* Merge features from PR #29798
* Improve metadata extraction
Co-authored-by: dirkf <fieldhouse@gmx.net>
Co-authored by: AXDOOMER
dirkf [Fri, 4 Nov 2022 10:13:07 +0000 (10:13 +0000)]
[extractor/ceskatelevize] Back-port extractor from yt-dlp, etc (#30713)
* back-port extractor, removing CeskaTelevizePoradyIE
* follow redirect URL
* support liveBroadcast and videobonusDetail in __NEXT__ data
* return single video for singleton playlist
* fix/add tests
Andrei Lebedev [Thu, 3 Nov 2022 10:09:37 +0000 (11:09 +0100)]
[utils] Backport traverse_obj (etc) from yt-dlp (#31156)
* Backport traverse_obj and closely related function from yt-dlp (code by pukkandan)
* Backport LazyList, variadic(), try_call (code by pukkandan)
* Recast using yt-dlp's newer traverse_obj() implementation and tests (code by grub4k)
* Add tests for Unicode case folding support matching Py3.5+ (requires
f102e3d)
* Improve/add tests for variadic, try_call, join_nonempty
Co-authored-by: dirkf <fieldhouse@gmx.net>
dirkf [Wed, 2 Nov 2022 11:56:26 +0000 (11:56 +0000)]
[compat] Work around in case folding for narrow Python build
Resolves #31324.
dirkf [Tue, 1 Nov 2022 22:47:02 +0000 (22:47 +0000)]
[compat] Add test for compat_casefold()
dirkf [Tue, 1 Nov 2022 21:33:39 +0000 (21:33 +0000)]
[compat] Add test for compat_casefold()
dirkf [Tue, 1 Nov 2022 19:25:59 +0000 (19:25 +0000)]
[compat] Reformat casefold.py for easier updating
dirkf [Tue, 1 Nov 2022 12:40:23 +0000 (12:40 +0000)]
[compat] Unify unicode/str compat and move up