20from dateutil.parser
import parse
as ParseDate
22from flask
import Response
32 michaelsbirthday = ParseDate(
'2013-01-18')
34 for root, dirs, files
in os.walk(
'static/michael'):
36 basename, extension = os.path.splitext(f)
38 if extension !=
'.mp4':
41 fullpath = os.path.join(root, f)
43 stats = os.stat(fullpath)
45 date, description = basename.split(
' - ')
47 thumbfile = os.path.join(root, basename) +
'.webp'
49 if not os.path.exists(thumbfile):
61 currentage = ParseDate(date)
63 age = (currentage.replace(tzinfo =
None) - michaelsbirthday).days / 365.25
68 'size': stats.st_size,
69 'extension': extension,
70 'thumbnail': basename +
'.webp',
73 'description': description,
76 filelist.sort(key =
lambda x: x[
'date'])
82 <a class=
"VideoLink" href=
"/michael/{f['filename']}">
84 <img
class=
"Square600" src=
"/michael/{f['thumbnail']}">
86 <div
class=
"Description">{f[
'description']}<div>
87 <div
class=
"FileDate">{f[
'date'][0:10]}</div>
88 <div
class=
"Age">{f[
'age']} years old</div>
94 filelist = '\n'.join(ls)
100 <meta charset="UTF-8">
101 <meta name=
"apple-mobile-web-app-capable" content=
"yes" />
102 <meta name=
"mobile-web-app-capable" content=
"yes" />
103 <meta name=
"viewport" content=
"width=device-width,initial-scale=1">
105 <link rel=
"manifest" href=
"/manifest.json">
107 <title>Michael
's Videos</title>
109 <link rel="stylesheet" type=
"text/css" href=
"/system/normalize.css" />
110 <link rel=
"stylesheet" type=
"text/css" href=
"/system/colors.css" />
111 <link rel=
"stylesheet" type=
"text/css" href=
"/system/common.css" />
112 <link rel=
"stylesheet" type=
"text/css" href=
"/system/paferalib.css" />
113 <link rel=
"stylesheet" type=
"text/css" href=
"/system/pafera.css" />
130 background-image: linear-gradient(
139 padding-right: 0.5em;
162 justify-content: center;
205 return (typeof v ==
'string' || v instanceof String);
210 return Array.isArray(v);
213window.E = function(selector)
215 return IsString(selector)
216 ? document.querySelector(selector)
220window.L = console.log;
222window.Q = function(selector)
224 if (IsString(selector))
226 if (selector[0] ==
'#')
227 return [ I(selector.substr(1)) ];
229 return document.querySelectorAll(selector);
232 if (IsArray(selector) || selector instanceof NodeList)
241function SearchVideos()
243 let filter = E(
'.videosearch').value.toLowerCase();
244 let videos = Q(
'.VideoLink');
246 for (let i = 0, l = videos.length; i < l; i++)
248 let item = videos[i];
249 let description = item.querySelector(
'.Description').innerText;
250 let filedate = item.querySelector(
'.FileDate').innerText;
252 if ((description.toLowerCase().indexOf(filter) != -1)
253 || (filedate.indexOf(filter) != -1)
256 item.style.display =
'block';
259 item.style.display =
'none';
270 <img src=
"logo.webp">
274 <div class=
"ButtonBar">
275 <input type=
"text" class=
"videosearch">
276 <a
class=
"Color3" onclick=
"SearchVideos()">Search</a>
287# *********************************************************************