This is my attempt based on the guide. It seems to work, but it’s a bit messy though.
ClearAll[myIGLayoutPlanar];
Options[myIGLayoutPlanar]=Options[Graph];
myIGLayoutPlanar[g_Graph,opts:OptionsPattern[]]:=Module[{g1,rule,mapping, newEdges,subdivideg,glayout,coords,coorToEdge, bezieredge},
g1=EdgeTaggedGraph[g];
(* subdivide *)
rule= {
DirectedEdge[u_, v_, l_] /; u =!= v :> With[{m = Unique[x]}, {DirectedEdge[u, m], DirectedEdge[m, v]}],
UndirectedEdge[u_, v_, l_] /; u =!= v :> With[{m = Unique[x]}, {UndirectedEdge[u, m], UndirectedEdge[m, v]}],
DirectedEdge[u_, u_, l_] :> With[{m = Unique[x], n = Unique[x]}, {DirectedEdge[u, m], DirectedEdge[m, n], DirectedEdge[n, u]}],
UndirectedEdge[u_, u_, l_] :> With[{m = Unique[x], n = Unique[x]}, {UndirectedEdge[u, m], UndirectedEdge[m, n], UndirectedEdge[n, u]}] };
mapping =#->(#/.rule)&/@ EdgeList[g1] ;
newEdges=EdgeList[g1]/.mapping//Flatten;
subdivideg=Graph[Flatten[newEdges]];
glayout= IGLayoutPlanar[subdivideg];
(* get the coordinates *)
coords=Thread[VertexList[glayout]->GraphEmbedding@glayout];
bezieredge[pts_,edge_]:=If[Head[edge]===UndirectedEdge, BezierCurve[Flatten[List@@@(edge/.mapping),1]/.coords],Arrow@BezierCurve[Flatten[List@@@(edge/.mapping),1]/.coords]];
EdgeTaggedGraph[EdgeList[g1], VertexCoordinates->(VertexList[g1]/.coords),EdgeShapeFunction->bezieredge, EdgeLabels->"EdgeTag", PerformanceGoal -> "Quality"]
];
Test with undirected or directed multigraphs: