aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Taylor <user234683@users.noreply.github.com>2019-07-21 21:59:52 -0700
committerJames Taylor <user234683@users.noreply.github.com>2019-07-21 21:59:52 -0700
commit8eff0bb9e23690bb8a87453a4a6d4d415b9e1a95 (patch)
tree4b2ecdf36896360d53cd0183f98b8484cc980a79
parentfc295ac93d0ad6b0272aa94f2d2ea44002ecbc48 (diff)
downloadyt-local-8eff0bb9e23690bb8a87453a4a6d4d415b9e1a95.tar.lz
yt-local-8eff0bb9e23690bb8a87453a4a6d4d415b9e1a95.tar.xz
yt-local-8eff0bb9e23690bb8a87453a4a6d4d415b9e1a95.zip
Delete obsolete files
-rw-r--r--http_errors.py16
-rw-r--r--server.py18
-rw-r--r--youtube/channel.py3
-rw-r--r--youtube/html_common.py270
-rw-r--r--youtube/template.py132
-rw-r--r--youtube/watch.py2
-rw-r--r--yt_basic_template.html20
-rw-r--r--yt_search_results_template.html60
8 files changed, 2 insertions, 519 deletions
diff --git a/http_errors.py b/http_errors.py
deleted file mode 100644
index bd8fbb4..0000000
--- a/http_errors.py
+++ /dev/null
@@ -1,16 +0,0 @@
-class Code2xx(Exception):
- pass
-class Code200(Code2xx):
- pass
-
-class Error4xx(Exception):
- pass
-class Error404(Error4xx):
- pass
-
-class Error5xx(Exception):
- pass
-class Error500(Error5xx):
- pass
-class Error502(Error5xx):
- pass
diff --git a/server.py b/server.py
index 24303ec..bf85a35 100644
--- a/server.py
+++ b/server.py
@@ -104,24 +104,6 @@ def site_dispatch(env, start_response):
else: # did not break
yield error_code('404 Not Found', start_response)
return
- '''
- except http_errors.Code200 as e: # Raised in scenarios where a simple status message is to be returned, such as a terminated channel
- start_response('200 OK', ())
- yield str(e).encode('utf-8')
-
- except http_errors.Error404 as e:
- start_response('404 Not Found', ())
- yield str(e).encode('utf-8')
-
- except urllib.error.HTTPError as e:
- start_response(str(e.code) + ' ' + e.reason, ())
- yield b'While fetching url, the following error occured:\n' + str(e).encode('utf-8')
-
- except socket.error as e:
- start_response('502 Bad Gateway', ())
- print(str(e))
- yield b'502 Bad Gateway'
- '''
except Exception:
start_response('500 Internal Server Error', ())
yield b'500 Internal Server Error'
diff --git a/youtube/channel.py b/youtube/channel.py
index 9cb1e78..17bc48d 100644
--- a/youtube/channel.py
+++ b/youtube/channel.py
@@ -1,8 +1,7 @@
import base64
-from youtube import util, yt_data_extract, html_common
+from youtube import util, yt_data_extract
from youtube import yt_app
-import http_errors
import urllib
import json
from string import Template
diff --git a/youtube/html_common.py b/youtube/html_common.py
deleted file mode 100644
index b8ea0d6..0000000
--- a/youtube/html_common.py
+++ /dev/null
@@ -1,270 +0,0 @@
-from youtube.template import Template
-from youtube import local_playlist, yt_data_extract, util
-
-import json
-import html
-
-
-with open('yt_basic_template.html', 'r', encoding='utf-8') as file:
- yt_basic_template = Template(file.read())
-
-
-
-
-page_button_template = Template('''<a class="page-button" href="$href">$page</a>''')
-current_page_button_template = Template('''<div class="current-page-button">$page</a>''')
-
-medium_playlist_item_template = Template('''
- <div class="medium-item-box">
- <div class="medium-item">
- <a class="playlist-thumbnail-box" href="$url" title="$title">
- <img class="playlist-thumbnail-img" src="$thumbnail">
- <div class="playlist-thumbnail-info">
- <span>$size</span>
- </div>
- </a>
-
- <a class="title" href="$url" title="$title">$title</a>
-
- <div class="stats">$stats</div>
- </div>
- </div>
-''')
-medium_video_item_template = Template('''
- <div class="medium-item-box">
- <div class="medium-item">
- <a class="video-thumbnail-box" href="$url" title="$title">
- <img class="video-thumbnail-img" src="$thumbnail">
- <span class="video-duration">$duration</span>
- </a>
-
- <a class="title" href="$url" title="$title">$title</a>
-
- <div class="stats">$stats</div>
-
- <span class="description">$description</span>
- <span class="badges">$badges</span>
- </div>
- <input class="item-checkbox" type="checkbox" name="video_info_list" value="$video_info" form="playlist-edit">
- </div>
-''')
-
-small_video_item_template = Template('''
- <div class="small-item-box">
- <div class="small-item">
- <a class="video-thumbnail-box" href="$url" title="$title">
- <img class="video-thumbnail-img" src="$thumbnail">
- <span class="video-duration">$duration</span>
- </a>
- <a class="title" href="$url" title="$title">$title</a>
-
- <address>$author</address>
- <span class="views">$views</span>
-
- </div>
- <input class="item-checkbox" type="checkbox" name="video_info_list" value="$video_info" form="playlist-edit">
- </div>
-''')
-
-small_playlist_item_template = Template('''
- <div class="small-item-box">
- <div class="small-item">
- <a class="playlist-thumbnail-box" href="$url" title="$title">
- <img class="playlist-thumbnail-img" src="$thumbnail">
- <div class="playlist-thumbnail-info">
- <span>$size</span>
- </div>
- </a>
- <a class="title" href="$url" title="$title">$title</a>
-
- <address>$author</address>
- </div>
- </div>
-''')
-
-medium_channel_item_template = Template('''
- <div class="medium-item-box">
- <div class="medium-item">
- <a class="video-thumbnail-box" href="$url" title="$title">
- <img class="video-thumbnail-img" src="$thumbnail">
- <span class="video-duration">$duration</span>
- </a>
-
- <a class="title" href="$url">$title</a>
-
- <span>$subscriber_count</span>
- <span>$size</span>
-
- <span class="description">$description</span>
- </div>
- </div>
-''')
-
-
-
-
-
-def badges_html(badges):
- return ' | '.join(map(html.escape, badges))
-
-
-html_transform_dispatch = {
- 'title': html.escape,
- 'published': html.escape,
- 'id': html.escape,
- 'description': yt_data_extract.format_text_runs,
- 'duration': html.escape,
- 'thumbnail': lambda url: html.escape('/' + url.lstrip('/')),
- 'size': html.escape,
- 'author': html.escape,
- 'author_url': lambda url: html.escape(util.URL_ORIGIN + url),
- 'views': html.escape,
- 'subscriber_count': html.escape,
- 'badges': badges_html,
- 'playlist_index': html.escape,
-}
-
-def get_html_ready(item):
- html_ready = {}
- for key, value in item.items():
- try:
- function = html_transform_dispatch[key]
- except KeyError:
- continue
- html_ready[key] = function(value)
- return html_ready
-
-
-author_template_url = Template('''<address>By <a href="$author_url">$author</a></address>''')
-author_template = Template('''<address><b>$author</b></address>''')
-stat_templates = (
- Template('''<span class="views">$views</span>'''),
- Template('''<time datetime="$datetime">$published</time>'''),
-)
-def get_stats(html_ready):
- stats = []
- if 'author' in html_ready:
- if 'author_url' in html_ready:
- stats.append(author_template_url.substitute(html_ready))
- else:
- stats.append(author_template.substitute(html_ready))
- for stat in stat_templates:
- try:
- stats.append(stat.strict_substitute(html_ready))
- except KeyError:
- pass
- return ' | '.join(stats)
-
-def video_item_html(item, template, html_exclude=set()):
-
- video_info = {}
- for key in ('id', 'title', 'author'):
- try:
- video_info[key] = item[key]
- except KeyError:
- video_info[key] = ''
- try:
- video_info['duration'] = item['duration']
- except KeyError:
- video_info['duration'] = 'Live' # livestreams don't have a duration
-
- html_ready = get_html_ready(item)
-
- html_ready['video_info'] = html.escape(json.dumps(video_info) )
- html_ready['url'] = util.URL_ORIGIN + "/watch?v=" + html_ready['id']
- html_ready['datetime'] = '' #TODO
-
- for key in html_exclude:
- del html_ready[key]
- html_ready['stats'] = get_stats(html_ready)
-
- return template.substitute(html_ready)
-
-
-def playlist_item_html(item, template, html_exclude=set()):
- html_ready = get_html_ready(item)
-
- html_ready['url'] = util.URL_ORIGIN + "/playlist?list=" + html_ready['id']
- html_ready['datetime'] = '' #TODO
-
- for key in html_exclude:
- del html_ready[key]
- html_ready['stats'] = get_stats(html_ready)
-
- return template.substitute(html_ready)
-
-
-
-
-
-
-
-page_button_template = Template('''<a class="page-button" href="$href">$page</a>''')
-current_page_button_template = Template('''<div class="page-button">$page</div>''')
-
-def page_buttons_html(current_page, estimated_pages, url, current_query_string):
- if current_page <= 5:
- page_start = 1
- page_end = min(9, estimated_pages)
- else:
- page_start = current_page - 4
- page_end = min(current_page + 4, estimated_pages)
-
- result = ""
- for page in range(page_start, page_end+1):
- if page == current_page:
- template = current_page_button_template
- else:
- template = page_button_template
- result += template.substitute(page=page, href = url + "?" + util.update_query_string(current_query_string, {'page': [str(page)]}) )
- return result
-
-
-
-
-
-
-
-showing_results_for = Template('''
- <div class="showing-results-for">
- <div>Showing results for <a>$corrected_query</a></div>
- <div>Search instead for <a href="$original_query_url">$original_query</a></div>
- </div>
-''')
-
-did_you_mean = Template('''
- <div class="did-you-mean">
- <div>Did you mean <a href="$corrected_query_url">$corrected_query</a></div>
- </div>
-''')
-
-def renderer_html(renderer, additional_info={}, current_query_string=''):
- type = list(renderer.keys())[0]
- renderer = renderer[type]
- if type == 'itemSectionRenderer':
- return renderer_html(renderer['contents'][0], additional_info, current_query_string)
-
- if type == 'channelRenderer':
- info = yt_data_extract.renderer_info(renderer)
- html_ready = get_html_ready(info)
- html_ready['url'] = util.URL_ORIGIN + "/channel/" + html_ready['id']
- return medium_channel_item_template.substitute(html_ready)
-
- if type in ('movieRenderer', 'clarificationRenderer'):
- return ''
-
- info = yt_data_extract.renderer_info(renderer)
- info.update(additional_info)
- html_exclude = set(additional_info.keys())
- if type == 'compactVideoRenderer':
- return video_item_html(info, small_video_item_template, html_exclude=html_exclude)
- if type in ('compactPlaylistRenderer', 'compactRadioRenderer', 'compactShowRenderer'):
- return playlist_item_html(info, small_playlist_item_template, html_exclude=html_exclude)
- if type in ('videoRenderer', 'gridVideoRenderer'):
- return video_item_html(info, medium_video_item_template, html_exclude=html_exclude)
- if type in ('playlistRenderer', 'gridPlaylistRenderer', 'radioRenderer', 'gridRadioRenderer', 'gridShowRenderer', 'showRenderer'):
- return playlist_item_html(info, medium_playlist_item_template, html_exclude=html_exclude)
-
- #print(renderer)
- #raise NotImplementedError('Unknown renderer type: ' + type)
- return '' \ No newline at end of file
diff --git a/youtube/template.py b/youtube/template.py
deleted file mode 100644
index d1a5e58..0000000
--- a/youtube/template.py
+++ /dev/null
@@ -1,132 +0,0 @@
-
-import re as _re
-from collections import ChainMap as _ChainMap
-
-class _TemplateMetaclass(type):
- pattern = r"""
- %(delim)s(?:
- (?P<escaped>%(delim)s) | # Escape sequence of two delimiters
- (?P<named>%(id)s) | # delimiter and a Python identifier
- {(?P<braced>%(id)s)} | # delimiter and a braced identifier
- (?P<invalid>) # Other ill-formed delimiter exprs
- )
- """
-
- def __init__(cls, name, bases, dct):
- super(_TemplateMetaclass, cls).__init__(name, bases, dct)
- if 'pattern' in dct:
- pattern = cls.pattern
- else:
- pattern = _TemplateMetaclass.pattern % {
- 'delim' : _re.escape(cls.delimiter),
- 'id' : cls.idpattern,
- }
- cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE)
-
-
-class Template(metaclass=_TemplateMetaclass):
- """A string class for supporting $-substitutions."""
-
- delimiter = '$'
- idpattern = r'[_a-z][_a-z0-9]*'
- flags = _re.IGNORECASE
-
- def __init__(self, template):
- self.template = template
-
- # Search for $$, $identifier, ${identifier}, and any bare $'s
-
- def _invalid(self, mo):
- i = mo.start('invalid')
- lines = self.template[:i].splitlines(keepends=True)
- if not lines:
- colno = 1
- lineno = 1
- else:
- colno = i - len(''.join(lines[:-1]))
- lineno = len(lines)
- raise ValueError('Invalid placeholder in string: line %d, col %d' %
- (lineno, colno))
-
- def substitute(*args, **kws):
- if not args:
- raise TypeError("descriptor 'substitute' of 'Template' object "
- "needs an argument")
- self, *args = args # allow the "self" keyword be passed
- if len(args) > 1:
- raise TypeError('Too many positional arguments')
- if not args:
- mapping = kws
- elif kws:
- mapping = _ChainMap(kws, args[0])
- else:
- mapping = args[0]
- # Helper function for .sub()
- def convert(mo):
- # Check the most common path first.
- named = mo.group('named') or mo.group('braced')
- if named is not None:
- return str(mapping.get(named,''))
- if mo.group('escaped') is not None:
- return self.delimiter
- if mo.group('invalid') is not None:
- self._invalid(mo)
- raise ValueError('Unrecognized named group in pattern',
- self.pattern)
- return self.pattern.sub(convert, self.template)
-
- def strict_substitute(*args, **kws):
- if not args:
- raise TypeError("descriptor 'substitute' of 'Template' object "
- "needs an argument")
- self, *args = args # allow the "self" keyword be passed
- if len(args) > 1:
- raise TypeError('Too many positional arguments')
- if not args:
- mapping = kws
- elif kws:
- mapping = _ChainMap(kws, args[0])
- else:
- mapping = args[0]
- # Helper function for .sub()
- def convert(mo):
- # Check the most common path first.
- named = mo.group('named') or mo.group('braced')
- if named is not None:
- return str(mapping[named])
- if mo.group('escaped') is not None:
- return self.delimiter
- if mo.group('invalid') is not None:
- self._invalid(mo)
- raise ValueError('Unrecognized named group in pattern',
- self.pattern)
- return self.pattern.sub(convert, self.template)
-
- def safe_substitute(*args, **kws):
- if not args:
- raise TypeError("descriptor 'safe_substitute' of 'Template' object "
- "needs an argument")
- self, *args = args # allow the "self" keyword be passed
- if len(args) > 1:
- raise TypeError('Too many positional arguments')
- if not args:
- mapping = kws
- elif kws:
- mapping = _ChainMap(kws, args[0])
- else:
- mapping = args[0]
- # Helper function for .sub()
- def convert(mo):
- named = mo.group('named') or mo.group('braced')
- if named is not None:
- try:
- return str(mapping[named])
- except KeyError:
- return mo.group()
- if mo.group('escaped') is not None:
- return self.delimiter
- if mo.group('invalid') is not None:
- return mo.group()
- raise ValueError('Unrecognized named group in pattern',
- self.pattern)
- return self.pattern.sub(convert, self.template)
diff --git a/youtube/watch.py b/youtube/watch.py
index dc50b7b..3b71e75 100644
--- a/youtube/watch.py
+++ b/youtube/watch.py
@@ -1,5 +1,5 @@
from youtube import yt_app
-from youtube import util, html_common, comments, local_playlist, yt_data_extract
+from youtube import util, comments, local_playlist, yt_data_extract
import settings
from flask import request
diff --git a/yt_basic_template.html b/yt_basic_template.html
deleted file mode 100644
index d2290d8..0000000
--- a/yt_basic_template.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8">
- <title>$page_title</title>
- <link href="/youtube.com/shared.css" type="text/css" rel="stylesheet">
- <link href="/youtube.com/comments.css" type="text/css" rel="stylesheet">
- <link href="/youtube.com/favicon.ico" type="image/x-icon" rel="icon">
- <link title="Youtube local" href="/youtube.com/opensearch.xml" rel="search" type="application/opensearchdescription+xml">
- <style type="text/css">
-$style
- </style>
- </head>
- <body>
-$header
- <main>
-$page
- </main>
- </body>
-</html>
diff --git a/yt_search_results_template.html b/yt_search_results_template.html
deleted file mode 100644
index d73fb9e..0000000
--- a/yt_search_results_template.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8">
- <title>$page_title</title>
- <link href="/youtube.com/shared.css" type="text/css" rel="stylesheet">
- <link href="/youtube.com/favicon.ico" type="image/x-icon" rel="icon">
- <link title="Youtube local" href="/youtube.com/opensearch.xml" rel="search" type="application/opensearchdescription+xml">
- <style type="text/css">
- main{
- display:grid;
- grid-template-columns: minmax(0px, 1fr) 800px minmax(0px,2fr);
- max-width:100vw;
- }
-
-
- #number-of-results{
- font-weight:bold;
- }
- #result-info{
- grid-row: 1;
- grid-column:2;
- align-self:center;
- }
- .page-button-row{
- grid-column: 2;
- justify-self: center;
- }
-
-
- .item-list{
- grid-row: 2;
- grid-column: 2;
- }
- .badge{
- background-color:#cccccc;
- }
-
- </style>
- </head>
- <body>
-$header
- <main>
- <div id="result-info">
- <div id="number-of-results">Approximately $number_of_results results ($number_of_pages pages)</div>
-$corrections
- </div>
- <div class="item-list">
-$results
- </div>
- <nav class="page-button-row">
-$page_buttons
- </nav>
- </main>
-
-
-
-
- </body>
-</html>