Skip to content

Instantly share code, notes, and snippets.

@0xallie
Last active March 20, 2020 23:40
Show Gist options
  • Save 0xallie/a546b1e76e9939a6a59dc505334fa751 to your computer and use it in GitHub Desktop.
Save 0xallie/a546b1e76e9939a6a59dc505334fa751 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import argparse
import json
from datetime import datetime
import bs4
import pytz
import requests
import tzlocal
def parse_page(url):
musorok = []
r = requests.get(
url,
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36',
},
)
soup = bs4.BeautifulSoup(r.text, 'lxml')
for entry in soup.select('.multicolumndayprogarea .smartpe_progentry'):
musor = {}
start_raw = entry.select('.smartpe_time')[0]['content']
start_utc = datetime.strptime(start_raw, '%Y-%m-%dGMT%H:%M:%S')
start_local = start_utc.replace(tzinfo=pytz.utc).astimezone(tzlocal.get_localzone())
start_fmt = start_local.strftime('%Y-%m-%d %H:%M')
musor['start'] = start_fmt
name = entry.select('a')[0].get_text()
musor['name'] = name
desc = entry.select('.smartpe_progshortdesc')[0].get_text()
if desc.isdigit():
try:
desc = next(entry.select('.smartpe_progentrylong')[0].stripped_strings)
except StopIteration:
desc = ''
musor['desc'] = desc
premier = entry.select('[class^="smartpe_recommendation_premier"]')
musor['premier'] = bool(premier)
musorok.append(musor)
for (i, musor) in enumerate(musorok):
if i < len(musorok) - 1:
musor['end'] = musorok[i + 1]['start']
else:
musor['end'] = ''
musorok = [x for x in musorok if x['start'].split()[0] == musorok[0]['start'].split()[0]]
return musorok
if __name__ == '__main__':
parser = argparse.ArgumentParser(prog='musortv')
parser.add_argument(
'-r', '--raw',
action='store_true',
help='print raw JSON data',
)
parser.add_argument(
'urls',
nargs='+',
metavar='URL',
help='musor.tv URL',
)
args = parser.parse_args()
for url in args.urls:
data = parse_page(url)
if args.raw:
print(json.dumps(data, indent=2))
else:
for musor in data:
premier = '(PREMIER)' if musor['premier'] else ''
end = musor['end'].split()[1] if musor['end'] else ''
print(f'[{musor["start"]} - {end:>5}] {musor["name"]} [{musor["desc"]}] {premier}')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment