main.py 4.7 KB

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