Building on what you did, I made a few more steps as follows:
I noticed that the bounding box might cut parts of the network that are outside the city boundaries (the ring road, for instance) so I added a buffer parameter that can increase the bounding box with a given value. A bbox with a 2000m buffer seems to work in this case, but we have to see how we can make this replicable to other locations.
We don't need the entire trajectory of the river, so I clipped it to close to the city boundaries.
The shortest path calculation was not working because the network had several connected components. I dropped all but the largest component and the shortest path algorithm works. We loose disconnected parts of the networks, so this needs further testing on other cases.
I used the administrative boundaries to close the end of the corridor. This is not ideal as it can be arbitrary depending on how the urban boundaries were drawn, but it is a standard solution we can always fall back on. I would provide the user the possibility to add their own end boundary as input. In this case, I would use the ring road.
Building on what you did, I made a few more steps as follows: