 			::flags (set/intersection flags #{:id3.flag/experimental})
 			::size (max size (body-size tag))})))
 
-(defn ^:private group-frames-by [k frames content-key]
+(defn group-frames-by [k frames content-key]
 	(into {}
 		(for [[desc [first & extra]] (group-by k frames)]
 			(if extra (error "Multiple %s:%s frames" (:id3.frame/id first) desc)
 				[desc (content-key first)]))))
 
-(defn ^:private cannot-encode? [encoder value]
+(defn cannot-encode? [encoder value]
 	(let [f #(not (.canEncode encoder %))]
 		(if (coll? value)
 			(some f value)
 			(f value))))
 
-(defn ^:private cannot-encode-latin1? [frame]
+(defn cannot-encode-latin1? [frame]
 	(let [latin1-encoder (.newEncoder (java.nio.charset.Charset/forName latin1))]
 		(some #(cannot-encode? latin1-encoder (% frame))
 			(text-frame-keys (common/frame-type (:id3.frame/id frame))))))
 
-(defn ^:private safe-encoding [tag]
+(defn safe-encoding [tag]
 	({3 utf16 4 utf8}
 		(::version tag)))
 
-(defn ^:private set-encoding [encoding tag]
+(defn set-encoding [encoding tag]
 	(update-in tag [::frames]
 		(partial map (fn [frame]
 			(cond

		[clojure.java.io :as io]
		[org.clojars.smee.binary.core :as b]))

(def ^:private default-padding 1024)

(defn body-size [tag]
	(apply + (map #(+ 10 (common/frame-body-size %)) (::frames tag))))

(def ^:private id3-header (b/ordered-map
	::magic-number (b/constant (b/string latin1 :length 3) "ID3")
	::version (b/enum :byte {3 3 4 4})
	::revision :byte
	::flags (b/bits [nil nil nil nil :id3.flag/footer :id3.flag/experimental :id3.flag/extended-header :id3.flag/unsynchronized]) ; ID3v2.3 doesn't really have a footer tag, but it's not worth the complexity of separate header codecs
	::size common/synchsafe-int))

(def ^:private text-frame-keys #:id3.frame.type{
	:text [:id3.frame/content]
	:user-text [:id3.frame/description :id3.frame/content]
	:picture [:id3.frame/description]})

(def ^:private id3
	(b/header id3-header
		(fn [header] (b/compile-codec (common/body-codec header)
			#(apply dissoc % (keys header))

				:else
					frame)))))

(defn full->normal [tag]
	(into {}
		(for [[id [first-frame & extra-frames :as frames]] (group-by :id3.frame/id (::frames tag))]
			[id (case (common/frame-type id)
