# -*- coding: utf-8 -*-"""YouTube-style random short-ID generator and its Alfred Script Filter entry point.Charset design: 57 URL-safe characters — ``base62`` minus visually-confusing``0`` / ``1`` / ``l`` / ``o`` / ``O`` (capital ``I`` is **kept**). Cryptographicallystrong via :func:`secrets.choice`; suitable as opaque IDs in URLs, filenames,slugs, etc. Survives being read aloud or hand-copied without ambiguity."""importsecretsimportafwf.apiasafwffrom.constantsimportid_charsetfrom.constantsimportid_default_lengthfrom.constantsimportid_max_lengthfrom.constantsimportid_min_lengthfrom.constantsimportmsg_enter_idfrom.constantsimportmsg_id_autocompletefrom.constantsimportmsg_id_invalid_length_valuefrom.constantsimportn_id
[docs]defgen_id(length:int)->str:"""Generate one random short ID of ``length`` chars from the module charset."""return"".join(secrets.choice(id_charset)for_inrange(length))
[docs]defgen_ids(length:int)->afwf.ScriptFilter:"""Return a ``ScriptFilter`` of ``n_id`` fresh short IDs of ``length``."""sf=afwf.ScriptFilter()for_inrange(n_id):sid=gen_id(length)item=afwf.Item(title=sid,subtitle="Hit 'Command + C' to copy",arg=sid,valid=True,)sf.items.append(item)returnsf
[docs]defmain(query:str)->afwf.ScriptFilter:"""Alfred entry point. ``query`` parses as int in ``[id_min_length, id_max_length]``, otherwise an error item is shown."""query=query.strip()ifnotquery:item=afwf.Item(title=msg_enter_id,subtitle=msg_id_autocomplete,autocomplete=str(id_default_length),valid=True,)returnafwf.ScriptFilter(items=[item])try:length=int(query)exceptValueError:return_invalid_length_sf(f"`{query}` is NOT a valid length!")ifid_min_length<=length<=id_max_length:returngen_ids(length)return_invalid_length_sf(msg_id_invalid_length_value)