from __future__ import unicode_literals

from builtins import str
from .dag import get_outgoing_edges
from ._run import topo_sort
import tempfile

from ffmpeg.nodes import (
    FilterNode,
    get_stream_spec_nodes,
    InputNode,
    OutputNode,
    stream_operator,
)


_RIGHT_ARROW = '\u2192'


def _get_node_color(node):
    if isinstance(node, InputNode):
        color = '#99cc00'
    elif isinstance(node, OutputNode):
        color = '#99ccff'
    elif isinstance(node, FilterNode):
        color = '#ffcc00'
    else:
        color = None
    return color


@stream_operator()
def view(stream_spec, **kwargs):
    try:
        import graphviz
    except ImportError:
        raise ImportError('failed to import graphviz; please make sure graphviz is installed (e.g. `pip install '
            'graphviz`)')

    filename = kwargs.pop('filename', None)
    show_labels = kwargs.pop('show_labels', True)
    if filename is None:
        filename = tempfile.mktemp()

    nodes = get_stream_spec_nodes(stream_spec)

    sorted_nodes, outgoing_edge_maps = topo_sort(nodes)
    graph = graphviz.Digraph()
    graph.attr(rankdir='LR')
    if len(list(kwargs.keys())) != 0:
        raise ValueError('Invalid kwargs key(s): {}'.format(', '.join(list(kwargs.keys()))))

    for node in sorted_nodes:
        color = _get_node_color(node)

        graph.node(str(hash(node)), node.short_repr, shape='box', style='filled', fillcolor=color)
        outgoing_edge_map = outgoing_edge_maps.get(node, {})

        for edge in get_outgoing_edges(node, outgoing_edge_map):
            kwargs = {}
            up_label = edge.upstream_label
            down_label = edge.downstream_label
            up_selector = edge.upstream_selector

            if show_labels and (up_label is not None or down_label is not None or up_selector is not None):
                if up_label is None:
                    up_label = ''
                if up_selector is not None:
                    up_label += ":" + up_selector
                if down_label is None:
                    down_label = ''
                if up_label != '' and down_label != '':
                    middle = ' {} '.format(_RIGHT_ARROW)
                else:
                    middle = ''
                kwargs['label'] = '{}  {}  {}'.format(up_label, middle, down_label)
            upstream_node_id = str(hash(edge.upstream_node))
            downstream_node_id = str(hash(edge.downstream_node))
            graph.edge(upstream_node_id, downstream_node_id, **kwargs)

    graph.view(filename, cleanup=True)

    return stream_spec


__all__ = [
    'view',
]

@@ -601,16 +601,57 @@
 am_spec,
+ detail=False, filename=None, pipe=False,
  **kwarg
@@ -654,16 +654,16 @@
 wargs):%0A
-
     try:
@@ -856,52 +856,8 @@
 ')%0A%0A
-    filename = kwargs.pop('filename', None)%0A
     
@@ -909,16 +909,139 @@
 %0A    if 
+pipe and filename is not None:%0A        raise ValueError('Can%5C't specify both %60filename%60 and %60pipe%60')%0A    elif not pipe and 
 filename
@@ -1221,16 +1221,28 @@
 Digraph(
+format='png'
 )%0A    gr
@@ -1477,51 +1477,354 @@
     
-graph.node(str(hash(node)), node.short_repr
+if detail:%0A            lines = %5Bnode.short_repr%5D%0A            lines += %5B'%7B!r%7D'.format(arg) for arg in node.args%5D%0A            lines += %5B'%7B%7D=%7B!r%7D'.format(key, node.kwargs%5Bkey%5D) for key in sorted(node.kwargs)%5D%0A            node_text = '%5Cn'.join(lines)%0A        else:%0A            node_text = node.short_repr%0A        graph.node(str(hash(node)), node_text
 , sh
@@ -2955,16 +2955,71 @@
 wargs)%0A%0A
+    if pipe:%0A        return graph.pipe()%0A    else:%0A    
     grap
@@ -3049,17 +3049,20 @@
 p=True)%0A
-%0A
+    
     retu

Add `pipe` param to `view`