Skip to content

Commit

Permalink
Add YouTube cache table
Browse files Browse the repository at this point in the history
  • Loading branch information
calzoneman committed Feb 9, 2020
1 parent 46311bd commit b80a532
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 2 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"author": "Calvin Montgomery",
"name": "CyTube",
"description": "Online media synchronizer and chat",
"version": "3.67.2",
"version": "3.68.0",
"repository": {
"url": "http://github.com/calzoneman/sync"
},
Expand Down
4 changes: 4 additions & 0 deletions src/database.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var tables = require("./database/tables");
import * as Metrics from './metrics/metrics';
import knex from 'knex';
import { GlobalBanDB } from './db/globalban';
import { MetadataCacheDB } from './database/metadata_cache';
import { Summary, Counter } from 'prom-client';

const LOGGER = require('@calzoneman/jsli')('database');
Expand Down Expand Up @@ -84,6 +85,9 @@ module.exports.init = function (newDB) {
.then(() => {
require('./database/update').checkVersion();
module.exports.loadAnnouncement();
require('cytube-mediaquery/lib/provider/youtube').setCache(
new MetadataCacheDB(db)
);
}).catch(error => {
LOGGER.error(error.stack);
process.exit(1);
Expand Down
69 changes: 69 additions & 0 deletions src/database/metadata_cache.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { createMySQLDuplicateKeyUpdate } from '../util/on-duplicate-key-update';
const Switches = require('../switches');

const Media = require('cytube-mediaquery/lib/media');

// TODO: these fullname-vs-shortcode hacks really need to be abolished
function mediaquery2cytube(type) {
switch (type) {
case 'youtube':
return 'yt';
default:
throw new Error(`mediaquery2cytube: no mapping for ${type}`);
}
}

function cytube2mediaquery(type) {
switch (type) {
case 'yt':
return 'youtube';
default:
throw new Error(`cytube2mediaquery: no mapping for ${type}`);
}
}

class MetadataCacheDB {
constructor(db) {
this.db = db;
}

async put(media) {
if (!Switches.isActive('ytCache')) return;

media = new Media(media);
media.type = mediaquery2cytube(media.type);
return this.db.runTransaction(async tx => {
let insert = tx.table('media_metadata_cache')
.insert({
id: media.id,
type: media.type,
metadata: JSON.stringify(media)
});
let update = tx.raw(createMySQLDuplicateKeyUpdate(
['metadata']
));

return tx.raw(insert.toString() + update.toString());
});
}

async get(id, type) {
if (!Switches.isActive('ytCache')) return null;

return this.db.runTransaction(async tx => {
let row = await tx.table('media_metadata_cache')
.where({ id, type })
.first();

if (row === undefined || row === null) {
return null;
}

let metadata = JSON.parse(row.metadata);
metadata.type = cytube2mediaquery(metadata.type);
return new Media(metadata);
});
}
}

export { MetadataCacheDB };
13 changes: 13 additions & 0 deletions src/database/tables.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,17 @@ export async function initTables() {
t.timestamps(/* useTimestamps */ true, /* defaultToNow */ true);
t.index('created_at');
});

await ensureTable('media_metadata_cache', t => {
// The types of id and type are chosen for compatibility
// with the existing channel_libraries table.
// TODO in the future schema, revisit the ID layout for different media types.
t.string('id', 255).notNullable();
t.string('type', 2).notNullable();
t.text('metadata').notNullable();
t.timestamps(/* useTimestamps */ true, /* defaultToNow */ true);

t.primary(['type', 'id']);
t.index('updated_at');
});
}
3 changes: 2 additions & 1 deletion src/switches.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const switches = {
plDirtyCheck: true
plDirtyCheck: true,
ytCache: true
};

export function isActive(switchName) {
Expand Down

0 comments on commit b80a532

Please sign in to comment.