import functools from concurrent.futures.thread import ThreadPoolExecutor from datetime import datetime from queue import Queue from time import sleep import json import datetime from random import random import requests from idanchenko.backfill_apple.db_connections import get_valid_releases, dump_itunes_responses from idanchenko.backfill_apple.utils import WorkerPool def _db_worker(q, number): print(f'w_{format(number)}', '-', datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) items = [] counter = 0 while True: counter += 1 item = q.get() # sleep(0.01) if item is None: dump_itunes_responses(items) q.task_done() break items.append( (item['release_id'], item['display_upc'], item['upc'], item['response'], item['apple_artist_id'], item['result_count'])) if counter % 10 == 0: print('w_{} buffer {}'.format(number, len(items))) # sleep(0.5) if counter % 100 == 0: print( f'db dump in w_{number} - {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}') dump_itunes_responses(items) items = [] q.task_done() def request_itunes_by_upc(item, queue): params = {'upc': item['display_upc']} sleep(0.8) sleep(random()/10) try: response = requests.get('https://itunes.apple.com/lookup', params=params) response_data = response.text if response.text else None item['response'] = response_data item['result_count'] = None item['apple_artist_id'] = None parsed = json.loads(response_data) if parsed: item['result_count'] = parsed.get('resultCount') if item['result_count']: item['apple_artist_id'] = ( str(parsed.get('results')[0]["artistId"])) queue.put(item) except Exception as e: print('ERROR! ', e, f'CODE: {response.status_code}') print(f"https://itunes.apple.com/lookup/{item['upc']}") print(response.text) def gather_data(): releases = get_valid_releases() q = Queue(maxsize=600) db_worker_pool = WorkerPool(10, _db_worker, (q,)) with ThreadPoolExecutor(max_workers=12) as executor: executor.map( functools.partial(request_itunes_by_upc, queue=q), releases) q.join() q.put(None) db_worker_pool.add_stoppers(q) db_worker_pool.join_workers() print('Done') if __name__ == '__main__': pass gather_data()