#!/usr/bin/python2
# copyright 2015 johan gunnarsson <johan.gunnarsson@gmail.com>

import sys, os, os.path, tempfile, subprocess, time, shutil, argparse

players = [
	"omxplayer --timeout 60",
	"vlc --file-caching 10000",
	"mpv --cache-min=1",
	"mplayer --cache-min=1",
]

parser = argparse.ArgumentParser()

parser.add_argument("-p", "--player", action="store",
	help="player to launch")
parser.add_argument("URI", action="store",
	help="magnet link or HTTP metadata URL to play")

args = parser.parse_args()

def which(x):
	for d in os.getenv("PATH", "").split(":"):
		if os.path.exists(os.path.join(d, x)):
			return os.path.join(d, x)

def find_player(players):
	for player in players:
		if which(player.split(" ", 1)[0]):
			return player

cmd = find_player([args.player] if args.player else players)

if not cmd:
	print >>sys.stderr, "Could not find a player"
	sys.exit(1)

mountpoint = tempfile.mkdtemp(prefix="btplay-")

ret = subprocess.call(("btfs", args.URI, mountpoint, ))

def find_files(p):
	for dirpath, dnames, fnames in os.walk(p):
		for f in fnames:
			yield os.path.join(dirpath, f)

def is_sample(x):
	return "sample" in [x.lower() for x in x.split(os.sep)]

def is_video(x):
	return any([x.lower().endswith(e) for e in (".mp4", ".mkv", ".avi")])

if ret == 0:
	try:
		while len(os.listdir(mountpoint)) <= 0:
			time.sleep(0.25)

		media = sorted(filter(
			lambda a: not is_sample(a) and is_video(a),
			find_files(mountpoint)))

		if len(media) > 0:
			ret = subprocess.call(
				"%s %s" % (cmd, " ".join(media)),
				shell=True,
				stdin=sys.stdin)
		else:
			print >>sys.stderr, "No video media found"
	except KeyboardInterrupt:
		ret = 1
	except:
		ret = 2
	finally:
		subprocess.call(("fusermount", "-u", mountpoint, ))

shutil.rmtree(mountpoint)

sys.exit(ret)
