Saturday, March 12, 2022

[SOLVED] How to display accented words JSON on bash script with Python

Issue

I'm trying to display arrays with accent in the result but only arrays that don't have accent are showing.

Complete themoviedb API: href="https://api.themoviedb.org/3/movie/566525?api_key=b2f8880475c888056b6207067fbaa197&language=pt-BR" rel="nofollow noreferrer">https://api.themoviedb.org/3/movie/566525?api_key=b2f8880475c888056b6207067fbaa197&language=pt-BR

  "genres": [
    {
      "id": 28,
      "name": "Ação"
    },
    {
      "id": 12,
      "name": "Aventura"
    },
    {
      "id": 14,
      "name": "Fantasia"
    }
  ],

  "overview": "Shang-Chi precisa confrontar o passado que pensou ter deixado para trás. Ao mesmo tempo, ele é envolvido em uma teia de mistérios da organização conhecida como Dez Anéis.",


Shell code:

getMovieInfo()
{

  movieInfo=$(httpGet "https://api.themoviedb.org/3/movie/566525?api_key=b2f8880475c888056b6207067fbaa197&append_to_response=videos&language=pt-BR")
  genreOne=$(echo "$movieInfo" | python -c "import sys, json; print json.load(sys.stdin)['genres'][0]['name']" 2> /dev/null )
  genreTwo=$(echo "$movieInfo" | python -c "import sys, json; print json.load(sys.stdin)['genres'][1]['name']" 2> /dev/null )
  genreThree=$(echo "$movieInfo" | python -c "import sys, json; print json.load(sys.stdin)['genres'][2]['name']" 2> /dev/null )
  genres=$(echo "$genreOne $genreTwo $genreThree" | tr " " ",")
  overview=$(echo "$movieInfo" | python -c "import sys, json; print json.load(sys.stdin)['overview']" 2> /dev/null )
}

result:

==========================================
| Title: Shang-Chi and the Legend of the Ten Rings
| Language: en
| Genre: ,Aventura,Fantasia
| Runtime: 132 mins
| Overview:
==========================================

Solution

Here is a cleaner way to do this in jq. This solution also scales better (you don't need to know the number of elements in your array)

my_function() {
  movieInfo="$(httpGet "https://api.themoviedb.org/3/movie/566525?api_key=b2f8880475c888056b6207067fbaa197&append_to_response=videos&language=pt-BR")"
  language="$(jq -r '.original_language' <<< $movieInfo)"
  genres="$(jq -r '[.genres[].name] | join(",")' <<< $movieInfo)"
  runtime="$(jq -r '.runtime' <<< $movieInfo)"
  overview="$(jq -r '.overview' <<< $movieInfo)"
}


Answered By - Aserre
Answer Checked By - Clifford M. (WPSolving Volunteer)