Rickey Mandraque
Rickey Mandraque

Reputation: 35

jq and Bash: How to get value of key from value of object? (How to build/update a json?)

First of all, sorry for my English, I'm French.

I'm working on a script, which retrieves tags and links from M3U files to store them into variables. M3U:

#EXTM3U
#EXTINF:-1 tvg-id="TFX.fr" tvg-name="TFX" tvg-country="FR;AD;BE;LU;MC;CH" tvg-language="French" tvg-logo="http://www.exemple.com/image.jpg" group-title="",TFX (720p)
https://tfx-hls-live-ssl.tf1.fr/tfx/1/hls/live_2328.m3u8

script:

#!/bin/bash

tags='#EXTINF:-1 tvg-id="TFX.fr" tvg-name="TFX" tvg-country="FR;AD;BE;LU;MC;CH" tvg-language="French" tvg-logo="http://www.exemple.com/image.jpg" group-title="Fiction",TFX (720p)'

get_chno="$(echo "$tags" | grep -o 'tvg-chno="[^"]*' | cut -d '"'  -f2)"
get_id="$(echo "$tags" | grep -o 'tvg-id="[^"]*' | cut -d '"'  -f2)"
get_logo="$(echo "$tags" | grep -o 'tvg-logo="[^"]*' | cut -d '"'  -f2)"
get_grp_title="$(echo "$tags" | grep -o 'group-title="[^"]*' | cut -d '"'  -f2)"
get_title="$(echo "$tags" | grep -o ',[^*]*' | cut -d ','  -f2)"
get_name="$(echo "$tags" | grep -o 'tvg-name="[^"]*' | cut -d '"'  -f2)"
get_country="$(echo "$tags" | grep -o 'tvg-country="[^"]*' | cut -d '"'  -f2)"
get_language="$(echo "$tags" | grep -o 'tvg-language="[^"]*' | cut -d '"'  -f2)"

echo -e "chno:\n $get_chno"
echo -e "id:\n $get_id"
echo -e "logo:\n $get_logo"
echo -e "grp 1:\n $get_grp_title"
echo -e "title:\n $get_title"
echo -e "name:\n $get_name"
echo -e "country:\n $get_country"
echo -e "lang:\n $get_language"

I would like to store these variables in a json file. This json will be used to rebuild another playlist.

    #EXTM3U
    #EXTINF:-1 tvg-id="TFX.fr" tvg-name="TFX" tvg-country="FR;AD;BE;LU;MC;CH" tvg-language="French" tvg-logo="http://www.exemple.com/image.jpg" group-title="",TFX (720p)
    https://tfx-hls-live-ssl.tf1.fr/tfx/1/hls/live_2328.m3u8
    #EXTINF:-1 tvg-id="TFX.fr" tvg-name="TFX" tvg-country="FR;AD;BE;LU;MC;CH" tvg-language="French" tvg-logo="http://127.0.0.1/img/image.jpg" group-title="",TFX (local)
    http://127.0.0.1:1234/tfx/live.m3u8

The file which contains multiple arrays and multiple objects.

Like this :

{
  "Channels": [
    {
      "name": "TFX",
      "old_name": "NT1",
      "logo": "http://www.exemple.com/image.jpg",
      "category": "Fiction",
      "urls": {
        "Official": [
          {
            "server_name": "TF1",
            "IP_address": "8.8.8.8",
            "url": "tfx-hls-live-ssl.tf1.fr",
            "port": "",
            "https_port": "443",
            "path": "tfx/1/hls/",
            "file_name": "live_2328",
            "extension": ".m3u8",
            "full_url": "https://tfx-hls-live-ssl.tf1.fr/tfx/1/hls/live_2328.m3u8"
          }
        ],
        "Xtream_Servers": [
          {
            "server_name": "local",
            "user_name": "rickey",
            "stream_id": "11",
            "category_name": "Fiction",
            "category_id": "12"
          }
        ]
      },
      "languages": [
        {
          "code": "fr",
          "name": "Français"
        }
      ],
      "countries": [
        {
          "code": "fr",
          "name": "France"
        },
        {
          "code": "be",
          "name": "Belgium"
        }
      ],
      "tvg": {
        "id": "TFX.fr",
        "name": "TFX",
        "url": ""
      }
    },
    {
      "name": "France 2",
      "old_name": "",
      "logo": "http://www.exemple.com/image.jpg",
      "category": "Général",
      "urls": {
        "Official": [
          {
            "server_name": "France TV",
            "IP_address": "8.8.8.8",
            "url": "france2.fr",
            "port": "",
            "https_port": "443",
            "path": "live/",
            "file_name": "Playlist",
            "extension": ".m3u8",
            "full_url": "https://france2.fr/live/Playlist.m3u8"
          }
        ],
        "Xtream_Servers": [
          {
            "server_name": "localhost",
            "user_name": "rickey",
            "stream_id": "2",
            "category_name": "Général",
            "category_id": "10"
          }
        ]
      },
      "languages": [
        {
          "code": "fr",
          "name": "Français"
        }
      ],
      "countries": [
        {
          "code": "fr",
          "name": "France"
        },
        {
          "code": "be",
          "name": "Belgique"
        }
      ],
      "tvg": {
        "id": "France2.fr",
        "name": "France 2",
        "url": ""
      }
    },
    {
      "name": "M6",
      "old_name": "",
      "logo": "http://www.exemple.com/image.jpg",
      "category": "Général",
      "urls": {
        "Official": [
          {
            "server_name": "6Play",
            "IP_address": "8.8.8.8",
            "url": "6play.fr",
            "port": "",
            "https_port": "443",
            "path": "live/",
            "file_name": "Playlist",
            "extension": ".m3u8",
            "full_url": "https://6play.fr/M6/live/Playlist.m3u8"
          }
        ],
        "Xtream_Servers": [
          {
            "server_name": "localhost",
            "user_name": "rickey",
            "stream_id": "6",
            "category_name": "Général",
            "category_id": "10"
          }
        ]
      },
      "languages": [
        {
          "code": "fr",
          "name": "Français"
        }
      ],
      "countries": [
        {
          "code": "fr",
          "name": "France"
        },
        {
          "code": "be",
          "name": "Belgique"
        }
      ],
      "tvg": {
        "id": "France2.fr",
        "name": "France 2",
        "url": ""
      }
    }
  ],
  "Third_Party": {
    "Xtream_Servers": [
      {
        "server_name": "local",
        "url": "192.168.1.100",
        "port": "8080",
        "https_port": "8082",
        "server_protocol": "http",
        "rtmp_port": "12345",
        "Users_list": [
          {
            "username": "rickey",
            "password": "azerty01",
            "created_at": "",
            "exp_date": "",
            "is_trial": "0",
            "last_check": "",
            "max_connections": "3",
            "allowed_output_formats": [
              "m3u8",
              "ts",
              "rtmp"
            ]
          }
        ]
      },
      {
        "server_name": "localhost",
        "url": "127.0.0.1",
        "port": "8080",
        "https_port": "8082",
        "server_protocol": "http",
        "rtmp_port": "12345",
        "Users_list": [
          {
            "username": "rickey123",
            "password": "azerty321",
            "created_at": "",
            "exp_date": "",
            "is_trial": "0",
            "last_check": "",
            "max_connections": "3",
            "allowed_output_formats": [
              "m3u8",
              "ts",
              "rtmp"
            ]
          },
          {
            "username": "guest",
            "password": "guest01",
            "created_at": "",
            "exp_date": "",
            "is_trial": "1",
            "last_check": "",
            "max_connections": "1",
            "allowed_output_formats": [
              "ts"
            ]
          }
        ]
      }
    ]
  }
}

First question: Is it a crappy json?

To add or modify this file, the script must have the entry number (I think, if you have any other ideas, I'm interested...)

cat File.json  | jq '.Channels | to_entries[]'

output:

{
  "key": 0,
  "value": {
    "name": "TFX",
    "old_name": "NT1",
    

2nd question: How to get value key (0 is this case) with the value of "name", for store into variable after ? (to avoid duplicates)

key_="$(cat file.json | jq ????????? search="name": "$get_name" ???? .key)"
echo $key_
"0"
key_2="$(cat file.json | jq ????????? search="name": "$get_url" ???? .key)"
echo $key_2
"0"

if [[ $key_ == $key_2 ]]; then

Chan_Name="$(cat $1 | jq '.Channels[$key_].name)"
Echo $Chan_Name
"TFX"
jq  '.[] ????? += {???? , ??? }' file.json | sponge file.json

fi

last question (most important): How to find and modify these f*** objects, when the script does not know any values of the keys of the objects / arrays ?!

I've been looking for 2 days, my brain is liquid.

Thank you. :)

Edit 1 :

I've found a partial solution to replace value:

{
      "name": "TFX",
      "old_name": "NT1",
      "logo": "http://www.exemple.com/image.jpg",
      "category": "Fiction",

with:

 cat file.json | jq -C '(.Channels[] | select(.name=="TFX").category="test")'

output:

{
  "name": "TFX",
  "old_name": "NT1",
  "logo": "http://www.exemple.com/image.jpg",
  "category": "test",
  "urls": {

but "{"Channels": [" is missing. :/

Upvotes: 0

Views: 775

Answers (1)

Armali
Armali

Reputation: 19375

jq -C '(.Channels[] | select(.name=="TFX").category="test")'

You were so close - just one misplaced parenthesis:

jq '(.Channels[] | select(.name=="TFX")) .category="test"'

Upvotes: 1

Related Questions