from html.parser import HTMLParser
from ..base import BaseShortener
from ..exceptions import ShorteningErrorException
class OHTMLParser(HTMLParser):
def __init__(self):
self.found = False
self.val = None
return HTMLParser.__init__(self)
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if "id" in attrs and attrs["id"] == "surl":
self.found = True
def handle_data(self, data):
if not self.found:
return
if data.startswith("http://osdb"):
self.val = data
class Shortener(BaseShortener):
"""
Os.db shortener implementation
Example:
>>> import pyshorteners
>>> s = pyshorteners.Shortener()
>>> s.osdb.short('http://www.google.com')
'https://osdb.link/TEST'
>>> s.osdb.expand('http://osdb.link/TEST')
'https://www.google.com'
"""
api_url = "https://osdb.link/"
def short(self, url):
"""Short implementation for Os.db
Args:
url: the URL you want to shorten
Returns:
A string containing the shortened URL
Raises:
ShorteningErrorException: If the API returns an error as response
"""
url = self.clean_url(url)
response = self._post(self.api_url, data={"url": url})
if not response.ok:
raise ShorteningErrorException(response.content)
p = OHTMLParser()
p.feed(response.text)
if not p.val:
raise ShorteningErrorException("Could not find osdb.link")
return p.val