Example #1
0
	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