mythtv-scripts/python/bookmarks.py
2010-12-07 04:38:11 -05:00

99 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#----------------------
import os
import sys
from HTMLParser import HTMLParser
try:
from MythTV import MythDB
from MythTV.database import DBDataWrite
except:
print 'ERROR: The python bindings are not installed'
sys.exit(-1)
class Bookmark( DBDataWrite ):
_table = 'websites'
_defaults = {'id':None, 'category':u'', 'name':u'', 'url':u''}
_schema_value = 'BrowserDBSchemaVer'
_schema_local = 1002
_schema_name = 'MythBrowser'
def create(self, data=None):
id = DBDataWrite.create(self, data)
self.wheredat = (id,)
self._pull()
return self
class Parser( HTMLParser ):
def __init__(self):
HTMLParser.__init__(self)
self.stack = []
def handle_starttag(self, tag, attrs):
if tag == 'h3':
# new category, push to stack
self.stack.append('h3')
elif not len(self.stack):
# no categories, refuse links
return
elif tag == 'a':
# new bookmark, push to stack
d = dict(attrs)
self.stack.append(d['href'])
self.stack.append('a')
def handle_endtag(self, tag):
if not len(self.stack):
# empty stack, do nothing
return
elif tag == 'dl':
# drop out of category, pop from stack
self.stack.pop()
def handle_data(self, data):
if not len(self.stack):
# empty stack, do nothing
return
elif self.stack[-1] == 'h3':
# new category name, swap on stack
self.stack[-1] = data
elif self.stack[-1] == 'a':
# new link name, swap on stack
self.stack[-1] = data
# create new bookmark in database
b = Bookmark(db=db)
b.name = self.stack.pop()
b.url = self.stack.pop()
b.category = self.stack[-1]
b.create()
# select file
bookmark_file = '~/bookmarks.html'
if len(sys.argv) == 2:
bookmark_file = sys.argv[1]
# check if file exists
if not os.access(os.path.expanduser(bookmark_file), os.F_OK):
print 'ERROR: bookmark file could not be found'
sys.exit(-1)
# connect to database
try:
db = MythDB()
except:
print 'ERROR: database could not be accessed'
sys.exit(-1)
# flush old entries and reset counter
c = db.cursor()
c.execute("""TRUNCATE TABLE websites""")
c.close()
# read in file
fp = open(os.path.expanduser(bookmark_file))
data = ''.join(fp.readlines())
fp.close()
# parse file for bookmarks
parser = Parser()
parser.feed(data)