plxnner
Version:
An elegant open-source planner for Instagram
175 lines (140 loc) • 3.82 kB
text/typescript
import { exportWithDesiredName, getFileExtension } from "./utilsFile"
/**
* Rebuild raw user config from exported user data
*
* @param user
*/
export async function rebuildRawUserConfig(user: IUser) {
const rawUser = {
profile: {},
media: {},
} as IRawUser
rawUser.profile = await rebuildRawUserProfileConfig(user)
rawUser.media = await rebuildRawUserMediaConfig(user)
return rawUser
}
/**
* Rebuild raw user profile config
*
* @param user
*/
export async function rebuildRawUserProfileConfig(user: IUser) {
let rawUserProfile = {} as IRawUserProfile
// assign copy of the profile to rawUser
rawUserProfile = await user.profile.export()
if (rawUserProfile.avatar && typeof rawUserProfile.avatar !== 'string') {
// replace avatar file with avatar file name
rawUserProfile.avatar = `avatar.${getFileExtension(
rawUserProfile.avatar.name,
)}`
}
return rawUserProfile
}
/**
* Rebuild raw user media config
*
* @param user
*/
export async function rebuildRawUserMediaConfig(user: IUser) {
const rawUserMedia = {} as IRawUserMedia
let i: number
// for each media collection
for (const collectionKey of user.media.collectionKeys) {
i = user.media.collections[collectionKey].length
rawUserMedia[collectionKey] = []
const mediaCollectionItems = [...user.media.collections[collectionKey]]
// for each media in this collection
for (const media of mediaCollectionItems) {
const rawMedia = await rebuildRawMediaConfig(media, i)
rawUserMedia[collectionKey].push(rawMedia)
i--
}
}
return rawUserMedia
}
/**
* Depending on media type,
* rebuild original raw media
*
* @param media
* @param mediaIndex
* @param mediaAlbumIndex
*/
async function rebuildRawMediaConfig(
media: any,
mediaIndex: number,
mediaAlbumIndex: number = -1,
) {
let rawMediaConfig = { ...media.exportConfig() }
let rawMediaFileName: string = `${media.collectionSingularized}-${mediaIndex}`
if (mediaAlbumIndex > -1) rawMediaFileName += `x${mediaAlbumIndex}`
switch (media.type) {
case "album":
let albumMediaIndex = 1
let albumItems = []
// run rebuildRawMediaConfig for each album item
if (media.list) {
for await (const albumItemMedia of media.list) {
const rawAlbumMedia = await rebuildRawMediaConfig(
albumItemMedia,
mediaIndex,
albumMediaIndex,
)
albumItems.push(rawAlbumMedia)
albumMediaIndex++
}
}
return {
...rawMediaConfig,
list: albumItems
}
case "iframe":
await media.fetch()
if (media.cover) {
rawMediaConfig.cover = exportWithDesiredName(
await media.cover.file,
`${rawMediaFileName}-cover`
)
}
return {
...rawMediaConfig,
}
case "video":
await media.fetch()
rawMediaConfig.name = exportWithDesiredName(
await media.file,
rawMediaFileName
)
if (media.cover) {
await media.cover.fetch()
rawMediaConfig.cover = exportWithDesiredName(
await media.cover.file,
`${rawMediaFileName}-cover`
)
}
return {
...rawMediaConfig,
}
case "image":
await media.fetch()
// it's an album's image,
// return just the name
// (no caption or other properties)
if (mediaAlbumIndex > -1) {
return {
name: exportWithDesiredName(
await media.file,
rawMediaFileName
)
}
}
// return raw image config
return {
...rawMediaConfig,
name: exportWithDesiredName(
await media.file,
rawMediaFileName
)
}
}
}