Mise à jour hebdomadaire : Construire l'API publique GraphQL

Cette semaine, nous nous sommes concentrés sur le développement de la base de données GraphQL qui alimente la fonctionnalité principale de Popcorn Time. Notre travail s'est axé sur la structuration des métadonnées, l'intégration des liens des plateformes, et la mise en œuvre de capacités de recherche avancées pour garantir que les utilisateurs puissent trouver du contenu facilement et efficacement.

Pourquoi nous avons choisi GraphQL

Gérer la bande passante efficacement est crucial pour Popcorn Time, surtout lorsqu'il s'agit de traiter des millions de requêtes simultanées. Chaque octet compte, et c'est l'une des raisons pour lesquelles nous avons choisi GraphQL pour notre API publique. Avec GraphQL, le frontend peut interroger uniquement les données nécessaires pour la vue actuelle, réduisant ainsi le transfert de données inutile.

Cette interrogation sélective nous aide à :

  • Minimiser l'utilisation de la bande passante en envoyant uniquement ce qui est nécessaire.
  • Optimiser les performances sur tous les appareils, garantissant des temps de chargement rapides.
  • Évoluer efficacement à mesure que le nombre d'utilisateurs augmente, en gardant la charge du serveur sous contrôle.

En réduisant la taille de la charge utile pour chaque requête, nous nous assurons que l'expérience utilisateur reste fluide même en cas de trafic intense.

Mise en œuvre de la recherche avancée

Nous avons développé une syntaxe de recherche personnalisée qui permet aux utilisateurs de filtrer le contenu en utilisant des expressions de style langage naturel. Le générateur de recherche analyse ces requêtes en requêtes SQL efficaces en coulisses, garantissant des réponses fluides et rapides.

Recherche de base

query {
  medias(query: "title:batman AND kind:movie") {
    nodes {
      title
      year
      kind
    }
  }
}

Regroupement

query {
  medias(query: "title:batman AND (kind:movie OR kind:anime)") {
    nodes {
      title
      kind
      year
    }
  }
}

Prise en charge des entiers

query {
  medias(query: "year:>=2007 AND year:<=2020") {
    nodes {
      title
      year
    }
  }
}

Exclusion

query {
  medias(query: "-kind:movie AND year:2021") {
    nodes {
      title
      year
      kind
    }
  }
}

Ces capacités de recherche facilitent la découverte de contenu pour les utilisateurs en combinant des conditions telles que l'année, le titre, le type ou la disponibilité sur les plateformes.

Défis et optimisations

  • Nous avons veillé à ce que le générateur de recherche gère efficacement les conditions imbriquées et les négations, couvrant un large éventail de requêtes utilisateur.
  • L'agrégation de contenu sur différentes plateformes a nécessité la gestion des relations entre les services de streaming et la disponibilité régionale.
  • Nous avons optimisé les requêtes SQL pour garantir des performances rapides même avec de grandes collections de médias.

Prise en charge des interfaces dans GraphQL

Pour garantir la flexibilité, nous avons mis en œuvre des interfaces GraphQL pour gérer les attributs communs partagés entre les objets Movie et TvShow. Cela permet au frontend d'interroger des détails spécifiques—comme le nombre de saisons pour une émission de télévision ou la durée pour un film—sans faire de requêtes séparées.

Exemple de requête utilisant des interfaces

Voici une requête GraphQL démontrant comment l'interface fonctionne pour les objets Movie et TvShow :

{
  medias(first: 10) {
    nodes {
      title
      ... on Movie {
        runtime
      }
      ... on TvShow {
        numberOfSeasons
      }
    }
  }
}

Dans cette requête :

  • Les films retournent le champ runtime.
  • Les émissions de télévision retournent le champ numberOfSeasons.

En utilisant cette approche basée sur les interfaces, le frontend peut récupérer des données spécifiques sur un élément multimédia en une seule requête, économisant ainsi de la bande passante et réduisant la latence.


Quelles sont les prochaines étapes ?

  • Ajouter des films indépendants et des documentaires à la base de données
  • Connecter l'API GraphQL à l'interface utilisateur de l'application pour un affichage fluide des métadonnées
  • Préparer la synchronisation basée sur le cloud pour les listes de visionnage et les favoris

Cette semaine, nous nous sommes concentrés sur la construction de la base du backend de Popcorn Time avec la base de données GraphQL et la fonctionnalité de recherche personnalisée.

Ces outils rendront la découverte et l'exploration de contenu simples et intuitives tout en optimisant l'utilisation de la bande passante.

La semaine prochaine, nous allons intégrer le backend dans l'application native et étendre les métadonnées.