You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.2 KiB
32 lines
1.2 KiB
|
4 days ago
|
from pathlib import PureWindowsPath, Path
|
||
|
|
from urllib.request import url2pathname
|
||
|
|
from urllib.parse import urlparse, unquote
|
||
|
|
|
||
|
|
|
||
|
|
def path_from_fileurl(urlstr, **kwargs):
|
||
|
|
"""
|
||
|
|
Take a file:// url and return a Path.
|
||
|
|
|
||
|
|
Adapted from:
|
||
|
|
https://github.com/AcademySoftwareFoundation/OpenTimelineIO/blob/4c17494dee2e515aedc8623741556fae3e4afe72/src/py-opentimelineio/opentimelineio/url_utils.py#L43-L72
|
||
|
|
"""
|
||
|
|
# explicitly unquote first in case drive colon is url encoded
|
||
|
|
unquoted = unquote(urlstr)
|
||
|
|
|
||
|
|
# Parse provided URL
|
||
|
|
parsed_result = urlparse(unquoted)
|
||
|
|
|
||
|
|
# Convert the parsed URL to a path
|
||
|
|
filepath = Path(url2pathname(parsed_result.path), **kwargs)
|
||
|
|
|
||
|
|
# If the network location is a window drive, reassemble the path
|
||
|
|
if PureWindowsPath(parsed_result.netloc).drive:
|
||
|
|
filepath = Path(parsed_result.netloc + parsed_result.path, **kwargs)
|
||
|
|
|
||
|
|
# Otherwise check if the specified index is a windows drive, then offset the path
|
||
|
|
elif len(filepath.parts) > 1 and PureWindowsPath(filepath.parts[1]).drive:
|
||
|
|
# Remove leading "/" if/when `request.url2pathname` yields "/S:/path/file.ext"
|
||
|
|
filepath = Path(*filepath.parts[1:], **kwargs)
|
||
|
|
|
||
|
|
return filepath
|