CursosEmpresasBlogLiveConfPrecios

Contenido del curso

Presentación del proyecto: PlatziMovies

  • 1
    TheMovieDB: análisis de su API

    TheMovieDB: análisis de su API

    07:15 min
  • 2
    Bocetos en papel y diseño en Figma

    Bocetos en papel y diseño en Figma

    08:05 min

Configuración inicial y maquetación del proyecto

  • 3
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    16:53 min
  • 4
    Maquetación del proyecto: HTML y CSS

    Maquetación del proyecto: HTML y CSS

    18:34 min

Consumiendo la API

  • 5
    Lista de películas en tendencia

    Lista de películas en tendencia

    16:41 min
  • 6
    Lista de categorías

    Lista de categorías

    10:32 min
  • 7
    Migración a Axios

    Migración a Axios

    07:18 min

Navegación

  • 8
    Location y hash navigation

    Location y hash navigation

    17:17 min
  • 9
    Mostrando y ocultando secciones

    Mostrando y ocultando secciones

    22:05 min
  • 10
    Error: carga duplicada de datos

    Error: carga duplicada de datos

    06:30 min

Views

  • 11
    Filtrando películas por categoría

    Filtrando películas por categoría

    21:38 min
  • 12
    Retos: scrollTop y DRY

    Retos: scrollTop y DRY

    11:13 min
  • 13
    Buscador de películas

    Buscador de películas

    11:10 min
  • 14
    Retos: historial de navegación y página de tendencias

    Retos: historial de navegación y página de tendencias

    06:19 min
  • 15
    Endpoint de detalles de una película

    Endpoint de detalles de una película

    Viendo ahora
  • 16
    Lista de películas recomendadas

    Lista de películas recomendadas

    07:36 min

Próximos pasos

  • 17
    Toma el Curso Profesional de Consumo de API REST con JavaScript

    Toma el Curso Profesional de Consumo de API REST con JavaScript

    02:19 min
Tomar examen

Endpoint de detalles de una película

Resumen
linear-gradient( 180deg, rgba(0, 0, 0, 0.35) 19.27%, rgba(0, 0, 0, 0) 29.17% ),

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      Comentarios

      Carlos Rodríguez

      Carlos Rodríguez

      student•
      hace 4 años
        Jorge Garcia

        Jorge Garcia

        student•
        hace 4 años
        Carlos Rodríguez

        Carlos Rodríguez

        student•
        hace 4 años
      Carlos Rodríguez

      Carlos Rodríguez

      student•
      hace 4 años
      Lautaro Strappazzon

      Lautaro Strappazzon

      student•
      hace 4 años
        Angel David Velasco Bonifaz

        Angel David Velasco Bonifaz

        student•
        hace 4 años
        Christian Velázquez

        Christian Velázquez

        student•
        hace 4 años
      Sebastián Andrés Sanhueza Tapia

      Sebastián Andrés Sanhueza Tapia

      student•
      hace 3 años
      Cayo Legal

      Cayo Legal

      student•
      hace 4 años
        Jose Castillo

        Jose Castillo

        student•
        hace 4 años
      Eduardo Rodriguez Yapur

      Eduardo Rodriguez Yapur

      student•
      hace 4 años
      Miguel Angel Hernandez Colombo

      Miguel Angel Hernandez Colombo

      student•
      hace 4 años
      Dario Paladines

      Dario Paladines

      student•
      hace 4 años
      Luis Donaldo Talavera Covarrubias

      Luis Donaldo Talavera Covarrubias

      student•
      hace 4 años
      Gregory Muñoz

      Gregory Muñoz

      student•
      hace 4 años
      Juan Pablo Vargas Ramirez

      Juan Pablo Vargas Ramirez

      student•
      hace 3 años
        Henry Alexander Velásquez Rosas

        Henry Alexander Velásquez Rosas

        student•
        hace 2 años
      Cristian Paiva

      Cristian Paiva

      student•
      hace 3 años
      Ricardo Alfonso Chavez Vilcapoma

      Ricardo Alfonso Chavez Vilcapoma

      student•
      hace 3 años
      Henry Alexander Velásquez Rosas

      Henry Alexander Velásquez Rosas

      student•
      hace 2 años
        Juan Castro

        Juan Castro

        teacher•
        hace 2 años
      Rubén Cuello

      Rubén Cuello

      student•
      hace 4 años
        Juan Castro

        Juan Castro

        teacher•
        hace 4 años
        Sebastián Andrés Sanhueza Tapia

        Sebastián Andrés Sanhueza Tapia

        student•
        hace 3 años
      Alejandro Laguna

      Alejandro Laguna

      student•
      hace 4 años
        Juan Castro

        Juan Castro

        teacher•
        hace 4 años
      Santiago Barón Castaño

      Santiago Barón Castaño

      student•
      hace 3 años
        Juan Castro

        Juan Castro

        teacher•
        hace 3 años
      Alex Maurice

      Alex Maurice

      student•
      hace 4 años
        Juan Castro

        Juan Castro

        teacher•
        hace 4 años
        Alex Maurice

        Alex Maurice

        student•
        hace 4 años
      Andy Simancas

      Andy Simancas

      student•
      hace 3 años

      Recuerden que si quieren optimizar aun más el código y no tener que crear un evento por cada película, pueden crear un sólo evento en la sección y con el e.target delegar el evento al nodo que quieren, ¿pero cmo detecto el id o la url de la imagen?, muy sencillo, usar los dataset para guardar esos datos en el html al momento de cargar los items don el módulo navigations. . Adjunto mi aporte con mi repositorio en el commit de la clase: Mi repositorio

      interesante tu respuesta y es muy eficiente a la hora de generar el codigo y la carga, pero podria ser mas explicito ya que aca andamos muchos que recien entramos al mundo de JS y la programacion, me interesa para poderlo implementar y entender

      @idanygr Te recomiendo este curso si quieres indigar más sobre la manipulación del DOM: Curso de Manipulación del DOM

      Para los puristas del CSS, recomiendo agregar un reset inicial a las imágenes de estas propiedades:

      img { background-position: center; background-repeat: no-repeat; background-size: cover; }

      . Existe también el object-fit: cover; que es más resumido pero no es compatible con IE. . El modificador header-container--long siempre al final de todos los estilos de esa sección, y eliminar los estilos que ya javascript los coloca. Además esta tenía una propiedad de background-size: cover !import;, si son muy maniáticos con el no colcoar el !import, pues en este caso era necesario ya que nunca CSS encontrará una especificdad de contenedor de imagen cuando dentro hay otros elementos como h1 o p. La solución es eliminar esa propiedad y agregarla internamente desde el código javascript.

      .header-container--long { height: 480px; position: fixed; top: 0; width: 100%; }

      . JS

      headerSection.style.background = ` linear-gradient( 180deg, rgba(0, 0, 0, 0.35) 19.27%, rgba(0, 0, 0, 0) 29.17% ), url(${movieImgUrl}) `; headerSection.style.backgroundPosition = 'center'; headerSection.style.backgroundRepeat = 'no-repeat'; headerSection.style.backgroundSize = 'cover';

      . Mi repositorio en este fix

      Si a alguien más le sucedió que al entrar al detalle de una película y luego volver al home, el header le queda con el fondo del detalle como en la imagen:

      Captura de pantalla 2022-05-30 a la(s) 18.48.54.png

      Esto sucede porque al asignarle el background a headerSection en realidad se lo estamos asignando al header en general, no a la clase .header-container--long, por eso al volver al home el estilo se mantiene.

      Sigo buscando la forma de optimizarlo, pero por el momento la solución que encontré fue agregarle a la función homePage del file navigation.js la siguiente línea:

      headerSection.style.background = '';

      De esta forma, cada vez que regresemos al home le estamos borrando la propiedad. Voy a buscar una mejor solución y les comento si la encuentro. Si alguien más encuentra una solución mejor se los agradecería, o si fue sólo un error mío también.

      Saludos y nunca paren de aprender 💪

      Se ve mejor. con la imagen de fondo.

      Me pasa lo mismo pero, creo que tiene que ver con el "live server" porque, cuando regreso lo vuelvo a cargar...se va la imagen de fondo. Igual y pondré tu solución, en lo que busco una. Gracias por el aporte.

      Sí les aparece así el puntaje de la pelicula

      promedio con mucho decimal.jpg
      se puede arregar colocando ".foFixed(1)" para truncar a un decimal
      toFixed(1).png
      y quedará bien así:
      1 decimal.jpg

      Solución al string vacío en el form

      searchFormBtn.addEventListener('click', e => searchFormInput.value !== "" ? location.hash = 'search=' + searchFormInput.value : e.preventDefault())

      Yo lo hice de esta manera:

      searchFormBtn.addEventListener('click', () => { let regex = /\w/g; regex.test(searchFormInput.value) ? location.hash = '#search=' : location.hash && alert('Desbes ingresar algun caracter en la busqueda')

      con el regex filtro caracteres validos de busqueda y evito que envien la consulta si esta el campo solo con espacios como " ".

      Para que el detalle y titulo de la pelicula se muestren en español podemos añadir a los parametros que enviamos a la API el lenguage:

      api=axios.create({ baseURL: 'https://api.themoviedb.org/3/', headers:{ 'Content-Type': 'application/json;charset=utf-8', }, params:{ 'api_key': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'language':'es', } });

      buena clase!

      Amable recordatorio que para que les cargue la película correctamente si o si tienen que colocarle los string literals en el style.background

      Dejo mi repositorio, no use axios y algunas cosas las hice un poco diferente ya que las hacia antes de ver la clase, si gustan le pueden echar un ojo: https://github.com/Doni-Metal/Movie-Data-Viewer

      Mi solución al fondo en las otras vistas que no son la de vista detallada de la pelicula:

      navigation.js:

      arrowBtn.addEventListener('click', () => { headerSection.style = ''; const stateLoad = history.state ? history.state.loadUrl : ''; if (stateLoad.includes('#')) { location.hash = '#home'; } else { history.back(); } });

      Basicamente al agregar headerSection.style = ''; se estan eliminando los estilos del headerSection, al cambiar de vista al presionar la flecha de retorno. Así nos ahorramos eliminar la imagen de headerSection por cada vista.

      Yo viendo un !important en el minuto 17:51 y recordando las enseñanzas de De Granda: La traición, la decepción hermano

      Pensé lo mismo 😢

      jajajaja me hiciste reir con tu cara cuando pusiste batman para ver los detalles y en categorias veias romance. Por otro lado, realmente este curso tiene una calidad increíble de contenido. Gracias

      ¿Llegaron aquí?...enorgullezcanse amigos...son LEYENDA

      Todo va bien, pero hay pelis que no tienen imagen, ¿A alguien más le paso?

      9.png

      Pasa en muchas películas. Lo que se puede hacer ahí es poner un fallback (una imagen por defecto que solo cargue cuando falle o no haya imagen de alguna película).

      Mira: https://platzi.com/clases/2942-api-profesional/49631-imagenes-por-defecto/

      Pregunta de novato porque no me acuerdo. ¿Cómo se hace para seleccionar varios elementos clickeándolos así como hace Juan en 10:20 ? Probé de varias formas y no me sale :smile:

      Busca "vscode shortcuts [so]" y cambia [so] por tu sistema operativo para encontrar la lista completa de atajos. :D

      alt + click

      hola, cuando entro a ver los detalles de una pelicula sale todo bien, pero cuando intento regresar con la flecha me aparece la imagen de deadpool de fondo.

      ![](

      Captura de pantalla 2022-11-12 163419.png

      Revisa por fa tu archivo navigation.js: https://platzi.com/clases/2986-api-practico/48454-mostrando-y-ocultando-secciones/

      Con el código de esa clase se debería quitar la clase --long del header para que deje de salir el deadpool.

      Failed to load resource: the server responded with a status of 403 (Forbidden), ayuda con este error por favor.

      A qué endpoint o incluso URL completa hiciste la solicitud? Sigues teniendo el mismo error?

      Hola gente me gustaría un poco de ayuda, ya que me sale error al intentar ver la descripcion de una peli, pero si pongo un id manualmente aparece todo los datos

      ![](

      Captura de Tela (42).png

      Parece que tu función getMovieById no está recibiendo correctamente el parámetro id porque en al consulta lo está convirtiendo a undefined. ¿Nos muestras por fa la sección donde ejecutas esa función?

      Sí!

      function navigator() { if(location.hash.startsWith('#movie=')) { moviesPages(); } else if(location.hash.startsWith('#search=')) { searchOp(); } else if(location.hash.startsWith('#tvshow=')){ TVPages(); } else if(location.hash.startsWith('#description=')){ movietvDeatailsPage(); } else if (location.hash.startsWith('#category=')){ categorypages_view() } else if(location.hash.startsWith('#Categories')){ categoryPage(); } else{ homePage(); }
      async function getMovieById(id) { const { data: movie } = await api('movie/' + id); title_description.textContent = movie.title; overview_description .textContent = movie.overview; average_description.textContent = movie.vote_average; }
      function movietvDeatailsPage(){ headerSection.classList.add('active-size'); headerSectionBack.classList.add('inactiveback'); formSection.classList.add('inactive'); homeOp.classList.remove('inactive'); categoryOp.classList.add('inactive'); tvOp.classList.remove('inactive-color'); home_section.classList.add('inactive'); moviePage_section.classList.add('inactive'); tvPage_section.classList.add('inactive'); description_section.classList.remove('inactive'); search_section.classList.add('inactive'); formSection.classList.add('inactive'); headerSection.classList.remove('active-size-search'); categoryNav.classList.add('inactive'); category_section.classList.add('inactive'); moviesCategoriesOp.classList.remove('inactive'); tvsCategoriesOp.classList.remove('inactive'); // ['#movie', 'id] const [_, movieId] = location.hash.split('='); getMovieById(movieId); };

      Epaaaa! porque el css tiene un "!important" ??? 👀👀