import pythoncom
from win32com.shell import shell, shellcon
import win32api, os


class InternetShortcut:
    def __init__(self):
        self._base = pythoncom.CoCreateInstance(
            shell.CLSID_InternetShortcut,
            None,
            pythoncom.CLSCTX_INPROC_SERVER,
            shell.IID_IUniformResourceLocator,
        )

    def load(self, filename):
        # Get an IPersist interface
        # which allows save/restore of object to/from files
        self._base.QueryInterface(pythoncom.IID_IPersistFile).Load(filename)

    def save(self, filename):
        self._base.QueryInterface(pythoncom.IID_IPersistFile).Save(filename, 1)

    def __getattr__(self, name):
        if name != "_base":
            return getattr(self._base, name)


temp_dir = win32api.GetTempPath()
linkname = win32api.GetTempFileName(temp_dir, "ish")[0]
print("Link:", linkname)
os.remove(linkname)
linkname += ".url"

ish = InternetShortcut()
ish.SetURL("https://github.com/mhammond/pywin32")
ish.save(linkname)

## IUniformResourceLocator also give access to IPropertySetStorage
pss = ish.QueryInterface(pythoncom.IID_IPropertySetStorage)
ps = pss.Open(shell.FMTID_InternetSite)
property_ids = [
    (k, v) for k, v in shellcon.__dict__.items() if k.startswith("PID_INTSITE_")
]
for pname, pval in property_ids:
    print(pname, ps.ReadMultiple((pval,))[0])

ps = pss.Open(shell.FMTID_Intshcut)
property_ids = [(k, v) for k, v in shellcon.__dict__.items() if k.startswith("PID_IS_")]
for pname, pval in property_ids:
    print(pname, ps.ReadMultiple((pval,))[0])

new_sh = InternetShortcut()
new_sh.load(linkname)
new_sh.InvokeCommand("Open")
