Esempio n. 1
0
def now_playing():
    query = store.find(User, Track.id == User.last_play_id)

    return request.formatter({
        'nowPlaying': {
            'entry': [
                dict(
                    u.last_play.as_subsonic_child(request.user).items() + {
                        'username': u.name,
                        'minutesAgo': (now() - u.last_play_date).seconds / 60,
                        'playerId': 0
                    }.items()) for u in query if u.last_play_date +
                timedelta(seconds=u.last_play.duration * 2) > now()
            ]
        }
    })
Esempio n. 2
0
def now_playing():
	query = store.find(User, Track.id == User.last_play_id)

	return request.formatter({
		'nowPlaying': {
			'entry': [ dict(
				u.last_play.as_subsonic_child(request.user).items() +
				{ 'username': u.name, 'minutesAgo': (now() - u.last_play_date).seconds / 60, 'playerId': 0 }.items()
			) for u in query if u.last_play_date + timedelta(seconds = u.last_play.duration * 2) > now() ]
		}
	})
Esempio n. 3
0
def stream_media():
	status, res = get_entity(request, Track)
	if not status:
		return res

	maxBitRate, format, timeOffset, size, estimateContentLength, client = map(request.values.get, [ 'maxBitRate', 'format', 'timeOffset', 'size', 'estimateContentLength', 'c' ])
	if format:
		format = format.lower()

	src_suffix = res.suffix()
	dst_suffix = res.suffix()
	dst_bitrate = res.bitrate
	dst_mimetype = res.content_type

	if client:
		prefs = store.get(ClientPrefs, (request.user.id, client))
		if not prefs:
			prefs = ClientPrefs()
			prefs.user_id = request.user.id
			prefs.client_name = client
			store.add(prefs)

		if prefs.format:
			dst_suffix = prefs.format
		if prefs.bitrate and prefs.bitrate < dst_bitrate:
			dst_bitrate = prefs.bitrate

	if maxBitRate:
		try:
			maxBitRate = int(maxBitRate)
		except:
			return request.error_formatter(0, 'Invalid bitrate value')

		if dst_bitrate > maxBitRate and maxBitRate != 0:
			dst_bitrate = maxBitRate

	if format and format != 'raw' and format != src_suffix:
		dst_suffix = format
		dst_mimetype = scanner.get_mime(dst_suffix)

	if format != 'raw' and (dst_suffix != src_suffix or dst_bitrate != res.bitrate):
		transcoder = config.get('transcoding', 'transcoder_{}_{}'.format(src_suffix, dst_suffix))
		decoder = config.get('transcoding', 'decoder_' + src_suffix) or config.get('transcoding', 'decoder')
		encoder = config.get('transcoding', 'encoder_' + dst_suffix) or config.get('transcoding', 'encoder')
		if not transcoder and (not decoder or not encoder):
			transcoder = config.get('transcoding', 'transcoder')
			if not transcoder:
				return request.error_formatter(0, 'No way to transcode from {} to {}'.format(src_suffix, dst_suffix))

		transcoder, decoder, encoder = map(lambda x: prepare_transcoding_cmdline(x, res.path, src_suffix, dst_suffix, dst_bitrate), [ transcoder, decoder, encoder ])
		try:
			if transcoder:
				dec_proc = None
				proc = subprocess.Popen(transcoder, stdout = subprocess.PIPE)
			else:
				dec_proc = subprocess.Popen(decoder, stdout = subprocess.PIPE)
				proc = subprocess.Popen(encoder, stdin = dec_proc.stdout, stdout = subprocess.PIPE)
		except:
			return request.error_formatter(0, 'Error while running the transcoding process')

		def transcode():
			try:
				while True:
					data = proc.stdout.read(8192)
					if not data:
						break
					yield data
			except:
				if dec_proc != None:
					dec_proc.terminate()
				proc.terminate()

			if dec_proc != None:
				dec_proc.wait()
			proc.wait()

		app.logger.info('Transcoding track {0.id} for user {1.id}. Source: {2} at {0.bitrate}kbps. Dest: {3} at {4}kbps'.format(res, request.user, src_suffix, dst_suffix, dst_bitrate))
		response = Response(transcode(), mimetype = dst_mimetype)
	else:
		response = send_file(res.path, mimetype = dst_mimetype)

	res.play_count = res.play_count + 1
	res.last_play = now()
	request.user.last_play = res
	request.user.last_play_date = now()
	store.commit()

	return response
Esempio n. 4
0
def stream_media():
    status, res = get_entity(request, Track)
    if not status:
        return res

    maxBitRate, format, timeOffset, size, estimateContentLength = map(
        request.values.get, [
            'maxBitRate', 'format', 'timeOffset', 'size',
            'estimateContentLength'
        ])
    if format:
        format = format.lower()

    src_suffix = res.suffix()
    dst_suffix = res.suffix()
    dst_bitrate = res.bitrate
    dst_mimetype = res.content_type

    if request.prefs.format:
        dst_suffix = request.prefs.format
    if request.prefs.bitrate and request.prefs.bitrate < dst_bitrate:
        dst_bitrate = request.prefs.bitrate

    if maxBitRate:
        try:
            maxBitRate = int(maxBitRate)
        except:
            return request.error_formatter(0, 'Invalid bitrate value')

        if dst_bitrate > maxBitRate and maxBitRate != 0:
            dst_bitrate = maxBitRate

    if format and format != 'raw' and format != src_suffix:
        dst_suffix = format
        dst_mimetype = mimetypes.guess_type(
            'dummyname.' + dst_suffix, False)[0] or 'application/octet-stream'

    if format != 'raw' and (dst_suffix != src_suffix
                            or dst_bitrate != res.bitrate):
        config = app.config['TRANSCODING']
        transcoder = config.get('transcoder_{}_{}'.format(
            src_suffix, dst_suffix))
        decoder = config.get('decoder_' + src_suffix) or config.get('decoder')
        encoder = config.get('encoder_' + dst_suffix) or config.get('encoder')
        if not transcoder and (not decoder or not encoder):
            transcoder = config.get('transcoder')
            if not transcoder:
                message = 'No way to transcode from {} to {}'.format(
                    src_suffix, dst_suffix)
                app.logger.info(message)
                return request.error_formatter(0, message)

        transcoder, decoder, encoder = map(
            lambda x: prepare_transcoding_cmdline(x, res.path, src_suffix,
                                                  dst_suffix, dst_bitrate),
            [transcoder, decoder, encoder])
        try:
            if transcoder:
                dec_proc = None
                proc = subprocess.Popen(transcoder, stdout=subprocess.PIPE)
            else:
                dec_proc = subprocess.Popen(decoder, stdout=subprocess.PIPE)
                proc = subprocess.Popen(encoder,
                                        stdin=dec_proc.stdout,
                                        stdout=subprocess.PIPE)
        except:
            return request.error_formatter(
                0, 'Error while running the transcoding process')

        def transcode():
            try:
                while True:
                    data = proc.stdout.read(8192)
                    if not data:
                        break
                    yield data
            except:
                if dec_proc != None:
                    dec_proc.terminate()
                proc.terminate()

            if dec_proc != None:
                dec_proc.wait()
            proc.wait()

        app.logger.info(
            'Transcoding track {0.id} for user {1.id}. Source: {2} at {0.bitrate}kbps. Dest: {3} at {4}kbps'
            .format(res, request.user, src_suffix, dst_suffix, dst_bitrate))
        response = Response(transcode(), mimetype=dst_mimetype)
    else:
        response = send_file(res.path, mimetype=dst_mimetype, conditional=True)

    res.play_count = res.play_count + 1
    res.last_play = now()
    request.user.last_play = res
    request.user.last_play_date = now()
    store.commit()

    return response
Esempio n. 5
0
def stream_media():
	status, res = get_entity(request, Track)
	if not status:
		return res

	maxBitRate, format, timeOffset, size, estimateContentLength, client = map(request.args.get, [ 'maxBitRate', 'format', 'timeOffset', 'size', 'estimateContentLength', 'c' ])
	if format:
		format = format.lower()

	src_suffix = res.suffix()
	dst_suffix = res.suffix()
	dst_bitrate = res.bitrate
	dst_mimetype = res.content_type

	if client:
		prefs = store.get(ClientPrefs, (request.user.id, client))
		if not prefs:
			prefs = ClientPrefs()
			prefs.user_id = request.user.id
			prefs.client_name = client
			store.add(prefs)

		if prefs.format:
			dst_suffix = prefs.format
		if prefs.bitrate and prefs.bitrate < dst_bitrate:
			dst_bitrate = prefs.bitrate

	if maxBitRate:
		try:
			maxBitRate = int(maxBitRate)
		except:
			return request.error_formatter(0, 'Invalid bitrate value')

		if dst_bitrate > maxBitRate and maxBitRate != 0:
			dst_bitrate = maxBitRate

	if format and format != 'raw' and format != src_suffix:
		dst_suffix = format
		dst_mimetype = scanner.get_mime(dst_suffix)

	if format != 'raw' and (dst_suffix != src_suffix or dst_bitrate != res.bitrate):
		transcoder = config.get('transcoding', 'transcoder_{}_{}'.format(src_suffix, dst_suffix))
		decoder = config.get('transcoding', 'decoder_' + src_suffix) or config.get('transcoding', 'decoder')
		encoder = config.get('transcoding', 'encoder_' + dst_suffix) or config.get('transcoding', 'encoder')
		if not transcoder and (not decoder or not encoder):
			transcoder = config.get('transcoding', 'transcoder')
			if not transcoder:
				return request.error_formatter(0, 'No way to transcode from {} to {}'.format(src_suffix, dst_suffix))

		transcoder, decoder, encoder = map(lambda x: prepare_transcoding_cmdline(x, res.path, src_suffix, dst_suffix, dst_bitrate), [ transcoder, decoder, encoder ])
		try:
			if transcoder:
				proc = subprocess.Popen(transcoder, stdout = subprocess.PIPE)
			else:
				dec_proc = subprocess.Popen(decoder, stdout = subprocess.PIPE)
				proc = subprocess.Popen(encoder, stdin = dec_proc.stdout, stdout = subprocess.PIPE)
		except:
			return request.error_formatter(0, 'Error while running the transcoding process')

		def transcode():
			while True:
				data = proc.stdout.read(8192)
				if not data:
					break
				yield data
			proc.terminate()
			proc.wait()

		app.logger.info('Transcoding track {0.id} for user {1.id}. Source: {2} at {0.bitrate}kbps. Dest: {3} at {4}kbps'.format(res, request.user, src_suffix, dst_suffix, dst_bitrate))
		response = Response(transcode(), mimetype = dst_mimetype)
	else:
		response = send_file(res.path, mimetype = dst_mimetype)

	res.play_count = res.play_count + 1
	res.last_play = now()
	request.user.last_play = res
	request.user.last_play_date = now()
	store.commit()

	return response