def test_write_new_struct_in_array(self): filename = pkg_resources.resource_filename(__name__, "samples/test1.xmp") with open(filename, 'r') as fptr: strbuffer = fptr.read() xmp = XMPMeta() xmp.parse_from_str(strbuffer) prefix = xmp.get_prefix_for_namespace(NS_DC) xmp.append_array_item(NS_DC, prefix + 'creator', None, prop_value_is_struct=True) xmp.set_property(NS_DC, prefix + 'creator[2]/' + prefix + 'TestProp', '100') self.assertTrue(xmp.does_property_exist(NS_DC, prefix + 'creator[2]')) prop = xmp.get_property(NS_DC, prefix + 'creator[2]/%sTestProp' % prefix) self.assertEqual(prop, '100') xpath = prefix + 'creator' xmp.set_array_item(NS_DC, xpath, 3, None, prop_value_is_struct=True) xpath += '[3]/%sTestProp' % prefix xmp.set_property(NS_DC, xpath, '200') self.assertTrue(xmp.does_property_exist(NS_DC, xpath)) prop = xmp.get_property(NS_DC, xpath) self.assertEqual(prop, '200') xpath = prefix + 'TestStruct/' + prefix + 'TestValue' xmp.set_property(NS_DC, xpath, '300') self.assertTrue(xmp.does_property_exist(NS_DC, xpath)) prop = xmp.get_property(NS_DC, xpath) self.assertEqual(prop, '300')
def test_python_xmp_validate_change(sandwich): with sandwich.open_metadata() as xmp: assert 'xmp:CreatorTool' in xmp xmp['xmp:CreatorTool'] = 'Creator' # Exists as a xml tag text xmp['pdf:Producer'] = 'Producer' # Exists as a tag node assert str(xmp) xmpmeta = XMPMeta(xmp_str=str(xmp)) assert xmpmeta.does_property_exist(XMP_NS_XMP, 'CreatorTool') assert xmpmeta.does_property_exist(XMP_NS_PDF, 'Producer')
def test_write_new_struct_in_array(self): filename = pkg_resources.resource_filename(__name__, "samples/test1.xmp") with open(filename, 'r') as fptr: strbuffer = fptr.read() xmp = XMPMeta() xmp.parse_from_str(strbuffer) prefix = xmp.get_prefix_for_namespace(NS_DC) xmp.append_array_item(NS_DC, prefix + 'creator', None, prop_value_is_struct=True) xmp.set_property(NS_DC, prefix + 'creator[2]/' + prefix + 'TestProp', '100') self.assertTrue(xmp.does_property_exist(NS_DC, prefix + 'creator[2]')) prop = xmp.get_property(NS_DC, prefix + 'creator[2]/%sTestProp' % prefix) self.assertEqual(prop, '100') xpath = prefix + 'creator' xmp.set_array_item(NS_DC, xpath, 3, None, prop_value_is_struct=True) xpath += '[3]/%sTestProp' % prefix xmp.set_property(NS_DC, xpath, '200') self.assertTrue(xmp.does_property_exist(NS_DC, xpath)) prop = xmp.get_property(NS_DC, xpath) self.assertEqual(prop, '200') xpath = prefix + 'TestStruct/' + prefix + 'TestValue' xmp.set_property(NS_DC, xpath, '300') self.assertTrue(xmp.does_property_exist(NS_DC, xpath)) prop = xmp.get_property(NS_DC, xpath) self.assertEqual(prop, '300')
def test_exempi_core(self): """Corresponds to test_exempi.TestExempi.test_exempi_core""" filename = pkg_resources.resource_filename(__name__, "samples/test1.xmp") with open(filename, 'r') as fptr: strbuffer = fptr.read() xmp = XMPMeta() xmp.parse_from_str(strbuffer) self.assertTrue(xmp.does_property_exist(NS_TIFF, 'Make')) self.assertFalse(xmp.does_property_exist(NS_TIFF, 'Foo')) prop = xmp.get_property(NS_TIFF, 'Make') self.assertEqual(prop, 'Canon') xmp.set_property(NS_TIFF, 'Make', 'Leica') prop = xmp.get_property(NS_TIFF, 'Make') self.assertEqual(prop, 'Leica') # Some tests correspond to option masks not currently returned via # this interface. item = xmp.get_localized_text(NS_DC, 'rights', None, 'x-default') self.assertEqual(item, "2006, Hubert Figuiere") xmp.set_localized_text(NS_DC, 'rights', 'en', 'en-CA', 'Foo bar') item = xmp.get_localized_text(NS_DC, 'rights', 'en', 'en-US') # Can't look at the actual lang, unlike the original test. self.assertEqual(item, 'Foo bar') xmp.delete_localized_text(NS_DC, 'rights', 'en', 'en-CA') self.assertFalse(xmp.does_property_exist(NS_DC, "rights[1]")) xmp.set_array_item(NS_DC, "creator", 2, "foo") xmp.append_array_item(NS_DC, "creator", "bar") prop = xmp.get_array_item(NS_DC, "creator", 3) self.assertEqual(prop, "bar") xmp.delete_property(NS_DC, "creator[3]") self.assertFalse(xmp.does_property_exist(NS_DC, "creator[3]")) prop = xmp.get_property(NS_EXIF, "DateTimeOriginal") self.assertEqual(prop, "2006-12-07T23:20:43-05:00") the_prop = xmp.get_property_datetime(NS_EXIF, "DateTimeOriginal") self.assertEqual(the_prop.year, 2006) self.assertEqual(the_prop.minute, 20) self.assertEqual(the_prop.tzinfo, pytz.utc) prop = xmp.get_property(NS_XAP, "Rating") self.assertEqual(prop, "3") prop = xmp.get_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius") self.assertEqual(prop, 1.0) xmp.set_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius", 2.5) prop = xmp.get_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius") self.assertEqual(prop, 2.5) prop = xmp.get_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied") self.assertFalse(prop) xmp.set_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied", True) prop = xmp.get_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied") self.assertTrue(prop) prop = xmp.get_property_int(NS_EXIF, "MeteringMode") self.assertEqual(prop, 5) xmp.set_property_int(NS_EXIF, "MeteringMode", 10) prop = xmp.get_property_long(NS_EXIF, "MeteringMode") self.assertEqual(prop, 10) xmp.set_property_long(NS_EXIF, "MeteringMode", 32) prop = xmp.get_property_int(NS_EXIF, "MeteringMode") self.assertEqual(prop, 32)
def test_exempi_core(self): """Corresponds to test_exempi.TestExempi.test_exempi_core""" filename = pkg_resources.resource_filename(__name__, "samples/test1.xmp") with open(filename, 'r') as fptr: strbuffer = fptr.read() xmp = XMPMeta() xmp.parse_from_str(strbuffer) self.assertTrue(xmp.does_property_exist(NS_TIFF, 'Make')) self.assertFalse(xmp.does_property_exist(NS_TIFF, 'Foo')) prop = xmp.get_property(NS_TIFF, 'Make') self.assertEqual(prop, 'Canon') xmp.set_property(NS_TIFF, 'Make', 'Leica') prop = xmp.get_property(NS_TIFF, 'Make') self.assertEqual(prop, 'Leica') # Some tests correspond to option masks not currently returned via # this interface. item = xmp.get_localized_text(NS_DC, 'rights', None, 'x-default') self.assertEqual(item, "2006, Hubert Figuiere") xmp.set_localized_text(NS_DC, 'rights', 'en', 'en-CA', 'Foo bar') item = xmp.get_localized_text(NS_DC, 'rights', 'en', 'en-US') # Can't look at the actual lang, unlike the original test. self.assertEqual(item, 'Foo bar') xmp.delete_localized_text(NS_DC, 'rights', 'en', 'en-CA') self.assertFalse(xmp.does_property_exist(NS_DC, "rights[1]")) xmp.set_array_item(NS_DC, "creator", 2, "foo") xmp.append_array_item(NS_DC, "creator", "bar") prop = xmp.get_array_item(NS_DC, "creator", 3) self.assertEqual(prop, "bar") xmp.delete_property(NS_DC, "creator[3]") self.assertFalse(xmp.does_property_exist(NS_DC, "creator[3]")) prop = xmp.get_property(NS_EXIF, "DateTimeOriginal") self.assertEqual(prop, "2006-12-07T23:20:43-05:00") the_prop = xmp.get_property_datetime(NS_EXIF, "DateTimeOriginal") self.assertEqual(the_prop.year, 2006) self.assertEqual(the_prop.minute, 20) self.assertEqual(the_prop.tzinfo, pytz.utc) prop = xmp.get_property(NS_XAP, "Rating") self.assertEqual(prop, "3") prop = xmp.get_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius") self.assertEqual(prop, 1.0) xmp.set_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius", 2.5) prop = xmp.get_property_float(NS_CAMERA_RAW_SETTINGS, "SharpenRadius") self.assertEqual(prop, 2.5) prop = xmp.get_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied") self.assertFalse(prop) xmp.set_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied", True) prop = xmp.get_property_bool(NS_CAMERA_RAW_SETTINGS, "AlreadyApplied") self.assertTrue(prop) prop = xmp.get_property_int(NS_EXIF, "MeteringMode") self.assertEqual(prop, 5) xmp.set_property_int(NS_EXIF, "MeteringMode", 10) prop = xmp.get_property_long(NS_EXIF, "MeteringMode") self.assertEqual(prop, 10) xmp.set_property_long(NS_EXIF, "MeteringMode", 32) prop = xmp.get_property_int(NS_EXIF, "MeteringMode") self.assertEqual(prop, 32)
def worker(filepath): # initialize saucenao saucenao_core = SauceNao( directory='directory', databases=9, # 999 by default, 5 for pixiv, 9 for booru. minimum_similarity=65, combine_api_types=False, api_key=saucenao_api_key, exclude_categories='', move_to_categories=False, use_author_as_category=False, output_type=SauceNao.API_JSON_TYPE, start_file='', log_level=logging.ERROR, title_minimum_similarity=90) # search image on saucenao try: result = search(saucenao_core, filepath) except requests.exceptions.ConnectionError: print("Failed to connect saucenao!") return -1 except saucenao.exceptions.DailyLimitReachedException: print("Saucenao daily limit reached! try 1 hour later!") return -2 if (len(result) is 0): print('Image not found on danbooru!') return 1 else: danbooru_id = result[0]['data']['danbooru_id'] print('Image Found, ID=' + str(danbooru_id)) # GET danbooru tag json try: http = urllib3.PoolManager() # disable https cert check warning urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = 'https://danbooru.donmai.us/posts/' + str( danbooru_id) + '.json' headers = urllib3.util.make_headers(basic_auth=danbooru_login + ':' + danbooru_api_key) r = http.request('GET', url, headers=headers) r_data = r.data if isinstance(r_data, bytes): r_data = str(r_data, 'utf-8') tags = json.loads(r_data)['tag_string'] taglist = tags.split() except requests.exceptions.ConnectionError: print('failed to GET tag data from danbooru') return -1 # Write XMP Metadata to image xmpfile = XMPFiles(file_path=filepath, open_forupdate=True) xmp = xmpfile.get_xmp() # if image has no xmp data, create one if (xmp is None): xmp = XMPMeta() # write the tags for each in taglist: # check whether XMP includes 'subject' property, # if not, create a new one if (not xmp.does_property_exist(consts.XMP_NS_DC, 'subject')): xmp.append_array_item(consts.XMP_NS_DC, 'subject', each, { 'prop_array_is_ordered': True, 'prop_value_is_array': True }) # check whether tag has been written to file if (not xmp.does_array_item_exist(consts.XMP_NS_DC, 'subject', each)): xmp.append_array_item(consts.XMP_NS_DC, 'subject', each) if (xmpfile.can_put_xmp(xmp)): xmpfile.put_xmp(xmp) xmpfile.close_file() return 0 else: print('Unable to write XMP data!') return -1