Implement some sort of basic rss scraping
This commit is contained in:
88
lib/game.dart
Normal file
88
lib/game.dart
Normal file
@@ -0,0 +1,88 @@
|
||||
import 'package:gamer_updater/db.dart';
|
||||
import 'package:gamer_updater/utils.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:dart_rss/dart_rss.dart';
|
||||
|
||||
class Game {
|
||||
final String name;
|
||||
final String versionRegex;
|
||||
final RegExp _internalVersionRegex;
|
||||
final String lastPlayed;
|
||||
String actualVersion;
|
||||
String lastUpdated;
|
||||
final String rssFeedUrl;
|
||||
|
||||
Game({
|
||||
required this.name,
|
||||
required this.versionRegex,
|
||||
required this.lastPlayed,
|
||||
this.actualVersion = '',
|
||||
required this.rssFeedUrl,
|
||||
this.lastUpdated = '',
|
||||
}) : _internalVersionRegex = RegExp(versionRegex);
|
||||
|
||||
Future<void> updateActualVersion() async {
|
||||
final response = await http.get(Uri.parse(rssFeedUrl));
|
||||
final document = RssFeed.parse(response.body);
|
||||
final pages = document.items;
|
||||
pages.sort((a, b) {
|
||||
var lhs = parseRfc822Date(a.pubDate!);
|
||||
var rhs = parseRfc822Date(b.pubDate!);
|
||||
return rhs.compareTo(lhs);
|
||||
});
|
||||
final versions =
|
||||
pages
|
||||
.map((e) => _internalVersionRegex.firstMatch(e.title!)?.group(1))
|
||||
.toList();
|
||||
|
||||
for (int i = 0; i < versions.length; i++) {
|
||||
final version = versions[i];
|
||||
final page = pages[i];
|
||||
if (version != null) {
|
||||
actualVersion = version;
|
||||
lastUpdated = parseRfc822Date(page.pubDate!).toIso8601String();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class GameRepository {
|
||||
static Future<Game> upsert(Game game) async {
|
||||
final db = await DB.db;
|
||||
await db.rawInsert(
|
||||
'''
|
||||
INSERT INTO games
|
||||
(name, actual_version, last_played, rss_feed_url, version_regex, last_updated)
|
||||
VALUES
|
||||
(?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(name) DO UPDATE SET
|
||||
actual_version = excluded.actual_version,
|
||||
last_played = excluded.last_played,
|
||||
rss_feed_url = excluded.rss_feed_url,
|
||||
version_regex = excluded.version_regex,
|
||||
last_updated = excluded.last_updated
|
||||
''',
|
||||
[
|
||||
game.name,
|
||||
game.actualVersion,
|
||||
game.lastPlayed,
|
||||
game.rssFeedUrl,
|
||||
game.versionRegex,
|
||||
game.lastUpdated,
|
||||
],
|
||||
);
|
||||
return game;
|
||||
}
|
||||
}
|
||||
|
||||
//CREATE TABLE IF NOT EXISTS games (
|
||||
// id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
// name TEXT NOT NULL,
|
||||
// actual_version TEXT NOT NULL,
|
||||
// last_played TEXT NOT NULL,
|
||||
// rss_feed_url TEXT NOT NULL,
|
||||
// version_regex TEXT NOT NULL,
|
||||
// last_updated TEXT NOT NULL
|
||||
//);
|
||||
//CREATE INDEX IF NOT EXISTS idx_games_name ON games (name);
|
||||
Reference in New Issue
Block a user