It sounds like you're looking for specific Jersey programming help. Don't know where the best place is to find that, but in general I know that it's not difficult to declare resources such as "/medias/{id}" and have Jersey invoke your method with whatever goes there. From there, though, it's up to you, because Jersey isn't going to know whether a particular path means "id" or "string-alias".
In general, though, I like the idea of giving each resource a unique ID, and also a developer-friendly alias. But then you have to be able to write code that can quickly distinguish between an ID and an alias. If you can do that -- using a regular expression for instance -- then give it a try.
I do like the idea of having sub-collections called "genres," "categories," etc, because then a developer can write:
GET /genres -- return a list of genres
GET /genres/classical -- return IDs of media in the classical genre
but the problem comes if you want to be able to search in multiple ways, though -- how do you do that? So the alternative is to use query parameters:
GET /medias?genre=classical&language=en&createdBefore=1800&sort=name&limit=10
I think that a combination of the two would likely be most usable by developers.
and if it gets more complicated than that then you should look at OData...
--
Gregory Brail | Technology | Apigee