main.py 5.6 KB

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