« get me outta code hell

content: basic AdditionalFile.paths port - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-05-16 12:32:14 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-05-16 12:32:14 -0300
commitf3254601cb9a50ffaa25acade72bab8bbb825a09 (patch)
tree453bcda43b1fb348d4626a7baaa64d15178dd05e
parent17333795f6a371334b66a11f89353b5c2db2b5ea (diff)
content: basic AdditionalFile.paths port
-rw-r--r--src/content/dependencies/generateAlbumAdditionalFilesList.js27
-rw-r--r--src/content/dependencies/linkAdditionalFile.js29
-rw-r--r--src/content/dependencies/linkAlbumAdditionalFile.js24
-rw-r--r--src/content/dependencies/listAllAdditionalFilesTemplate.js101
4 files changed, 85 insertions, 96 deletions
diff --git a/src/content/dependencies/generateAlbumAdditionalFilesList.js b/src/content/dependencies/generateAlbumAdditionalFilesList.js
index 9fbd1553..07441f24 100644
--- a/src/content/dependencies/generateAlbumAdditionalFilesList.js
+++ b/src/content/dependencies/generateAlbumAdditionalFilesList.js
@@ -5,7 +5,7 @@ export default {
     'generateAdditionalFilesList',
     'generateAdditionalFilesListChunk',
     'generateAdditionalFilesListChunkItem',
-    'linkAlbumAdditionalFile',
+    'linkAdditionalFile',
     'transformContent',
   ],
 
@@ -21,18 +21,17 @@ export default {
 
     chunkDescriptions:
       additionalFiles
-        .map(({description}) =>
-          relation('transformContent', description)),
+        .map(file => relation('transformContent', file.description)),
 
     chunkItems:
       additionalFiles
-        .map(({filenames}) => filenames
+        .map(file => file.paths
           .map(() => relation('generateAdditionalFilesListChunkItem'))),
 
     chunkItemFileLinks:
       additionalFiles
-        .map(({filenames}) => filenames
-          .map(filename => relation('linkAlbumAdditionalFile', album, filename))),
+        .map(file => file.filenames
+          .map(filename => relation('linkAdditionalFile', file, filename))),
   }),
 
   data: (album, additionalFiles) => ({
@@ -40,11 +39,11 @@ export default {
 
     chunkTitles:
       additionalFiles
-        .map(({title}) => title),
+        .map(file => file.title),
 
-    chunkItemFilenames:
+    chunkItemPaths:
       additionalFiles
-        .map(({filenames}) => filenames),
+        .map(file => file.paths),
   }),
 
   slots: {
@@ -71,13 +70,13 @@ export default {
         stitchArrays({
           items: relations.chunkItems,
           fileLinks: relations.chunkItemFileLinks,
-          filenames: data.chunkItemFilenames,
-        }).map(({items, fileLinks, filenames}) =>
+          paths: data.chunkItemPaths,
+        }).map(({items, fileLinks, paths}) =>
             stitchArrays({
               item: items,
               fileLink: fileLinks,
-              filename: filenames,
-            }).map(({item, fileLink, filename}) =>
+              path: paths,
+            }).map(({item, fileLink, path}) =>
                 item.slots({
                   fileLink: fileLink,
                   fileSize:
@@ -85,7 +84,7 @@ export default {
                       ? getSizeOfMediaFile(
                           urls
                             .from('media.root')
-                            .to('media.albumAdditionalFile', data.albumDirectory, filename))
+                            .to(...path))
                       : 0),
                 }))),
     }),
diff --git a/src/content/dependencies/linkAdditionalFile.js b/src/content/dependencies/linkAdditionalFile.js
new file mode 100644
index 00000000..a8a940b1
--- /dev/null
+++ b/src/content/dependencies/linkAdditionalFile.js
@@ -0,0 +1,29 @@
+export default {
+  contentDependencies: ['linkTemplate'],
+
+  query: (file, filename) => ({
+    index:
+      file.filenames.indexOf(filename),
+  }),
+
+  relations: (relation, _query, _file, _filename) => ({
+    linkTemplate:
+      relation('linkTemplate'),
+  }),
+
+  data: (query, file, filename) => ({
+    filename,
+
+    // Kinda jank, but eh.
+    path:
+      (query.index >= 0
+        ? file.paths.at(query.index)
+        : null),
+  }),
+
+  generate: (data, relations) =>
+    relations.linkTemplate.slots({
+      path: data.path,
+      content: data.filename,
+    }),
+};
diff --git a/src/content/dependencies/linkAlbumAdditionalFile.js b/src/content/dependencies/linkAlbumAdditionalFile.js
deleted file mode 100644
index 527133db..00000000
--- a/src/content/dependencies/linkAlbumAdditionalFile.js
+++ /dev/null
@@ -1,24 +0,0 @@
-export default {
-  contentDependencies: ['linkTemplate'],
-
-  relations(relation) {
-    return {
-      linkTemplate: relation('linkTemplate'),
-    };
-  },
-
-  data(album, filename) {
-    return {
-      albumDirectory: album.directory,
-      filename,
-    };
-  },
-
-  generate(data, relations) {
-    return relations.linkTemplate
-      .slots({
-        path: ['media.albumAdditionalFile', data.albumDirectory, data.filename],
-        content: data.filename,
-      });
-  },
-};
diff --git a/src/content/dependencies/listAllAdditionalFilesTemplate.js b/src/content/dependencies/listAllAdditionalFilesTemplate.js
index 9b890526..90be6440 100644
--- a/src/content/dependencies/listAllAdditionalFilesTemplate.js
+++ b/src/content/dependencies/listAllAdditionalFilesTemplate.js
@@ -7,7 +7,7 @@ export default {
     'generateListAllAdditionalFilesChunk',
     'linkAlbum',
     'linkTrack',
-    'linkAlbumAdditionalFile',
+    'linkAdditionalFile',
   ],
 
   extraDependencies: ['html', 'language', 'wikiData'],
@@ -28,63 +28,37 @@ export default {
     // as though they do implement those fields, but don't have any
     // additional files of that type.
 
-    const albumAdditionalFileObjects =
+    const albumAdditionalFileLists =
       albums
         .map(album => album[property] ?? []);
 
-    const trackAdditionalFileObjects =
+    const trackAdditionalFileLists =
       tracks
         .map(byAlbum => byAlbum
           .map(track => track[property] ?? []));
 
     // Filter out tracks that don't have any additional files.
 
-    stitchArrays({tracks, trackAdditionalFileObjects})
-      .forEach(({tracks, trackAdditionalFileObjects}) => {
-        filterMultipleArrays(tracks, trackAdditionalFileObjects,
-          (track, trackAdditionalFileObjects) => !empty(trackAdditionalFileObjects));
+    stitchArrays({tracks, trackAdditionalFileLists})
+      .forEach(({tracks, trackAdditionalFileLists}) => {
+        filterMultipleArrays(tracks, trackAdditionalFileLists,
+          (track, trackAdditionalFileLists) => !empty(trackAdditionalFileLists));
       });
 
     // Filter out albums that don't have any tracks,
     // nor any additional files of their own.
 
-    filterMultipleArrays(albums, albumAdditionalFileObjects, tracks, trackAdditionalFileObjects,
-      (album, albumAdditionalFileObjects, tracks, trackAdditionalFileObjects) =>
-        !empty(albumAdditionalFileObjects) ||
-        !empty(trackAdditionalFileObjects));
-
-    // Map additional file objects into titles and lists of file names.
-
-    const albumAdditionalFileTitles =
-      albumAdditionalFileObjects
-        .map(byAlbum => byAlbum
-          .map(({title}) => title));
-
-    const albumAdditionalFileFilenames =
-      albumAdditionalFileObjects
-        .map(byAlbum => byAlbum
-          .map(({filenames}) => filenames));
-
-    const trackAdditionalFileTitles =
-      trackAdditionalFileObjects
-        .map(byAlbum => byAlbum
-          .map(byTrack => byTrack
-            .map(({title}) => title)));
-
-    const trackAdditionalFileFilenames =
-      trackAdditionalFileObjects
-        .map(byAlbum => byAlbum
-          .map(byTrack => byTrack
-            .map(({filenames}) => filenames)));
+    filterMultipleArrays(albums, albumAdditionalFileLists, tracks, trackAdditionalFileLists,
+      (album, albumAdditionalFileLists, tracks, trackAdditionalFileLists) =>
+        !empty(albumAdditionalFileLists) ||
+        !empty(trackAdditionalFileLists));
 
     return {
       spec,
       albums,
       tracks,
-      albumAdditionalFileTitles,
-      albumAdditionalFileFilenames,
-      trackAdditionalFileTitles,
-      trackAdditionalFileFilenames,
+      albumAdditionalFileLists,
+      trackAdditionalFileLists,
     };
   },
 
@@ -111,30 +85,41 @@ export default {
           .map(() => relation('generateListAllAdditionalFilesChunk'))),
 
     albumAdditionalFileLinks:
-      stitchArrays({
-        album: query.albums,
-        filenames: query.albumAdditionalFileFilenames,
-      }).map(({album, filenames: byAlbum}) =>
-          byAlbum
-            .map(filenames => filenames
-              .map(filename => relation('linkAlbumAdditionalFile', album, filename)))),
+      query.albumAdditionalFileLists
+        .map(files => files
+          .map(file => file.filenames
+            .map(filename => relation('linkAdditionalFile', file, filename)))),
 
     trackAdditionalFileLinks:
-      stitchArrays({
-        album: query.albums,
-        filenames: query.trackAdditionalFileFilenames,
-      }).map(({album, filenames: byAlbum}) =>
-          byAlbum
-            .map(byTrack => byTrack
-              .map(filenames => filenames
-                .map(filename => relation('linkAlbumAdditionalFile', album, filename))))),
+      query.trackAdditionalFileLists
+        .map(byAlbum => byAlbum
+          .map(files => files
+            .map(file => file.filenames
+              .map(filename => relation('linkAdditionalFile', file, filename))))),
   }),
 
   data: (query) => ({
-    albumAdditionalFileTitles: query.albumAdditionalFileTitles,
-    trackAdditionalFileTitles: query.trackAdditionalFileTitles,
-    albumAdditionalFileFilenames: query.albumAdditionalFileFilenames,
-    trackAdditionalFileFilenames: query.trackAdditionalFileFilenames,
+    albumAdditionalFileTitles:
+      query.albumAdditionalFileLists
+        .map(files => files
+          .map(file => file.title)),
+
+    trackAdditionalFileTitles:
+      query.trackAdditionalFileLists
+        .map(byAlbum => byAlbum
+          .map(files => files
+            .map(file => file.title))),
+
+    albumAdditionalFileFilenames:
+      query.albumAdditionalFileLists
+        .map(files => files
+          .map(file => file.filenames)),
+
+    trackAdditionalFileFilenames:
+      query.trackAdditionalFileLists
+        .map(byAlbum => byAlbum
+          .map(files => files
+            .map(file => file.filenames))),
   }),
 
   slots: {