orthancDatabaseBrowser.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import orthancInterface
  2. import json
  3. import chardet
  4. import io
  5. import sys
  6. def extractJSON(data):
  7. print(f'extractJSON: {data}')
  8. encoding=chardet.detect(data)["encoding"]
  9. #try with a set of encodings to maximize probability of success
  10. encodings=[encoding,'utf_8']
  11. for x in encodings:
  12. try:
  13. return json.loads(data.decode(x))
  14. except UnicodeDecodeError:
  15. pass
  16. print('Failed to decode with [{}]: {}'.format(x,data))
  17. return None
  18. class orthancDB:
  19. def __init__(self,net):
  20. self.net=net
  21. def getList(self,category):
  22. url=self.net.getCoreURL()
  23. url+='/'+category
  24. response=self.net.get(url)
  25. return extractJSON(response.data)
  26. def getPatients(self):
  27. return self.getList('patients')
  28. def getStudies(self):
  29. return self.getList('studies')
  30. def getPatientData(self, orthancId):
  31. return self.getData('patients',orthancId)
  32. def getStudyData(self, studyOrthancId):
  33. return self.getData('studies',studyOrthancId)
  34. def getSeriesData(self, seriesOrthancId):
  35. return self.getData('series',seriesOrthancId)
  36. def getNumpy(self,level,orthancId):
  37. url=self.net.getCoreURL()
  38. url+='/'+level+'/'+orthancId+'/numpy'
  39. response=self.net.get(url,binary=True)
  40. return io.BytesIO(response.data)
  41. def getData(self, level, orthancId):
  42. url=self.net.getCoreURL()
  43. url+='/'+level+'/'+orthancId
  44. response=self.net.get(url)
  45. return extractJSON(response.data)
  46. def getDicomField(self,orthancInstanceId,dicomField,raw=False):
  47. url=self.net.getCoreURL()
  48. url+='/instances/'+orthancInstanceId+'/content/'+dicomField
  49. response=self.net.get(url)
  50. if raw:
  51. return response.data
  52. try:
  53. encoding=chardet.detect(response.data)["encoding"]
  54. return response.data.decode(encoding)
  55. except TypeError:
  56. return ''
  57. def selectRows(self, qfilter):
  58. obj={}
  59. obj["Level"]="Instance"
  60. obj["Query"]=qfilter
  61. jsonData=json.dumps(obj)
  62. url=self.net.getCoreURL()
  63. url+='/tools/find'
  64. response=self.net.post(url,jsonData,'json')
  65. return extractJSON(response)
  66. def upload(self, f) :
  67. url=self.net.getCoreURL()
  68. url+='/instances'
  69. fobj=open (f, 'rb')
  70. response=self.net.post(url,fobj.read(),'octet-stream')
  71. return extractJSON(response)
  72. def remove(self,level,orthancId):
  73. url=self.net.getCoreURL()
  74. url+='/'+level+'/'+orthancId
  75. response=self.net.delete(url)
  76. print(response.data)
  77. def changes(self,limit=10,since=0):
  78. url=self.net.getCoreURL()
  79. #url+=f'/changes?limit={limit}&since={since}'
  80. url+='/changes?limit={}&since={}'.format(limit,since)
  81. response=self.net.get(url)
  82. return extractJSON(response.data)