Raccogliere tutti i commenti da un progetto

Panoramica

L’estrattore di commenti recupera tutte le risorse in un progetto, estrae i commenti ed esporta tutto in un file .csv.Questa procedura dettagliata utilizza le seguenti risorse:

  • SDK Python: l’SDK gestisce la paginazione e configura un client che puoi utilizzare con i token sviluppatore (autenticazione bearer).
  • Estrattore di commenti in Python: l’esempio di codice che stiamo usando è qui.

Provalo su Glitch

Glitch è uno strumento semplice che ti permette di configurare, testare ed eseguire le applicazioni utilizzando i loro server. Se non conosci Glitch, consulta la nostra guida sull’utilizzo di Glitch. Se vuoi vedere come funziona l’estrattore di commenti su un server, abbiamo configurato un’app Flask su Glitch: Frame.io Comment Scraper in Python.

Ambiti richiesti

Prima di iniziare questa guida, assicurati di avere un token che includa almeno i seguenti ambiti:

AmbitoMotivo
Progetti: letturaNon strettamente necessario, ma serve per recuperare il root_asset_id di un progetto.
Risorse: letturaNecessario per navigare tra gli asset_id tramite API
Commenti: letturaNecessario per recuperare i commenti stessi.

1. Prepara l’app

Questa guida seguirà un modello simile a quello della guida Leggere l’albero dei file. Di conseguenza, per iniziare ti serve:

Devi anche importare FrameioClient nell’app Python, oltre ad alcune librerie di supporto aggiuntive:

Python
1from frameioclient import FrameioClient
2import requests, json, csv, itertools
3
4ROOT_ASSET_ID = "<ROOT_ASSET_ID>"
5TOKEN = "<DEV_TOKEN>"

2. Scansiona il progetto

Ora devi recuperare ricorsivamente tutte le risorse, controllarle per verificare la presenza di commenti e archiviare le risorse commentate in un elenco da cui costruire il file .csv.

Durante la scansione del progetto, devi eseguire i seguenti controlli su ogni risorsa:

  • La risorsa è un file? (&quot;_type&quot;: &quot;file&quot;).

  • Se è un file, contiene commenti? * Se li contiene, recuperali e aggiungili all’elenco.

  • La risorsa è una cartella? (&quot;_type&quot;: &quot;folder&quot;)

  • Se è una cartella, esegui una scansione ricorsiva sulle relative cartelle figlio.

  • La risorsa è uno stack di versioni? (&quot;_type&quot;: &quot;version_stack&quot;)

  • Se è uno stack di versioni, recupera tutti gli elementi figlio e controlla se hanno dei commenti.

Python
1def all_comments(client, asset_id, comment_list):
2 files = client.get_asset_children(asset_id)
3
4 for asset in files:
5 if asset['type'] == "file":
6 if asset['comment_count'] > 0:
7 asset_parent_id = asset['parent_id']
8 asset_name = asset['name']
9 comments = client.get_comments(asset['id'])
10 my_comment_list = [comment for comment in comments.results]
11 for object in my_comment_list:
12 object.update({'parent_id':asset_parent_id})
13 object.update({'name':asset_name})
14 comment_list.append(my_comment_list)
15
16 if asset['type'] == "folder":
17 if asset['item_count'] > 0:
18 all_comments(client, asset['id'], comment_list)
19
20 if asset['type'] == "version_stack":
21 asset_name = asset['name']
22 parent_id = asset['parent_id']
23 vfiles = client.get_asset_children(asset['id'])
24
25 for asset in vfiles.results:
26 asset_name = asset['name']
27 parent_id = asset['parent_id']
28 if asset['type'] == "file":
29 if asset['comment_count'] > 0:
30 comments = client.get_comments(asset['id'])
31 my_comment_list = [comment for comment in comments.results]
32 for object in my_comment_list:
33 object.update({'parent_id':parent_id})
34 object.update({'name':asset_name})
35 comment_list.append(my_comment_list)
36
37def get_all_project_comments(root_asset_id, token):
38 comment_list = []
39 client = FrameioClient(token)
40
41 all_comments(client, root_asset_id, comment_list)
42
43 return comment_list
Non dimenticare la paginazione

L’esempio precedente ignora la paginazione, ma durante la navigazione in raccolte di grandi dimensioni, non conviene ignorarla.Consulta la guida sui concetti chiave come riferimento.

3. Appiattisci l’elenco dei commenti

A meno che non l’abbia già fatto durante la scansione, devi appiattire l’elenco per semplificare l’elaborazione.

Python
1# The response list comes back as a list of lists.
2# Flatten out responses to a single list so you can build your .csv file.
3
4flat_response_list = list(itertools.chain.from_iterable(responses))

4. Seleziona l’elenco e crea il file .csv

Quando l’elenco è appiattito, puoi usare la comprensione dell’elenco per acquisire gli elementi che ritieni utili di ogni commento, per poi inviarli in un file .csv.Consigliamo di includere almeno:

  • Commento - text
  • ID padre - parent_id
  • ID risorsa - asset_id
  • Nome risorsa - name
  • ID proprietario - owner_id
  • E-mail del proprietario - owner.email
  • Marca temporale - timestamp
  • Ora di aggiornamento - updated_at

Dopo aver creato un nuovo elenco contenente l’output desiderato per ogni risorsa per l’ouput finale, è il momento di scrivere nel file .csv.

Python
1list_for_csv = [[o['text'], o['parent_id'], o['asset_id'], o['name'], o['owner_id'], o['owner']['email'], o['timestamp'], o['updated_at']] for o in flat_response_list]
2
3# Let's write our new list out to a .csv file. We'll add a heading.
4with open("output.csv", 'w') as myfile:
5 wr = csv.writer(myfile, dialect='excel')
6 wr.writerow(['Comment', 'Parent ID', 'Asset ID', 'Asset Name', 'Owner ID', 'Email', 'Timestamp', 'Updated At'])
7 wr.writerows(list_for_csv)

Ecco fatto! Ora hai un file .csv con i commenti appiattiti di un intero progetto Frame.io.