def add_track_to_buffer(self,incoming_track): buffer = self.reorder_buffer(self.buffer) new_broadcasts = buffer['broadcasts'][::] # Copy array and resting broadcasts timestamp = buffer['timestamp'] room = self.room_in_buffer() # Edge Case, if adding track to position 1 5 seconds before the live track ends, we reject the operation. # This is due to the latency of Pubnub. if(len(new_broadcasts) == 1): # We need to check if the live track ends in the next 5 seconds live_broadcast = new_broadcasts[0] live_broadcast_duration = live_broadcast['duration'] start = timegm(datetime.utcnow().utctimetuple()) - timegm(timestamp.utctimetuple()) time_before_end = live_broadcast_duration-start if(time_before_end< 5): # Rejecting action logging.info("Rejecting operation because of an edge case (adding)") return None # End of edge case extended_broadcast = None if(room > 0): logging.info("Room in buffer") track = Track.get_or_insert(incoming_track, self.station) if track: logging.info("Track found") submitter_key = None if(incoming_track["track_submitter_key_name"] != self.station.key().name()): submitter_key_name = incoming_track["track_submitter_key_name"] submitter_key = db.Key.from_path("Station", submitter_key_name) if(track.youtube_id): new_broadcast = Broadcast( key_name = incoming_track["key_name"], track = track.key(), youtube_id = track.youtube_id, youtube_title = track.youtube_title, youtube_duration = track.youtube_duration, station = self.station.key(), submitter = submitter_key, ) else: new_broadcast = Broadcast( key_name = incoming_track["key_name"], track = track.key(), soundcloud_id = track.soundcloud_id, soundcloud_title = track.soundcloud_title, soundcloud_duration = track.soundcloud_duration, soundcloud_thumbnail = track.soundcloud_thumbnail, station = self.station.key(), submitter = submitter_key, ) new_broadcast.put() logging.info("New broadcast put in datastore") extended_broadcast = Broadcast.get_extended_broadcasts([new_broadcast], self.station)[0] # Injecting traks in buffer new_broadcasts.append(extended_broadcast) new_buffer = { 'broadcasts': new_broadcasts, 'timestamp': timestamp } # Save data self.put_buffer(new_buffer) else: logging.info("Track not found") else: logging.info("There is no more room in the buffer.") return extended_broadcast