1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#
# The internetarchive module is a Python/CLI interface to Archive.org.
#
# Copyright (C) 2012-2019 Internet Archive
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
internetarchive.cli.argparser
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: (C) 2012-2019 by Internet Archive.
:license: AGPL 3, see LICENSE for more details.
"""
from __future__ import annotations
import sys
from collections import defaultdict
from typing import Mapping
from urllib.parse import parse_qsl
def get_args_dict(args: list[str], query_string: bool = False, header: bool = False) -> dict:
args = args or []
metadata: dict[str, list | str] = defaultdict(list)
for md in args:
if query_string:
if (':' in md) and ('=' not in md):
md = md.replace(':', '=').replace(';', '&')
for key, value in parse_qsl(md):
assert value
metadata[key] = value
else:
key, value = md.split(':', 1)
assert value
if value not in metadata[key]:
metadata[key].append(value) # type: ignore
for key in metadata:
# Flatten single item lists.
if len(metadata[key]) <= 1:
metadata[key] = metadata[key][0]
return metadata
def get_args_header_dict(args: list[str]) -> dict:
h = get_args_dict(args)
return {k: v.strip() for k, v in h.items()}
def get_args_dict_many_write(metadata: Mapping):
changes: dict[str, dict] = defaultdict(dict)
for key, value in metadata.items():
target = '/'.join(key.split('/')[:-1])
field = key.split('/')[-1]
if not changes[target]:
changes[target] = {field: value}
else:
changes[target][field] = value
return changes
def convert_str_list_to_unicode(str_list: list[bytes]):
encoding = sys.getfilesystemencoding()
return [b.decode(encoding) for b in str_list]
|