Datapack

PistonFrameDupePack

Make a data pack that makes it so if a piston breaks an item frame, the item frame along with whatever is in it gets duplicated.

data/pistonframedupe/functions/frame/duplicate.mcfunction
execute if data storage pistonframedupe:frame {glow:1b} run summon glow_item_frame 0 0 0 {Tags:["pfd.spawned"],Invulnerable:1b,NoGravity:1b,Silent:1b}
execute unless data storage pistonframedupe:frame {glow:1b} run summon item_frame 0 0 0 {Tags:["pfd.spawned"],Invulnerable:1b,NoGravity:1b,Silent:1b}

execute as @e[type=item_frame,tag=pfd.spawned,sort=nearest,limit=1] at @s if data storage pistonframedupe:frame spawn run teleport @s ~ ~ ~
execute as @e[type=glow_item_frame,tag=pfd.spawned,sort=nearest,limit=1] at @s if data storage pistonframedupe:frame spawn run teleport @s ~ ~ ~

execute as @e[type=item_frame,tag=pfd.spawned,sort=nearest,limit=1] run data modify entity @s Item set from storage pistonframedupe:frame item
execute as @e[type=glow_item_frame,tag=pfd.spawned,sort=nearest,limit=1] run data modify entity @s Item set from storage pistonframedupe:frame item

tag @e[type=item_frame,tag=pfd.spawned,sort=nearest,limit=1] remove pfd.spawned
tag @e[type=glow_item_frame,tag=pfd.spawned,sort=nearest,limit=1] remove pfd.spawned