# Basic Usage

## Core Functionality

### Authenticate

The first step is to initialize the SDK client with the credentials that have been provided to you:

{% hint style="info" %}
**Note:** If you are both a **Search: Custom Database** and **Search: Pex Registry** customer, each product will require a separate set of credentials.
{% endhint %}

{% tabs %}
{% tab title="Python" %}
{% code fullWidth="false" %}

```python
# AUTHENTICATE CLIENT
client = pex.PrivateSearchClient("CLIENT_ID", "CLIENT_SECRET")
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}

```go
// AUTHENTICATE CLIENT
client, err := pex.NewPrivateSearchClient("clientID", "clientSecret")
if err != nil {
	panic(err)
}
defer client.Close()
```

{% endtab %}

{% tab title="PHP" %}

```php
// AUTHENTICATE CLIENT
$client = new Pex\PrivateSearchClient(CLIENT_ID, CLIENT_SECRET);
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// AUTHENTICATE CLIENT
let client = new pex.PrivateSearchClient(CLIENT_ID, CLIENT_SECRET)
await client.connect()
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Note:** There might be a slight delay the first time you authenticate as the SDK downloads and installs necessary updates
{% endhint %}

### Generate Fingerprint

First, generate a fingerprint from the media file you. You can either generate a fingerprint to ingest into your custom database or you can generate a fingerprint to initiate a search with.

{% tabs %}
{% tab title="Python" %}

```python
# CREATE AUDIO FINGERPRINT FROM MEDIA FILE
ft = client.fingerprint_file("/path/to/file.mp3", pex.FingerprintType.AUDIO)

# CREATE MELODY FINGERPRINT FROM MEDIA FILE
ft = client.fingerprint_file("/path/to/file.mp3", pex.FingerprintType.MELODY)

# CREATE VIDEO FINGERPRINT FROM MEDIA FILE
ft = client.fingerprint_file("/path/to/file.mp3", pex.FingerprintType.VIDEO)

# CREATE AUDIO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft = client.fingerprint_buffer([]byte, pex.FingerprintType.AUDIO)

# CREATE MELODY FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft = client.fingerprint_buffer([]byte, pex.FingerprintType.MELODY)

# CREATE VIDEO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft = client.fingerprint_buffer([]byte, pex.FingerprintType.VIDEO)
```

{% endtab %}

{% tab title="Go" %}

```go
// CREATE AUDIO FINGERPRINT FROM MEDIA FILE
ft, err := client.FingerprintFile(inputFile, pex.FingerprintTypeAudio)
if err != nil {
	panic(err)
}
	
// CREATE MELODY FINGERPRINT FROM MEDIA FILE
ft, err := client.FingerprintFile(inputFile, pex.FingerprintTypeMelody)
if err != nil {
	panic(err)
}

// CREATE VIDEO FINGERPRINT FROM MEDIA FILE
ft, err := client.FingerprintFile(inputFile, pex.FingerprintTypeVideo)
if err != nil {
	panic(err)
}

// CREATE AUDIO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft, err := client.FingerprintBuffer([]byte, pex.FingerprintTypeAudio)
if err != nil {
	panic(err)
}

// CREATE MELODY FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft, err := client.FingerprintBuffer([]byte, pex.FingerprintTypeMelody)
if err != nil {
	panic(err)
}

// CREATE VIDEO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
ft, err := client.FingerprintBuffer([]byte, pex.FingerprintTypeVideo)
if err != nil {
	panic(err)
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// CREATE AUDIO FINGERPRINT FROM MEDIA FILE
$ft = $client->fingerprintFile(INPUT_FILE, [Pex\FingerprintType::Audio]);

// CREATE MELODY FINGERPRINT FROM MEDIA FILE
$ft = $client->fingerprintFile(INPUT_FILE, [Pex\FingerprintType::Melody]);

// CREATE VIDEO FINGERPRINT FROM MEDIA FILE
$ft = $client->fingerprintFile(INPUT_FILE, [Pex\FingerprintType::Video]);

// CREATE AUDIO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
$ft = $client->fingerprintBuffer([]byte, [Pex\FingerprintType::Audio]);

// CREATE MELODY FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
$ft = $client->fingerprintBuffer([]byte, [Pex\FingerprintType::Melody]);

// CREATE VIDEO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
$ft = $client->fingerprintBuffer([]byte, [Pex\FingerprintType::Video]);
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// CREATE AUDIO FINGERPRINT FROM MEDIA FILE
let ft = await client.fingerprintFile("video.mp4", [pex.AUDIO])

// CREATE MELODY FINGERPRINT
let ft = await client.fingerprintFile("video.mp4", [pex.MELODY])

// CREATE VIDEO FINGERPRINT
let ft = await client.fingerprintFile("video.mp4", [pex.VIDEO])

// CREATE AUDIO FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
let ft = await client.fingerprintBuffer([]byte, [pex.AUDIO])

// CREATE MELODY FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
let ft = await client.fingerprintBuffer([]byte, [pex.MELODY])

// CREATE MELODY FINGERPRINT FROM BYTE BUFFER HOLDING A MEDIA FILE
let ft = await client.fingerprintBuffer([]byte, [pex.VIDEO])
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Note:** When creating audio fingerprints, the SDK uses a single CPU. For melody fingerprints, the SDK uses two CPUs, if available.

If you need to process larger volumes of files, running computations in parallel is recommended. This can significantly improve processing capacity.

For information on the difference between audio and melody fingerprints and the use cases they address, please see our [FAQ](https://docs.pex.com/faq/identification-matching#what-is-the-difference-between-an-audio-search-and-a-melody-search) page
{% endhint %}

## Searching Functionality

### Initiate Search

Once the fingerprint has been generated, you are ready to initiate a search:

{% tabs %}
{% tab title="Python" %}

```python
# BUILD CUSTOM DATABASE SEARCH REQUEST
req = pex.PrivateSearchRequest(fingerprint=ft)

# START SEARCH
future = client.start_search(req)
```

{% endtab %}

{% tab title="Go" %}

```go
// BUILD CUSTOM DATABASE SEARCH REQUEST
req := &pex.PrivateSearchRequest{
	Fingerprint: ft,
}

// START SEARCH
fut, err := client.StartSearch(req)
if err != nil {
	panic(err)
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// BUILD CUSTOM DATABASE SEARCH REQUEST
$req = new \Pex\PrivateSearchRequest($ft);

// START SEARCH
$fut = $client->startSearch($req);
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// START CUSTOM DATABASE SEARCH REQUEST
let result = await client.startSearch({
  "fingerprint": ft
})
```

{% endtab %}
{% endtabs %}

### Retrieve Search Results

Once a search is complete, you can retrieve the results of the search:

{% tabs %}
{% tab title="Python" %}

```python
# RETRIEVE SEARCH RESULTS
result = future.get()
```

{% endtab %}

{% tab title="Go" %}

```go
// RETRIEVE SEARCH RESULTS
res, err := fut.Get()
if err != nil {
	panic(err)
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// RETRIEVE SEARCH RESULTS
$res = $fut->get();
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// THE STARTSEARCH FUNCTION DESCRIBED IN THE PREVIOUS SECTION WILL AUTOMATICALLY RETRIEVE THE RESULTS WHEN THE SEARCH IS COMPLETED
```

{% endtab %}
{% endtabs %}

### Interpret Search Results

To view details on what's contained in a search response, please see the following section: [search-response](https://docs.pex.com/search/sdk-integration/search-custom-database/search-response "mention")

## Catalog Management

### Add Fingerprint to Custom Database

Now that the fingerprint has been generated, you can add that fingerprint file to your custom database. You can associate a "provided\_id" string of your choosing for each fingerprint (to help you uniquely identify each fingerprint that is in your database):

{% tabs %}
{% tab title="Python" %}

```python
# ADD FINGERPRINT CUSTOM DATABASE
client.ingest("provided_id", ft)
```

{% endtab %}

{% tab title="Go" %}

```go
# ADD FINGERPRINT CUSTOM DATABASE
if err := client.Ingest("provided_id", ft); err != nil {
	panic(err)
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// ADD FINGERPRINT CUSTOM DATABASE
$client->ingest("provided_id", $ft);
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// ADD FINGERPRINT CUSTOM DATABASE
await client.ingest("provided_id", ft)
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Note:** After ingesting an asset, it will take a short time (generally a few minutes) before it is available in your custom database to be searched against
{% endhint %}

### Archive Fingerprint from your Custom Database

If you would like to remove an asset from your Custom Database so that it can no longer be matched against, you can do so with this command:

{% tabs %}
{% tab title="Python" %}

```python
# ARCHIVE FINGERPRINT
client.archive("provided_id")
```

{% endtab %}

{% tab title="Go" %}

```go
# ARCHIVE FINGERPRINT
if err := client.Archive("provided_id"); err != nil {
	panic(err)
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// ARCHIVE FINGERPRINT
$client->archive("provided_id");
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// ARCHIVE FINGERPRINT
await client.ingest("provided_id")
```

{% endtab %}
{% endtabs %}

### Retrieve Status of a Specific Asset

If you would like to view the status of a particular asset you have ingested in your Custom Database, you can do so with the Get Entry functionality

{% tabs %}
{% tab title="Python" %}
{% code overflow="wrap" %}

```python
# GET INGESTED ASSET STATUS
entry = client.get_entry("provided_id")
print(entry)
```

{% endcode %}
{% endtab %}

{% tab title="Go" %}

```go
// GET INGESTED ASSET STATUS
entry, err := client.GetEntry("provided_id")
if err != nil {
    panic(err)
}

fmt.Printf("%+v\n", entry)
```

{% endtab %}

{% tab title="PHP" %}

```php
// GET INGESTED ASSET STATUS
$entry = $client->getEntry("provided_id");
print_r($entry);
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
// GET INGESTED ASSET STATUS
let entry = await client.getEntry("provided_id");
console.log(entry);
```

{% endtab %}
{% endtabs %}

### Lists Assets in your Custom Database

If you would like to view what assets are currently in your Custom Database, you can do so with the Lister functionality:

{% tabs %}
{% tab title="Python" %}

```python
# RETRIEVE ASSETS IN CUSTOM DATABASE
lister = client.list_entries(pex.ListEntriesRequest())
// To limit the number of entries:
//   lister = client.list_entries(pex.ListEntriesRequest(limit=5))

while lister.has_next_page:
  entries = lister.list()

  for entry in entries:
    print(entry)

```

{% endtab %}

{% tab title="Go" %}

```go
// RETRIEVE ASSETS IN CUSTOM DATABASE
lister := client.ListEntries(&pex.ListEntriesRequest{})
// To limit the number of entries:
//   lister := client.ListEntries(&pex.ListEntriesRequest{
//     Limit: 5,
//   })

for lister.HasNextPage {
  entries := lister.List()

  for _, entry := range entries {
    fmt.Println(entry)
  }
}
```

{% endtab %}

{% tab title="PHP" %}

```php
// RETRIEVE ASSETS IN CUSTOM DATABASE
$lister = $client->listEntries(new Pex\ListEntriesRequest());
// To limit the number of entries:
//   $lister = $client->listEntries(new Pex\ListEntriesRequest(limit: 5));

while ($lister->hasNextPage()) {
  $entries = $lister->list();

  foreach ($entries as $entry) {
    echo json_encode($entry, JSON_PRETTY_PRINT) . PHP_EOL;
  }
}
```

{% endtab %}

{% tab title="Node.js" %}

<pre class="language-javascript"><code class="lang-javascript"><strong>// RETRIEVE ASSETS IN CUSTOM DATABASE
</strong><strong>let lister = client.listEntries({});
</strong>// To limit the number of entries:
//   let lister = client.listEntries({limit: 5});

while (lister.hasNextPage()) {
  let entries = await lister.list();

  for (const entry of entries) {
    console.log(entry);
  }
}
</code></pre>

{% endtab %}
{% endtabs %}
