Skip to content

Búsqueda y filtros ​

La búsqueda es un ListExtractor cuyo handler es un SearchQueryHandler. Los filtros, los tipos de contenido y los criterios de orden que ofrece un servicio, son un pequeño modelo declarativo en search/filter.

El modelo ​

  • FilterItem: una opción seleccionable, (int identifier, String name). El identificador lo asigna el builder y es lo que el resto del código pasa de un lado a otro, no el nombre visible.
  • FilterGroup: un conjunto con nombre de FilterItems, con onlyOneCheckable (radio frente a checkbox) y su propio identificador.
  • Filter: un conjunto de FilterGroups, ensamblado con Filter.Builder.
  • SearchFiltersBase: la base por servicio. Un servicio crea una subclase, define sus items y grupos en init(), e implementa evaluateSelectedFilters(query) para convertir la selección del usuario en los parámetros de petición reales del servicio.

Un conjunto concreto ​

YoutubeFilters declara filtros de contenido, all, videos, channels, playlists, movies, Lives, además de los de YouTube Music (music_songs, music_videos, music_albums, music_playlists, music_artists). Sus grupos de orden y características: ordenar por (relevancia / valoración / vistas), fecha de subida (hora / día / semana / mes / año), duración (corta / larga) y conmutadores de características (HD, subtítulos, Creative Commons, 3D, en directo, 4K, 360, HDR, ...).

evaluateSelectedFilters codifica la selección en el parámetro sp de YouTube (un protobuf en base64), que adjunta a la petición de búsqueda. Cada familia de filtros sabe serializarse a sí misma, así que añadir uno es algo local.

Cómo los expone un handler ​

Un ListLinkHandlerFactory anuncia getAvailableContentFilter() y getAvailableSortFilter(). La app los lee para construir su interfaz de filtros, y luego devuelve los FilterItems elegidos a través de fromQuery(query, contentFilters, sortFilters). Los filtros seleccionados aterrizan en el SearchQueryHandler que recibe el SearchExtractor, y desde ahí en la petición.

Creado por Priveetee para el proyecto de código abierto PipePipe