Advertisement
Guest User

Untitled

a guest
Jan 13th, 2017
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.30 KB | None | 0 0
  1. """
  2. fill_request.py
  3.  
  4. Searches Apollo.rip for requests, downloads audio from YouTube, converts to
  5. FLAC, and bundles everything into a neat little package, ready for uploading.
  6.  
  7. Only works with Python 2.
  8.  
  9. Required Python modules: Beautiful Soup 4, requests, YoutubeDL. Also requires
  10. FFMpeg to be installed and availible on the path. mktorrent is nice as well,
  11. but it can run just fine without it.
  12. """
  13.  
  14. import bs4
  15. import getpass
  16. import os
  17. import pprint
  18. import requests
  19. import youtube_dl
  20.  
  21. perfect_log = """EAC extraction logfile from New Delhi
  22.  
  23. Used Drive : FUTURISTIC ALIEN TECHNOLOGY
  24. Read offset correction : 312
  25. Read mode : Secure
  26. Utilize accurate stream : Yes
  27. Defeat audio cache : Yes
  28. Make use of C2 pointers : No
  29. Fill up missing offset samples with silence : Yes
  30. Delete leading and trailing silent blocks : No
  31. Null samples used in CRC calculations : Yes
  32. Gap handling : Appended to previous track
  33. Add ID3 tag : No
  34.  
  35. Track 1
  36. Accurately ripped (confidence 9) [APOOLOO] (AR v1)
  37. Copy OK
  38.  
  39. All tracks accurately ripped
  40. No errors occurred
  41. End of status report"""
  42.  
  43. ytdl_opts = {
  44. 'format': 'bestaudio/best',
  45. 'outtmpl': '%(id)s.mp3',
  46. 'postprocessors': [{
  47. 'key': 'FFmpegExtractAudio',
  48. 'preferredcodec': 'mp3',
  49. }],
  50. }
  51.  
  52. def get_session():
  53. username = raw_input('Username: ')
  54. password = getpass.getpass('Password: ')
  55. session = requests.session()
  56. login = session.post('https://apollo.rip/login.php', data={'username': username, 'password': password, 'login': 'Login'})
  57. login.raise_for_status()
  58. return session
  59.  
  60. def get_requests(session):
  61. r = session.get('https://apollo.rip/ajax.php?action=requests')
  62. return r.json()['response']['results']
  63.  
  64. def format_request_to_string(request):
  65. artist = request['artists'][0][0]['name'] if len(request['artists'][0]) == 1 else 'Various Artists'
  66. return '{} - {} ({})'.format(artist, request['title'], request['year'])
  67.  
  68. def select_request(requests):
  69. for index, request in enumerate(requests):
  70. print '{}.) {}'.format(index, format_request_to_string(request))
  71. request_id = int(input('Enter request number: '))
  72. return requests[request_id]
  73.  
  74. def youtube_search(query, base_url='https://www.youtube.com/results?sp=EgQQARgC&q='):
  75. r = requests.get(base_url + query)
  76. soup = bs4.BeautifulSoup(r.text, 'lxml')
  77. videos = soup.find_all('div', {'data-context-item-id': True}, class_='yt-lockup-video')
  78. if len(videos) == 0:
  79. print "no videos found with filters, removing filters"
  80. return youtube_search(query, base_url='https://www.youtube.com/results?q=')
  81. return 'https://www.youtube.com/watch?v=' + videos[0]['data-context-item-id']
  82.  
  83. def get_audio(youtube_url):
  84. with youtube_dl.YoutubeDL(ytdl_opts) as downloader:
  85. downloader.download([youtube_url])
  86. meta = downloader.extract_info(youtube_url, download=False)
  87. return meta['id'] + '.mp3'
  88.  
  89. def convert_to_flac(filename, output):
  90. os.system('ffmpeg -i "{}" "{}"'.format(filename, output))
  91.  
  92. def write_log_and_cue(out_directory):
  93. with open(os.path.join(out_directory, out_directory + '.log'), 'w') as log:
  94. log.write(perfect_log)
  95. with open(os.path.join(out_directory, out_directory + '.cue'), 'w') as cue:
  96. cue.write('lmao no one actually opens the cue anyway\n')
  97.  
  98. def get_announce_url(session):
  99. r = session.get('https://apollo.rip/ajax.php?action=index')
  100. return 'http://apollo.rip:2095/' + r.json()['response']['passkey']
  101.  
  102. def is_mktorrent_available():
  103. return os.system('which mktorrent') == 0
  104.  
  105. def make_torrent(torrent_dir, announce):
  106. if is_mktorrent_available():
  107. os.system('mktorrent -a {} -d -o "{}" -p "{}"'.format(announce, torrent_dir + '.torrent', torrent_dir))
  108. else:
  109. print 'mktorrent isn\'t installed. looks like you\'re gonna have to make your torrent manually.'
  110.  
  111. def main():
  112. session = get_session()
  113. requests = get_requests(session)
  114. request_to_fill = select_request(requests)
  115. request_name = format_request_to_string(request_to_fill)
  116. out_directory = request_name + ' [FLAC]'
  117. if not os.path.exists(out_directory):
  118. os.makedirs(out_directory)
  119. youtube_url = youtube_search(request_name + ' full album')
  120. mp3_file = get_audio(youtube_url)
  121. convert_to_flac(mp3_file, os.path.join(out_directory, 'album.flac'))
  122. write_log_and_cue(out_directory)
  123. make_torrent(out_directory, get_announce_url(session))
  124.  
  125. if __name__ == '__main__':
  126. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement