MythTV  master
filelyrics.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
3 # ----------------------
4 """
5 Scraper for file lyrics
6 """
7 
8 import sys, os, re, chardet
9 import xml.dom.minidom as xml
10 from optparse import OptionParser
11 from common import *
12 
13 __author__ = "Paul Harrison"
14 __title__ = "FileLyrics"
15 __description__ = "Search the same directory as the track for lyrics"
16 __version__ = "0.1"
17 __priority__ = "90"
18 __syncronized__ = True
19 
20 debug = False
21 
22 
24 
25 
26  def get_lyrics(self, lyrics):
27  utilities.log(debug, "%s: searching lyrics for %s - %s - %s" % (__title__, lyrics.artist, lyrics.album, lyrics.title))
28 
29  filename = lyrics.filename
30  filename = os.path.splitext(filename)[0]
31 
32  # look for a file ending in .lrc with the same filename as the track minus the extension
33  lyricFile = filename + '.lrc'
34  utilities.log(debug, "%s: searching for lyrics file: %s " % (__title__, lyricFile))
35  if os.path.exists(lyricFile) and os.path.isfile(lyricFile):
36  #load the text file
37  with open (lyricFile, "r") as f:
38  lines = f.readlines()
39 
40  for line in lines:
41  lyrics.lyrics += line
42 
43  return True
44 
45  return False;
46 
48  found = False
49  lyrics = utilities.Lyrics()
50  lyrics.source = __title__
51  lyrics.syncronized = __syncronized__
52  lyrics.artist = 'Robb Benson'
53  lyrics.album = 'Demo Tracks'
54  lyrics.title = 'Lone Rock'
55  lyrics.filename = os.path.dirname(os.path.abspath(__file__)) + '/examples/filelyrics.mp3'
56  fetcher = LyricsFetcher()
57  found = fetcher.get_lyrics(lyrics)
58 
59  if found:
60  try:
61  buildLyrics(lyrics)
62  except:
63  utilities.log(True, "Failed to build lyrics xml file. "
64  "Maybe you don't have lxml installed?")
65  sys.exit(1)
66 
67  utilities.log(True, "Everything appears in order.")
68  sys.exit(0)
69 
70  utilities.log(True, "Failed to find the lyrics for the test search!")
71  sys.exit(1)
72 
73 def buildLyrics(lyrics):
74  from lxml import etree
75  xml = etree.XML(u'<lyrics></lyrics>')
76  etree.SubElement(xml, "artist").text = lyrics.artist
77  etree.SubElement(xml, "album").text = lyrics.album
78  etree.SubElement(xml, "title").text = lyrics.title
79  etree.SubElement(xml, "syncronized").text = 'True' if __syncronized__ else 'False'
80  etree.SubElement(xml, "grabber").text = lyrics.source
81 
82  lines = lyrics.lyrics.splitlines()
83  for line in lines:
84  etree.SubElement(xml, "lyric").text = line
85 
86  utilities.log(True, utilities.convert_etree(etree.tostring(xml, encoding='UTF-8',
87  pretty_print=True, xml_declaration=True)))
88 
90  from lxml import etree
91  version = etree.XML(u'<grabber></grabber>')
92  etree.SubElement(version, "name").text = __title__
93  etree.SubElement(version, "author").text = __author__
94  etree.SubElement(version, "command").text = 'filelyrics.py'
95  etree.SubElement(version, "type").text = 'lyrics'
96  etree.SubElement(version, "description").text = __description__
97  etree.SubElement(version, "version").text = __version__
98  etree.SubElement(version, "priority").text = __priority__
99  etree.SubElement(version, "syncronized").text = 'True' if __syncronized__ else 'False'
100 
101  utilities.log(True, utilities.convert_etree(etree.tostring(version, encoding='UTF-8',
102  pretty_print=True, xml_declaration=True)))
103  sys.exit(0)
104 
105 def main():
106  global debug
107 
108  parser = OptionParser()
109 
110  parser.add_option('-v', "--version", action="store_true", default=False,
111  dest="version", help="Display version and author")
112  parser.add_option('-t', "--test", action="store_true", default=False,
113  dest="test", help="Perform self-test for dependencies.")
114  parser.add_option('-s', "--search", action="store_true", default=False,
115  dest="search", help="Search for lyrics.")
116  parser.add_option('-a', "--artist", metavar="ARTIST", default=None,
117  dest="artist", help="Artist of track.")
118  parser.add_option('-b', "--album", metavar="ALBUM", default=None,
119  dest="album", help="Album of track.")
120  parser.add_option('-n', "--title", metavar="TITLE", default=None,
121  dest="title", help="Title of track.")
122  parser.add_option('-f', "--filename", metavar="FILENAME", default=None,
123  dest="filename", help="Filename of track.")
124  parser.add_option('-d', '--debug', action="store_true", default=False,
125  dest="debug", help=("Show debug messages"))
126 
127  opts, args = parser.parse_args()
128 
129  lyrics = utilities.Lyrics()
130  lyrics.source = __title__
131  lyrics.syncronized = __syncronized__
132 
133  if opts.debug:
134  debug = True
135 
136  if opts.version:
137  buildVersion()
138 
139  if opts.test:
141 
142  if opts.artist:
143  lyrics.artist = opts.artist
144  if opts.album:
145  lyrics.album = opts.album
146  if opts.title:
147  lyrics.title = opts.title
148  if opts.filename:
149  lyrics.filename = opts.filename
150 
151  fetcher = LyricsFetcher()
152  if fetcher.get_lyrics(lyrics):
153  buildLyrics(lyrics)
154  sys.exit(0)
155  else:
156  utilities.log(True, "No lyrics found for this track")
157  sys.exit(1)
158 
159 if __name__ == '__main__':
160  main()
filelyrics.main
def main()
Definition: filelyrics.py:105
filelyrics.LyricsFetcher.get_lyrics
def get_lyrics(self, lyrics)
Definition: filelyrics.py:26
filelyrics.LyricsFetcher
Definition: filelyrics.py:23
filelyrics.performSelfTest
def performSelfTest()
Definition: filelyrics.py:47
filelyrics.buildLyrics
def buildLyrics(lyrics)
Definition: filelyrics.py:73
filelyrics.buildVersion
def buildVersion()
Definition: filelyrics.py:89