main.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import sites as sites
  2. from helper.settings import Settings
  3. from helper import console as console
  4. import os.path
  5. def main():
  6. os.makedirs(Settings.tmpDir.get(), exist_ok=True)
  7. console.unlock()
  8. console.output('Music downloader by Deben Oldert')
  9. console.output()
  10. console.output('Download directory: {0}'.format(Settings.SaveDir.get()))
  11. console.output()
  12. help()
  13. console.output()
  14. console.output('Available sites: {0}'.format(', '.join(list(map(lambda x: x.url, sites.available)))))
  15. console.output('Selected site is: {0}'.format(sites.available[selected_site].url))
  16. console.output()
  17. while True:
  18. if not idle():
  19. break
  20. console.output('Quitting...')
  21. exit(0)
  22. def choose_site():
  23. global selected_site
  24. _index = console.option_picker('Available sites',
  25. list(map(lambda x: x.url, sites.available)),
  26. selected_site,
  27. True)
  28. if _index is not None:
  29. selected_site = _index
  30. return True
  31. def idle():
  32. _command = console.ask_input('Type command')
  33. for command in commands:
  34. if command[0] == _command.lower():
  35. return command[1]()
  36. console.output('Command \'{0}\' not found. Type help to see a list of possible commands'.format(_command))
  37. return True
  38. def help():
  39. console.output('Possible commands are:')
  40. for command in commands:
  41. console.output('{0}\t{1}'.format(command[0], command[2]))
  42. return True
  43. def search(cache=None):
  44. if cache is None:
  45. keywords = console.ask_input('Search for')
  46. _sites = []
  47. if isinstance(sites.available[selected_site], sites.DefaultSite):
  48. _sites = sites.available[1:]
  49. else:
  50. _sites = [sites.available[selected_site]]
  51. items = []
  52. for site in _sites:
  53. console.output('Searching: {0}'.format(site.url))
  54. _items = site.perform_search(keywords)
  55. console.output('\tFound {0} results'.format(len(_items)))
  56. items.extend(_items)
  57. if len(items) == 0:
  58. console.output('No results found')
  59. return True
  60. last(items)
  61. else:
  62. items = cache
  63. while True:
  64. picked_item = console.option_picker('Pick a song to download',
  65. items,
  66. # list(map(lambda x: '[{0:5}] [{1:4}] {2}'.format(x.duration, x.size, x.title), items)),
  67. quit=True,
  68. objects=[
  69. '__id__',
  70. 'x.duration',
  71. 'x.size',
  72. 'x.artist',
  73. 'x.title'
  74. ],
  75. table=[
  76. ('ID', 2),
  77. ('Time', 5),
  78. ('Size', 4),
  79. ('Artist', 50),
  80. ('Title', 100)
  81. ])
  82. if picked_item is None:
  83. break
  84. else:
  85. item = items[picked_item]
  86. console.output('Downloading {0}'.format(item.title))
  87. item.site.download(item)
  88. break
  89. return True
  90. def directory(dir=None):
  91. if dir is None:
  92. dir = console.ask_input('Enter new save directory')
  93. Settings.SaveDir.set(dir)
  94. os.makedirs(Settings.SaveDir.get(), exist_ok=True)
  95. console.output('New save directory: {0}'.format(Settings.SaveDir.get()), level=console.DBG_INFO)
  96. return True
  97. def quality(quality=None):
  98. if quality is None:
  99. quality = console.ask_input('Enter minimal quality for auto download')
  100. Settings.MinQuality.set(quality)
  101. console.output('Minimal quality for auto downloading is set to {0}'.format(Settings.MinQuality.get()), 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. ('quality', quality, 'Set the minimal quality to download without confirmation'),
  124. ('quit', quit, 'Quit the program')
  125. ]
  126. if __name__ == '__main__':
  127. main()