diff --git a/rtv/mime_parsers.py b/rtv/mime_parsers.py index b039249..6c5e570 100644 --- a/rtv/mime_parsers.py +++ b/rtv/mime_parsers.py @@ -151,15 +151,15 @@ class RedditVideoMIMEParser(BaseMIMEParser): class ImgurApiMIMEParser(BaseMIMEParser): - """ + """ Imgur now provides a json API exposing its entire infrastructure. Each Imgur page has an associated hash and can either contain an album, a gallery, or single image. - + The default client token for RTV is shared among users and allows a maximum global number of requests per day of 12,500. If we find that this limit is not sufficient for all of rtv's traffic, this method will be revisited. - + Reference: https://apidocs.imgur.com """ @@ -321,7 +321,7 @@ class TwitchMIMEParser(BaseMIMEParser): return url, None -class OddshotIMEParser(OpenGraphMIMEParser): +class OddshotMIMEParser(OpenGraphMIMEParser): """ Oddshot uses the Open Graph protocol """ @@ -375,9 +375,24 @@ class LiveleakMIMEParser(BaseMIMEParser): else: return url, None +class ClippitUserMIMEParser(BaseMIMEParser): + """ + """ + pattern = re.compile(r'https?://(www\.)?clippituser\.tv/c/.+$') + + @staticmethod + def get_mimetype(url): + page = requests.get(url) + soup = BeautifulSoup(page.content, 'html.parser') + tag = soup.find(id='jwplayer-container') + quality = ['data-{}-file'.format(_) for _ in ['hd', 'sd']] + return tag.get(quality[0]), 'video/mp4' + + # Parsers should be listed in the order they will be checked parsers = [ - OddshotIMEParser, + ClippitUserMIMEParser, + OddshotMIMEParser, StreamableMIMEParser, VidmeMIMEParser, InstagramMIMEParser, diff --git a/tests/cassettes/test_parser[clippituser].yaml b/tests/cassettes/test_parser[clippituser].yaml new file mode 100644 index 0000000..9127918 --- /dev/null +++ b/tests/cassettes/test_parser[clippituser].yaml @@ -0,0 +1,95 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.18.4] + method: GET + uri: https://www.clippituser.tv/c/edqqld + response: + body: + string: !!binary | + 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 + X8aPNuuMFPKI8kBd3njx/xuIGq6OMQAA + headers: + Age: ['22761'] + Connection: [keep-alive] + Content-Encoding: [gzip] + Content-Length: ['3843'] + Content-Type: [text/html; charset=utf-8] + Date: ['Sun, 27 Aug 2017 11:43:57 GMT'] + Server: [nginx/1.4.6 (Ubuntu)] + Via: [1.1 d784ab98a21beb476de2ec8d5824cf82.cloudfront.net (CloudFront)] + X-Amz-Cf-Id: [5YJDFY6B-VxV3Ilh6E-EPqV4FBEU_5yr-N6TqUFpLAJ3SmJ4SlBSqg==] + X-Cache: [Hit from cloudfront] + X-Sentry-ID: [None] + status: {code: 200, message: OK} +version: 1 diff --git a/tests/test_mime_parsers.py b/tests/test_mime_parsers.py index 43511de..0781942 100644 --- a/tests/test_mime_parsers.py +++ b/tests/test_mime_parsers.py @@ -89,6 +89,10 @@ URLS = OrderedDict([ 'https://oddshot.tv/s/5wN6Sy', 'https://oddshot.akamaized.net/m/render-captures/source/Unknown-YjBkNTcwZWFlZGJhMGYyNQ.mp4', 'video/mp4')), + ('clippituser', ( + 'https://www.clippituser.tv/c/edqqld', + 'https://clips.clippit.tv/edqqld/720.mp4', + 'video/mp4')), ])