orthancDatabaseBrowser.py 3.0 KB

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