59 lines
1.3 KiB
Python
59 lines
1.3 KiB
Python
# -*- 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
|