Search code examples
perlduckduckgo

how do duckduckgo spice IA secondary API calls get their parameters?


I have been looking through the spice instant answer source code. Yes, I know it is in maintenance mode, but I am still curious.

The documentation makes it fairly clear that the primary spice to API gets its numerical parameters $1, $2, etc. from the handle function.

My question: should there be secondary API calls included with spice alt_to as, say, in the movie spice IA, where do the numerical parameters to that API call come from?

Note, for instance, the $1 in both the movie_image and cast_image secondary API calls in spice alt_to at the preceding link. I am asking which regex capture returns those instances of $1.


Solution

  • I believe I see how this works now. The flow of information is still a bit murky to me, but at least I see how all of the requisite information is there.

    I'll take the cryptocurrency instant answer as an example. The alt_to element in the perl package file at that link has a key named cryptonator. The corresponding .js file constructs a matching endpoint:

    var endpoint = "/js/spice/cryptonator/" + from + "/" + to;
    

    Note the general shape of the "remainder" past /js/spice/cryptonator: from/to, where from and to will be two strings.

    Back in the perl package the hash alt_to->{cryptonator} has a key from which receives, I think, this remainder from/to. The value corresponding to that key is a regex meant to split up that string into its two constituents:

    from => '([^/]+)/([^/]*)'
    

    Applied to from/to, that regex will return $1=from and $2=to. These, then, are the $1 and $2 that go into

    to => 'https://api.cryptonator.com/api/full/$1-$2'
    

    in alt_to.


    In short:

    The to field of alt_to->{blah} receives its numerical parameters by having the from regex operate on the remainder past /js/spice/blah/ of the name of the corresponding endpoint constructed in the relevant .js file.