# -*- coding: utf-8 -*- from abc import ABCMeta, abstractmethod, abstractproperty from typing import BinaryIO from TYPES import TorrentTypes from os.path import splitext as getext from re import match from Config import tmpDir class Torrent(object): __metaclass__ = ABCMeta def __init__(self, url: str, path: str): self.url = url self.path = path if not (self.validate()): raise ValueError @property @abstractmethod def torrent_type(self) -> TorrentTypes: pass @abstractmethod def validate(self) -> bool: pass @property def value(self) -> str: return self.value class MagnetLink(Torrent): @property def torrent_type(self) -> TorrentTypes: return TorrentTypes.MAGNET def validate(self) -> bool: pattern = r"^magnet:\?xt=urn:btih:[a-fA-F0-9]{40}.*$" if match(pattern, self.url): return True class TorrentFile(Torrent): def __init__(self, url: str, path: str): super().__init__(url, path) self.url = f"{tmpDir}/{url}" @property def torrent_type(self) -> TorrentTypes: return TorrentTypes.FILE def validate(self) -> bool: if getext(self.url)[1].lower() == ".torrent": return True