Initial test version

This commit is contained in:
Kalle Fagerberg 2022-07-10 15:43:07 +02:00 committed by thrillfall
parent 273cb86128
commit b9f982cb92
15 changed files with 20862 additions and 1 deletions

5
.eslintrc.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
extends: [
'@nextcloud',
]
}

4
.gitignore vendored
View File

@ -1 +1,3 @@
vendor/* vendor/
node_modules/
js/

View File

@ -25,4 +25,8 @@
<step>OCA\GPodderSync\Migration\TimestampMigration</step> <step>OCA\GPodderSync\Migration\TimestampMigration</step>
</post-migration> </post-migration>
</repair-steps> </repair-steps>
<settings>
<personal>OCA\GPodderSync\Settings\GPodderSyncPersonal</personal>
<personal-section>OCA\GPodderSync\Sections\GPodderSyncPersonal</personal-section>
</settings>
</info> </info>

3
babel.config.js Normal file
View File

@ -0,0 +1,3 @@
const babelConfig = require('@nextcloud/babel-config')
module.exports = babelConfig

12
jsconfig.json Normal file
View File

@ -0,0 +1,12 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
],
"include": [
"src/**/*"
]
}

View File

@ -0,0 +1,32 @@
<?php
namespace OCA\GPodderSync\Sections;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Settings\IIconSection;
class GPodderSyncPersonal implements IIconSection {
private IL10N $l;
private IURLGenerator $urlGenerator;
public function __construct(IL10N $l, IURLGenerator $urlGenerator) {
$this->l = $l;
$this->urlGenerator = $urlGenerator;
}
public function getIcon(): string {
return $this->urlGenerator->imagePath('core', 'actions/settings-dark.svg');
}
public function getID(): string {
return 'gpoddersync';
}
public function getName(): string {
return $this->l->t('GPodder Sync');
}
public function getPriority(): int {
return 198;
}
}

View File

@ -0,0 +1,69 @@
<?php
namespace OCA\GPodderSync\Settings;
use DateTime;
use OCA\GPodderSync\Db\EpisodeAction\EpisodeActionRepository;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeEntity;
use OCA\GPodderSync\Db\SubscriptionChange\SubscriptionChangeRepository;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IL10N;
use OCP\Settings\ISettings;
class GPodderSyncPersonal implements ISettings {
private IL10N $l;
private IConfig $config;
private SubscriptionChangeRepository $subscriptionChangeRepository;
private EpisodeActionRepository $episodeActionRepository;
private string $userId;
public function __construct(
IConfig $config,
IL10N $l,
$UserId,
SubscriptionChangeRepository $subscriptionChangeRepository,
EpisodeActionRepository $episodeActionRepository,
) {
$this->config = $config;
$this->l = $l;
$this->subscriptionChangeRepository = $subscriptionChangeRepository;
$this->episodeActionRepository = $episodeActionRepository;
$this->userId = $UserId ?? '';
}
public function getForm(): TemplateResponse {
$sinceDatetime = (new DateTime)->setTimestamp(0);
$subscriptions = $this->extractUrlList($this->subscriptionChangeRepository->findAllSubscribed($sinceDatetime, $this->userId));
$episodeActions = $this->episodeActionRepository->findAll(0, $this->userId);
$subStats = array();
foreach ($episodeActions as $action) {
$pod = $action->getPodcast();
$sub = $subStats[$pod] ?? array();
$sub['started']++;
$subStats[$pod] = $sub;
}
$params = array(
'subscriptions' => $subscriptions,
'subStats' => $subStats,
);
return new TemplateResponse('gpoddersync', 'settings/personal', $params);
}
public function getSection(): string {
return 'gpoddersync';
}
public function getPriority(): int {
return 198;
}
/**
* @param array $allSubscribed
* @return mixed
*/
private function extractUrlList(array $allSubscribed): array {
return array_map(static function (SubscriptionChangeEntity $subscription) {
return $subscription->getUrl();
}, $allSubscribed);
}
}

20603
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

49
package.json Normal file
View File

@ -0,0 +1,49 @@
{
"name": "gpoddersync",
"description": "Expose GPodder API to sync podcast consumer apps like AntennaPod",
"version": "1.0.0",
"author": "Thrillfall <thrillfall@disroot.org>",
"contributors": [
"Kalle Fagerberg <kalle.f8@proton.me>"
],
"bugs": {
"url": "https://github.com/thrillfall/nextcloud-gpodder/issues"
},
"repository": {
"url": "https://github.com/thrillfall/nextcloud-gpodder",
"type": "git"
},
"homepage": "https://github.com/thrillfall/nextcloud-gpodder",
"private": true,
"scripts": {
"build": "webpack --node-env production --progress",
"dev": "webpack --node-env development --progress",
"watch": "webpack --node-env development --progress --watch",
"serve": "webpack --node-env development serve --progress",
"lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix",
"stylelint": "stylelint css/*.css css/*.scss src/**/*.scss src/**/*.vue",
"stylelint:fix": "stylelint css/*.css css/*.scss src/**/*.scss src/**/*.vue --fix"
},
"dependencies": {
"@nextcloud/axios": "^1.10.0",
"@nextcloud/dialogs": "^3.1.2",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^5.3.1",
"vue": "^2.7.0"
},
"browserslist": [
"extends @nextcloud/browserslist-config"
],
"engines": {
"node": "^14.0.0",
"npm": "^7.0.0"
},
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.2.0",
"@nextcloud/eslint-config": "^8.0.0",
"@nextcloud/stylelint-config": "^2.1.2",
"@nextcloud/webpack-vue-config": "^5.2.1"
}
}

14
src/personalSettings.js Normal file
View File

@ -0,0 +1,14 @@
import { generateFilePath } from '@nextcloud/router'
import Vue from 'vue'
import PersonalSettingsPage from './views/PersonalSettingsPage.vue'
// eslint-disable-next-line
__webpack_public_path__ = generateFilePath(appName, '', 'js/')
Vue.mixin({ methods: { t, n } })
export default new Vue({
el: '#personal_settings',
render: h => h(PersonalSettingsPage),
})

View File

@ -0,0 +1,24 @@
<template>
<div class="gpoddersync_settings">
<SettingsSection :title="t('gpoddersync', 'Synced subscriptions')"
:description="t('gpoddersync', 'Podcast subscriptions that has so far been synchronized with this Nextcloud account.')">
<span>Hello <span class="red_text">world</span> :)</span>
</SettingsSection>
</div>
</template>
<script>
import { SettingsSection } from '@nextcloud/vue'
export default {
name: 'PersonalSettingsPage',
components: {
SettingsSection,
},
}
</script>
<style lang="scss" scoped>
.red_text {
color: red;
}
</style>

3
stylelint.config.js Normal file
View File

@ -0,0 +1,3 @@
const stylelintConfig = require('@nextcloud/stylelint-config')
module.exports = stylelintConfig

View File

@ -0,0 +1,28 @@
<?php
$subscriptions = $_["subscriptions"];
$subStats = $_["subStats"];
?>
<div class="section">
<h2>Synced subscriptions (<?= count($subscriptions) ?>)</h2>
<?php if (count($subscriptions) == 0) { ?>
<div>
Your account has no subscriptions (podcasts) synced.
</div>
<?php } else { ?>
<ul style="list-style: disc; margin-left: 1em; padding-left: 1em;">
<?php foreach ($subscriptions as $sub) { ?>
<li>
<?= $sub ?>
<dl>
<dt>Episodes started:</dt>
<dd><?= $subStats[$sub] ? $subStats[$sub]["started"] : 0 ?></dd>
</dl>
</li>
<?php } ?>
</ul>
<?php } ?>
</div>

View File

@ -0,0 +1,5 @@
<?php
script('gpoddersync', 'gpoddersync-personalSettings');
?>
<div id="personal_settings"></div>

8
webpack.config.js Normal file
View File

@ -0,0 +1,8 @@
const path = require('path')
const webpackConfig = require('@nextcloud/webpack-vue-config')
webpackConfig.entry = {
personalSettings: path.join(__dirname, 'src', 'personalSettings.js'),
}
module.exports = webpackConfig