main.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import sites as sites
  2. import console as console
  3. import os.path
  4. from settings import Settings
  5. def init():
  6. dbg_lvl = os.getenv('MD_LOGGING', 'ERROR')
  7. if dbg_lvl.lower() == 'info':
  8. Settings.Debuglvl = console.DBG_INFO
  9. else:
  10. Settings.Debuglvl = console.DBG_ERROR
  11. Settings.tmpDir = os.path.expanduser(os.getenv('MD_TMP', '/tmp'))
  12. directory(os.getenv('MD_SAVEDIR', '~/Music/iTunes/iTunes Media/Automatically Add to iTunes'))
  13. def main():
  14. init()
  15. console.output('Music downloader by Deben Oldert')
  16. console.output()
  17. console.output('Download directory: {0}'.format(Settings.SaveDir))
  18. console.output()
  19. help()
  20. console.output()
  21. console.output('Available sites: {0}'.format(', '.join(list(map(lambda x: x.url, sites.available)))))
  22. console.output('Selected site is: {0}'.format(sites.available[selected_site].url))
  23. console.output()
  24. while True:
  25. if not idle():
  26. break
  27. console.output('Quitting...')
  28. exit(0)
  29. def choose_site():
  30. global selected_site
  31. _index = console.option_picker('Available sites',
  32. list(map(lambda x: x.url, sites.available)),
  33. selected_site,
  34. True)
  35. if _index is not None:
  36. selected_site = _index
  37. return True
  38. def idle():
  39. _command = console.ask_input('Type command')
  40. for command in commands:
  41. if command[0] == _command.lower():
  42. return command[1]()
  43. console.output('Command \'{0}\' not found. Type help to see a list of possible commands'.format(_command))
  44. return True
  45. def help():
  46. console.output('Possible commands are:')
  47. for command in commands:
  48. console.output('{0}\t{1}'.format(command[0], command[2]))
  49. return True
  50. def search(cache=None):
  51. if cache is None:
  52. keywords = console.ask_input('Search for')
  53. _sites = []
  54. if isinstance(sites.available[selected_site], sites.DefaultSite):
  55. _sites = sites.available[1:]
  56. else:
  57. _sites = [sites.available[selected_site]]
  58. items = []
  59. for site in _sites:
  60. console.output('Searching: {0}'.format(site.url))
  61. _items = site.perform_search(keywords)
  62. console.output('\tFound {0} results'.format(len(_items)))
  63. items.extend(_items)
  64. if len(items) == 0:
  65. console.output('No results found')
  66. return True
  67. last(items)
  68. else:
  69. items = cache
  70. while True:
  71. picked_item = console.option_picker('Pick a song to download',
  72. items,
  73. # list(map(lambda x: '[{0:5}] [{1:4}] {2}'.format(x.duration, x.size, x.title), items)),
  74. quit=True,
  75. objects=[
  76. '__id__',
  77. 'x.duration',
  78. 'x.size',
  79. 'x.artist',
  80. 'x.title'
  81. ],
  82. table=[
  83. ('ID', 2),
  84. ('Time', 5),
  85. ('Size', 4),
  86. ('Artist', 50),
  87. ('Title', 100)
  88. ])
  89. if picked_item is None:
  90. break
  91. else:
  92. item = items[picked_item]
  93. console.output('Downloading {0}'.format(item.title))
  94. item.site.download(item)
  95. break
  96. return True
  97. def directory(dir=None):
  98. if dir is None:
  99. dir = console.ask_input('Enter new save directory')
  100. Settings.SaveDir = os.path.expanduser(dir)
  101. console.output('New save directory: {0}'.format(Settings.SaveDir), level=console.DBG_INFO)
  102. return True
  103. def last(items=None):
  104. global search_cache
  105. if items is not None:
  106. search_cache = items
  107. else:
  108. if search_cache is None:
  109. console.output('First search has yet te be made', console.DBG_ERROR)
  110. else:
  111. search(search_cache)
  112. return True
  113. def quit():
  114. return False
  115. selected_site = 0
  116. search_cache = None
  117. commands = [
  118. ('help', help, 'Display this list'),
  119. ('last', last, 'See the last search'),
  120. ('save', directory, 'Change the download directory'),
  121. ('search', search, 'Search the selected site'),
  122. ('sites', choose_site, 'Pick the site to search'),
  123. ('quit', quit, 'Quit the program')
  124. ]
  125. if __name__ == '__main__':
  126. main()