main.py 5.2 KB

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