Builds a URL for accessing the specified audio.

    This should be kept in sync with _serve_audio_metadata. Note that the URL is
    *not* guaranteed to always return the same audio, since audio may be
    unloaded from the reservoir as new audio entries come in.

    Args:
      run: The name of the run.
      tag: The tag.
      index: The index of the audio entry. Negative values are OK.

    Returns:
      A string representation of a URL that will load the index-th sampled audio
      in the given run with the given tag.

def _query_for_individual_audio(self, run, tag, sample, index):
    """Builds a URL for accessing the specified audio.

    This should be kept in sync with _serve_audio_metadata. Note that the URL is
    *not* guaranteed to always return the same audio, since audio may be
    unloaded from the reservoir as new audio entries come in.

    Args:
      run: The name of the run.
      tag: The tag.
      index: The index of the audio entry. Negative values are OK.

    Returns:
      A string representation of a URL that will load the index-th sampled audio
      in the given run with the given tag.
    """
    query_string = urllib.parse.urlencode({
        'run': run,
        'tag': tag,
        'sample': sample,
        'index': index,
    })
    return query_string