Quellcode durchsuchen

Merge pull request #502 from traumschule/featured-categories

32.CC-2 - Update Featured Categories
mochet vor 3 Jahren
Ursprung
Commit
5fec1c4671

+ 12 - 0
working-groups/curator-group/featured/README.md

@@ -0,0 +1,12 @@
+# [32.CC-2 - Update Featured Categories](https://blog.joystream.org/sumer-kpis/#32.CC-2)
+
+```
+yarn
+yarn run categories COMMAND
+```
+
+Commands
+- `get`: show current category videos // TODO FIX
+- `set`: display mutation requests
+- `update`: updates videos.json from `list` (generate with `find DirectoryWithCategoryVideosCuts > list`
+- `schedule`: regenerates schedule

+ 180 - 0
working-groups/curator-group/featured/categories.ts

@@ -0,0 +1,180 @@
+import { Video, OrionVideo, Category, Schedule } from "./types";
+import fs from "fs";
+import axios from "axios";
+import moment from "moment";
+import dotenv from "dotenv";
+dotenv.config();
+const orionHeader = process.env.orionHeader;
+const orionUrl = `https://orion.joystream.org/graphql`;
+const videosFile = "./videos.json";
+const scheduleFile = "./schedule.json";
+
+if (!orionHeader) {
+  console.log(`Please set orionHeader in .env`);
+  process.exit(1);
+}
+
+const getDay = (daysFromNow: number = 0) =>
+  moment().add(daysFromNow, "days").format("YYYY-MM-DD");
+
+export const getOrionVideo = ({ videoId }: Video): OrionVideo => {
+  return {
+    videoId,
+    videoCutUrl: `https://eu-central-1.linodeobjects.com/atlas-featured-content/category-featured-videos/1/video-cut-${videoId}.mp4`,
+  };
+};
+
+const loadSchedule = () => require(scheduleFile);
+
+const loadVideos = (): { videos: Video[]; categories: number[] } => {
+  // load videos and extract category IDs
+  const categories: number[] = [];
+  const videos: Video[] = require(videosFile);
+  videos.forEach(
+    ({ categoryId }) =>
+      categories.includes(categoryId) || categories.push(categoryId)
+  );
+  return { videos, categories };
+};
+
+const selectVideos = (videos: Video[], count: number): OrionVideo[] => {
+  let selected: OrionVideo[] = [];
+  for (let n = 0; n < count; ++n) {
+    // remove selected videos
+    const available: Video[] = videos.filter(
+      ({ videoId }) => !selected.find((v) => v.videoId === videoId)
+    );
+    // select random video
+    const id = Math.floor(Math.random() * available.length);
+    if (available.length && available[id])
+      selected.push(getOrionVideo(available[id]));
+    else break;
+  }
+  return selected;
+};
+
+const generateVideoList = (file: string) => {
+  console.log(`Indexing video files ..`);
+  const videos = fs
+    .readFileSync(`./list`, `utf-8`)
+    .split(`\n`)
+    .reduce((list: Video[], path: string): Video[] => {
+      const match = path.match(/\.\/([^\/]+) (\d+)\/(\d+)-(\d+)\.mp4/);
+      if (match) {
+        const category = match[1];
+        const count = Number(match[2]);
+        const categoryId = Number(match[3]);
+        const videoId = Number(match[4]);
+        const video: Video = { category, count, categoryId, videoId };
+        return list.concat(video);
+      } else return list;
+    }, []);
+  fs.writeFileSync(file, JSON.stringify(videos));
+  console.log(`Wrote ${videos.length} videos to ${file}`);
+};
+
+const generateSchedule = (maxDays: number = 7): Schedule => {
+  const loaded = loadVideos();
+  const days: number[] = [];
+  for (let day = 0; day <= maxDays; ++day) {
+    days.push(day);
+  }
+  const left: Video[][] = [];
+  const schedule: Schedule = {};
+  days.forEach((day) => {
+    schedule[getDay(day)] = {
+      categories: loaded.categories.map((categoryId: number) => {
+        const available: Video[] = left[categoryId]
+          ? left[categoryId]
+          : loaded.videos.filter((v) => v.categoryId === categoryId);
+        const videos: OrionVideo[] = selectVideos(available, 3); // select n videos
+        left[categoryId] = available.filter(
+          ({ videoId }) => !videos.find((v) => v.videoId === videoId)
+        );
+        return { categoryId, videos };
+      }),
+    };
+  });
+  return schedule;
+};
+
+const getCategoryFeaturedVideos = (): Promise<string> => {
+  //const headers = {};
+  const data =
+    '{ query: "query GetCategoriesFeaturedVideos {\n  allCategoriesFeaturedVideos {\n    categoryId\n    videos {\n      videoId\n      videoCutUrl\n    }\n  }\n}" }';
+  console.log(`sending`, data);
+  return axios
+    .post(orionUrl, data)
+    .then(({ data }: any) => JSON.stringify(data))
+    .catch((error: any) => error.message + JSON.stringify(error));
+};
+
+const setCategoryVideos = (categoryId: number, videos: OrionVideo[]): string =>
+  `mutation {
+    setCategoryFeaturedVideos(
+        categoryId: "${categoryId}"
+        videos: ${JSON.stringify(videos)}
+    ) {
+        videoId
+        videoCutUrl
+    }
+}`.replace(/\n/, "\n");
+
+const setCategoryFeaturedVideos = async (
+  categoryId: number,
+  videos: OrionVideo[]
+) => {
+  const headers = { Authorization: orionHeader };
+  const data = setCategoryVideos(categoryId, videos);
+  return console.log(`request`, data); // TODO remove after fixing request
+  axios
+    .post(orionUrl, { headers, data })
+    .then(async (res: any) => {
+      console.log(`sent post request to orion (${orionUrl})`, res);
+      //console.log(await getCategoryFeaturedVideos());
+    })
+    .catch((error: any) => {
+      console.error(
+        `Failed to set featured videos for category ${categoryId}: ${JSON.stringify(
+          error
+        )}`
+      );
+    });
+};
+
+const main = async (args: string[]) => {
+  switch (args[0]) {
+    case "get":
+      //const categoryId = Number(process.argv[2]);
+      console.log(await getCategoryFeaturedVideos());
+      break;
+    case "set":
+      try {
+        const schedule: Schedule = require(scheduleFile);
+        //console.log(getDay(), Object.keys(schedule));
+        if (!schedule || !schedule[getDay()]) {
+          console.error(`Current day not found in schedule. Run update again.`);
+          process.exit(1);
+        }
+        const { categories } = schedule[getDay()];
+        categories
+          .sort((a, b) => a.categoryId - b.categoryId)
+          .map(({ categoryId, videos }) =>
+            setCategoryFeaturedVideos(categoryId, videos)
+          );
+      } catch (e) {
+        console.warn(`Did you run: yarn run schedule`);
+      }
+      break;
+    case "schedule":
+      fs.writeFileSync(scheduleFile, JSON.stringify(generateSchedule()));
+      console.log(`Wrote schedule to ${scheduleFile}.`);
+      break;
+    case "update":
+      generateVideoList(videosFile);
+      break;
+    default:
+      console.log(`Available commands: [get, set, schedule, update]`);
+  }
+};
+main(process.argv.slice(2));

+ 187 - 0
working-groups/curator-group/featured/list

@@ -0,0 +1,187 @@
+.
+./News _ Politics 12
+./News _ Politics 12/11-6545.mp4
+./News _ Politics 12/11-6570.mp4
+./News _ Politics 12/11-6548.mp4
+./News _ Politics 12/11-6542.mp4
+./News _ Politics 12/11-6549.mp4
+./News _ Politics 12/11-6571.mp4
+./News _ Politics 12/11-6569.mp4
+./News _ Politics 12/11-6546.mp4
+./News _ Politics 12/11-6568.mp4
+./News _ Politics 12/11-6544.mp4
+./News _ Politics 12/11-6567.mp4
+./News _ Politics 12/11-6547.mp4
+./Travel _ Events 10
+./Travel _ Events 10/6-1553.mp4
+./Travel _ Events 10/6-1556.mp4
+./Travel _ Events 10/6-2100.mp4
+./Travel _ Events 10/6-2103.mp4
+./Travel _ Events 10/6-1554.mp4
+./Travel _ Events 10/6-1558.mp4
+./Travel _ Events 10/6-1557.mp4
+./Travel _ Events 10/6-1912.mov
+./Travel _ Events 10/6-2101.mp4
+./Travel _ Events 10/6-2102.mp4
+./Entertainment (Yes) 12
+./Entertainment (Yes) 12/10-6621.mp4
+./Entertainment (Yes) 12/10-6618.mp4
+./Entertainment (Yes) 12/10-6617.mp4
+./Entertainment (Yes) 12/10-6623.mp4
+./Entertainment (Yes) 12/10-6626.mp4
+./Entertainment (Yes) 12/10-6625.mp4
+./Entertainment (Yes) 12/10-6622.mp4
+./Entertainment (Yes) 12/10-6627.mp4
+./Entertainment (Yes) 12/10-6619.mp4
+./Entertainment (Yes) 12/10-6624.mp4
+./Entertainment (Yes) 12/10-6620.mp4
+./Entertainment (Yes) 12/10-6628.mp4
+./Nonprofits _ Activism 11
+./Nonprofits _ Activism 11/15-6515.mp4
+./Nonprofits _ Activism 11/15-6514.mp4
+./Nonprofits _ Activism 11/15-6517.mp4
+./Nonprofits _ Activism 11/15-6521.mp4
+./Nonprofits _ Activism 11/15-6520.mp4
+./Nonprofits _ Activism 11/15-6523.mp4
+./Nonprofits _ Activism 11/15-6522.mp4
+./Nonprofits _ Activism 11/15-6519.mp4
+./Nonprofits _ Activism 11/15-6513.mp4
+./Nonprofits _ Activism 11/15-6518.mp4
+./Nonprofits _ Activism 11/15-6516.mp4
+./Gaming (Yes) 12
+./Gaming (Yes) 12/7-2120.mp4
+./Gaming (Yes) 12/7-2125.mp4
+./Gaming (Yes) 12/7-2115.mp4
+./Gaming (Yes) 12/7-2108.mp4
+./Gaming (Yes) 12/7-2137.mp4
+./Gaming (Yes) 12/7-2113.mp4
+./Gaming (Yes) 12/7-1996.mp4
+./Gaming (Yes) 12/7-1992.mp4
+./Gaming (Yes) 12/7-2150.mp4
+./Gaming (Yes) 12/7-2145.mp4
+./Gaming (Yes) 12/7-2118.mp4
+./Gaming (Yes) 12/7-2142.mp4
+./Film _ Animation (Yes) 12
+./Film _ Animation (Yes) 12/1-305.mp4
+./Film _ Animation (Yes) 12/1-109.mp4
+./Film _ Animation (Yes) 12/1-117.mp4
+./Film _ Animation (Yes) 12/1-113.mp4
+./Film _ Animation (Yes) 12/1-798.mp4
+./Film _ Animation (Yes) 12/1-788.mp4
+./Film _ Animation (Yes) 12/1-352.mp4
+./Film _ Animation (Yes) 12/1-3.mp4
+./Film _ Animation (Yes) 12/1-796.mp4
+./Film _ Animation (Yes) 12/1-115.mp4
+./Film _ Animation (Yes) 12/1-114.mp4
+./Film _ Animation (Yes) 12/1-790.mp4
+./list
+./Autos _ Vehicles 12
+./Autos _ Vehicles 12/2-6539.mp4
+./Autos _ Vehicles 12/2-6537.mp4
+./Autos _ Vehicles 12/2-6540.mp4
+./Autos _ Vehicles 12/2-6538.mp4
+./Autos _ Vehicles 12/2-6572.mp4
+./Autos _ Vehicles 12/2-6533.mp4
+./Autos _ Vehicles 12/2-6536.mp4
+./Autos _ Vehicles 12/2-6532.mp4
+./Autos _ Vehicles 12/2-6534.mp4
+./Autos _ Vehicles 12/2-6541.mp4
+./Autos _ Vehicles 12/2-6531.mp4
+./Autos _ Vehicles 12/2-6535.mp4
+./Sports (Yes) 12
+./Sports (Yes) 12/5-6525.mp4
+./Sports (Yes) 12/5-6527.mp4
+./Sports (Yes) 12/5-792.mp4
+./Sports (Yes) 12/5-6528.mp4
+./Sports (Yes) 12/5-6562.mp4
+./Sports (Yes) 12/5-6529.mp4
+./Sports (Yes) 12/5-241.mp4
+./Sports (Yes) 12/5-254.mp4
+./Sports (Yes) 12/5-6524.mp4
+./Sports (Yes) 12/5-6530.mp4
+./Sports (Yes) 12/5-6526.mp4
+./Sports (Yes) 12/5-240.mp4
+./Comedy 12
+./Comedy 12/9-6667.mp4
+./Comedy 12/9-6670.mp4
+./Comedy 12/9-6668.mp4
+./Comedy 12/9-6666.mp4
+./Comedy 12/9-6662.mp4
+./Comedy 12/9-6663.mp4
+./Comedy 12/9-6671.mp4
+./Comedy 12/9-6664.mp4
+./Comedy 12/9-6672.mp4
+./Comedy 12/9-6661.mp4
+./Comedy 12/9-6665.mp4
+./Comedy 12/9-6669.mp4
+./Pets _ Animals 10
+./Pets _ Animals 10/4-6647.mp4
+./Pets _ Animals 10/4-544.mp4
+./Pets _ Animals 10/4-543.mp4
+./Pets _ Animals 10/4-1675.mp4
+./Pets _ Animals 10/4-489.mp4
+./Pets _ Animals 10/4-6641.mp4
+./Pets _ Animals 10/4-6643.mp4
+./Pets _ Animals 10/4-537.mp4
+./Pets _ Animals 10/4-248.mp4
+./Pets _ Animals 10/4-6640.mp4
+./Education 12
+./Education 12/13-2159.mp4
+./Education 12/13-6635.mp4
+./Education 12/13-6636.mp4
+./Education 12/13-6634.mp4
+./Education 12/13-6633.mp4
+./Education 12/13-6632.mp4
+./Education 12/13-6629.mp4
+./Education 12/13-6637.mp4
+./Education 12/13-6638.mp4
+./Education 12/13-6639.mp4
+./Education 12/13-6631.mp4
+./Education 12/13-6630.mp4
+./Science _ Technology 12
+./Science _ Technology 12/14-1093.mp4
+./Science _ Technology 12/14-6576.mp4
+./Science _ Technology 12/14-340.mp4
+./Science _ Technology 12/14-6575.mp4
+./Science _ Technology 12/14-6577.mp4
+./Science _ Technology 12/14-310.mp4
+./Science _ Technology 12/14-6573.mp4
+./Science _ Technology 12/14-6579.mp4
+./Science _ Technology 12/14-6580.mp4
+./Science _ Technology 12/14-329.mp4
+./Science _ Technology 12/14-6581.mp4
+./Science _ Technology 12/14-6574.mp4
+./Music 12
+./Music 12/3-6587.mp4
+./Music 12/3-6590.mp4
+./Music 12/3-11.mp4
+./Music 12/3-6593.mp4
+./Music 12/3-6584.mp4
+./Music 12/3-6586.mp4
+./Music 12/3-6592.mp4
+./Music 12/3-6589.mp4
+./Music 12/3-6583.mp4
+./Music 12/3-6582.mp4
+./Music 12/3-6591.mp4
+./Music 12/3-6588.mp4
+./People _ Blogs 8
+./People _ Blogs 8/8-6653.MP4
+./People _ Blogs 8/8-6656.MP4
+./People _ Blogs 8/8-6657.MP4
+./People _ Blogs 8/8-6651.MP4
+./People _ Blogs 8/8-6648.MP4
+./People _ Blogs 8/8-6660.MP4
+./People _ Blogs 8/8-6655.MP4
+./People _ Blogs 8/8-6650.MP4
+./Howto _ Style 11
+./Howto _ Style 11/12-2135.mp4
+./Howto _ Style 11/12-2045.mp4
+./Howto _ Style 11/12-2068.mp4
+./Howto _ Style 11/12-2053.mp4
+./Howto _ Style 11/12-2066.mp4
+./Howto _ Style 11/12-777.mp4
+./Howto _ Style 11/12-674.mp4
+./Howto _ Style 11/12-676.mp4
+./Howto _ Style 11/12-2067.mp4
+./Howto _ Style 11/12-786.mp4
+./Howto _ Style 11/12-2046.mp4

+ 21 - 0
working-groups/curator-group/featured/package.json

@@ -0,0 +1,21 @@
+{
+  "name": "jsfeatured",
+  "version": "0.0.1",
+  "description": "joystream-featured-categories",
+  "main": "categories.ts",
+  "scripts": {
+    "categories": "ts-node categories"
+  },
+  "repository": "https://github.com/Joystream/community-repo/",
+  "author": "l1dev",
+  "license": "MIT",
+  "private": false,
+  "devDependencies": {
+    "@types/node": "^16.11.12",
+    "axios": "^0.24.0",
+    "dotenv": "^10.0.0",
+    "moment": "^2.29.1",
+    "ts-node": "^10.4.0",
+    "typescript": "^4.5.3"
+  }
+}

+ 21 - 0
working-groups/curator-group/featured/types.ts

@@ -0,0 +1,21 @@
+export interface Video {
+  videoId: number;
+  category: string;
+  categoryId: number;
+  count: number;
+}
+
+export interface OrionVideo {
+  videoId: number;
+  videoCutUrl: string;
+}
+
+export interface Category {
+  categoryId: number;
+  videos: OrionVideo[];
+}
+
+export interface Schedule {
+  [key: string]: { categories: Category[] };
+}
+

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
working-groups/curator-group/featured/videos.json


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.