fix(users/Profpatsch/whatcd-resolver): numeric release types

The RED Gazelle API is so inconsistent, smh.

Sometimes they return the release type string, sometimes the integer
representing it. So let’s handle both!

Change-Id: Ie99f01342a13269df5c1e2036aaede54d7149516
Reviewed-on: https://cl.tvl.fyi/c/depot/+/13223
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
Profpatsch 2025-03-08 18:50:28 +01:00
parent 2ed3f7c026
commit cf80c75a69
2 changed files with 56 additions and 45 deletions

View file

@ -539,53 +539,64 @@ data TorrentData transmissionInfo = TorrentData
}
-- | https://redacted.sh/wiki.php?action=article&id=455#_1804298149
newtype ReleaseType = ReleaseType {unReleaseType :: Text}
data ReleaseType = ReleaseType {intKey :: Int, stringKey :: Text}
deriving stock (Eq, Show)
releaseTypeFromTextOrIntKey :: Text -> ReleaseType
releaseTypeFromTextOrIntKey t =
allReleaseTypesSorted
& List.find
( \rt -> do
rt.stringKey == t || buildText intDecimalT rt.intKey == t
)
& fromMaybe (ReleaseType {intKey = (-1), stringKey = t})
releaseTypeComparison :: Comparison ReleaseType
releaseTypeComparison =
listIndexComparison
[ releaseTypeAlbum,
releaseTypeLiveAlbum,
releaseTypeAnthology,
releaseTypeSoundtrack,
releaseTypeEP,
releaseTypeCompilation,
releaseTypeSingle,
releaseTypeRemix,
releaseTypeBootleg,
releaseTypeInterview,
releaseTypeMixtape,
releaseTypeDemo,
releaseTypeConcertRecording,
releaseTypeDJMix,
releaseTypeUnknown,
releaseTypeProducedBy,
releaseTypeComposition,
releaseTypeRemixedBy,
releaseTypeGuestAppearance
]
releaseTypeComparison = listIndexComparison allReleaseTypesSorted
allReleaseTypesSorted :: [ReleaseType]
allReleaseTypesSorted =
[ releaseTypeAlbum,
releaseTypeLiveAlbum,
releaseTypeAnthology,
releaseTypeSoundtrack,
releaseTypeEP,
releaseTypeCompilation,
releaseTypeSingle,
releaseTypeRemix,
releaseTypeBootleg,
releaseTypeInterview,
releaseTypeMixtape,
releaseTypeDemo,
releaseTypeConcertRecording,
releaseTypeDJMix,
releaseTypeUnknown,
releaseTypeProducedBy,
releaseTypeComposition,
releaseTypeRemixedBy,
releaseTypeGuestAppearance
]
releaseTypeAlbum, releaseTypeSoundtrack, releaseTypeEP, releaseTypeAnthology, releaseTypeCompilation, releaseTypeSingle, releaseTypeLiveAlbum, releaseTypeRemix, releaseTypeBootleg, releaseTypeInterview, releaseTypeMixtape, releaseTypeDemo, releaseTypeConcertRecording, releaseTypeDJMix, releaseTypeUnknown, releaseTypeProducedBy, releaseTypeComposition, releaseTypeRemixedBy, releaseTypeGuestAppearance :: ReleaseType
releaseTypeAlbum = ReleaseType "Album"
releaseTypeSoundtrack = ReleaseType "Soundtrack"
releaseTypeEP = ReleaseType "EP"
releaseTypeAnthology = ReleaseType "Anthology"
releaseTypeCompilation = ReleaseType "Compilation"
releaseTypeSingle = ReleaseType "Single"
releaseTypeLiveAlbum = ReleaseType "Live album"
releaseTypeRemix = ReleaseType "Remix"
releaseTypeBootleg = ReleaseType "Bootleg"
releaseTypeInterview = ReleaseType "Interview"
releaseTypeMixtape = ReleaseType "Mixtape"
releaseTypeDemo = ReleaseType "Demo"
releaseTypeConcertRecording = ReleaseType "Concert Recording"
releaseTypeDJMix = ReleaseType "DJ Mix"
releaseTypeUnknown = ReleaseType "Unknown"
releaseTypeProducedBy = ReleaseType "Produced By"
releaseTypeComposition = ReleaseType "Composition"
releaseTypeRemixedBy = ReleaseType "Remixed By"
releaseTypeGuestAppearance = ReleaseType "Guest Appearance"
releaseTypeAlbum = ReleaseType 1 "Album"
releaseTypeSoundtrack = ReleaseType 3 "Soundtrack"
releaseTypeEP = ReleaseType 5 "EP"
releaseTypeAnthology = ReleaseType 6 "Anthology"
releaseTypeCompilation = ReleaseType 7 "Compilation"
releaseTypeSingle = ReleaseType 9 "Single"
releaseTypeLiveAlbum = ReleaseType 11 "Live album"
releaseTypeRemix = ReleaseType 13 "Remix"
releaseTypeBootleg = ReleaseType 14 "Bootleg"
releaseTypeInterview = ReleaseType 15 "Interview"
releaseTypeMixtape = ReleaseType 16 "Mixtape"
releaseTypeDemo = ReleaseType 17 "Demo"
releaseTypeConcertRecording = ReleaseType 18 "Concert Recording"
releaseTypeDJMix = ReleaseType 19 "DJ Mix"
releaseTypeUnknown = ReleaseType 21 "Unknown"
releaseTypeProducedBy = ReleaseType 1021 "Produced By"
releaseTypeComposition = ReleaseType 1022 "Composition"
releaseTypeRemixedBy = ReleaseType 1023 "Remixed By"
releaseTypeGuestAppearance = ReleaseType 1024 "Guest Appearance"
data TorrentGroupJson = TorrentGroupJson
{ groupName :: Text,
@ -684,7 +695,7 @@ getBestTorrents opts = do
groupId <- Dec.fromField @Int
torrentId <- Dec.fromField @Int
seedingWeight <- Dec.fromField @Int
releaseType <- ReleaseType <$> Dec.text
releaseType <- releaseTypeFromTextOrIntKey <$> Dec.text
artists <- Dec.json $
Json.eachInArray $ do
id_ <- Json.keyLabel @"artistId" "id" (Json.asIntegral @_ @Int)

View file

@ -941,7 +941,7 @@ mkBestTorrentsTable opts fresh = do
{Html.toHtml @Text b.torrentGroupJson.groupName}
</a>
</td>
<td>{Html.toHtml @Text b.releaseType.unReleaseType}</td>
<td>{Html.toHtml @Text b.releaseType.stringKey}</td>
<td>{Html.toHtml @Natural b.torrentGroupJson.groupYear}</td>
<td>{Html.toHtml @Int b.seedingWeight}</td>
<td>{Html.toHtml @Text b.torrentFormat}</td>
@ -951,7 +951,7 @@ mkBestTorrentsTable opts fresh = do
)
let section :: NonEmpty (TorrentData (Label "percentDone" Percentage)) -> Html
section rows = do
let releaseType = rows & NonEmpty.head & (.releaseType.unReleaseType)
let releaseType = rows & NonEmpty.head & (.releaseType.stringKey)
[hsx|
<h2>{releaseType}s</h2>
<table class="table">