main.py 4.6 KB

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