Skip to content

Commit ba64a83

Browse files
committed
feat: watch history
1 parent d8ec605 commit ba64a83

25 files changed

+2172
-128
lines changed

android/app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ plugins {
88
android {
99
namespace = "com.example.iptv_player"
1010
compileSdk = flutter.compileSdkVersion
11-
ndkVersion = flutter.ndkVersion
11+
// ndkVersion = flutter.ndkVersion
12+
ndkVersion = "27.0.12077973"
1213

1314
compileOptions {
1415
sourceCompatibility = JavaVersion.VERSION_11

android/app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@
4242
<data android:mimeType="text/plain"/>
4343
</intent>
4444
</queries>
45+
<uses-permission android:name="android.permission.INTERNET" />
46+
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
47+
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
48+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
49+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4550
</manifest>

android/gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
22
android.useAndroidX=true
33
android.enableJetifier=true
4+
flutter.ndkVersion=27.0.12077973

lib/controllers/home_controller.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:iptv_player/models/category_view_model.dart';
3+
import 'package:iptv_player/models/content_type.dart';
34
import 'package:iptv_player/models/playlist_content_model.dart';
45
import 'package:iptv_player/models/view_state.dart';
56
import 'package:iptv_player/repositories/iptv_repository.dart';
@@ -57,15 +58,21 @@ class HomeController extends ChangeNotifier {
5758
}
5859

5960
String getPageTitle() {
60-
switch (_currentIndex) {
61+
switch (currentIndex) {
6162
case 0:
62-
return 'Canlı Yayınlar';
63+
return 'İzleme Geçmişi';
6364
case 1:
64-
return 'Filmler';
65+
return 'Canlı TV';
6566
case 2:
67+
return 'Filmler';
68+
case 3:
6669
return 'Diziler';
70+
case 4:
71+
return 'Arama';
72+
case 5:
73+
return 'Ayarlar';
6774
default:
68-
return 'IP TV Player';
75+
return 'IPTV Player';
6976
}
7077
}
7178

lib/database/database.dart

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'dart:io';
2+
23
import 'package:drift/drift.dart';
34
import 'package:flutter/foundation.dart' hide Category;
45
import 'package:iptv_player/drift_flutter.dart';
56
import 'package:iptv_player/models/category.dart';
7+
import 'package:iptv_player/models/content_type.dart';
68
import 'package:iptv_player/models/live_stream.dart';
79
import 'package:iptv_player/models/series.dart';
810
import 'package:iptv_player/models/vod_streams.dart';
@@ -189,6 +191,22 @@ class Episodes extends Table {
189191
RealColumn get rating => real().nullable()();
190192
}
191193

194+
@DataClassName('WatchHistoriesData')
195+
class WatchHistories extends Table {
196+
TextColumn get playlistId => text()();
197+
IntColumn get contentType => intEnum<ContentType>()();
198+
TextColumn get streamId => text()();
199+
TextColumn get seriesId => text().nullable()();
200+
IntColumn get watchDuration => integer().nullable()();
201+
IntColumn get totalDuration => integer().nullable()();
202+
DateTimeColumn get lastWatched => dateTime()();
203+
TextColumn get imagePath => text().nullable()();
204+
TextColumn get title => text()();
205+
206+
@override
207+
Set<Column> get primaryKey => {playlistId, streamId};
208+
}
209+
192210
@DriftDatabase(
193211
tables: [
194212
Playlists,
@@ -201,14 +219,15 @@ class Episodes extends Table {
201219
SeriesInfos,
202220
Seasons,
203221
Episodes,
222+
WatchHistories,
204223
],
205224
)
206225
class AppDatabase extends _$AppDatabase {
207226
AppDatabase([QueryExecutor? e])
208227
: super(
209228
e ??
210229
driftDatabase(
211-
name: 'todo-app',
230+
name: 'another-iptv-player',
212231
native: const DriftNativeOptions(
213232
databaseDirectory: getApplicationSupportDirectory,
214233
),
@@ -227,7 +246,7 @@ class AppDatabase extends _$AppDatabase {
227246
),
228247
);
229248
@override
230-
int get schemaVersion => 8;
249+
int get schemaVersion => 1;
231250
// === PLAYLIST İŞLEMLERİ ===
232251

233252
// Playlist oluştur
@@ -985,6 +1004,26 @@ class AppDatabase extends _$AppDatabase {
9851004
.get();
9861005
}
9871006

1007+
Future<EpisodesData?> findEpisodesById(String episodeId, String playlistId) {
1008+
return (select(episodes)..where(
1009+
(tbl) =>
1010+
tbl.playlistId.equals(playlistId) &
1011+
tbl.episodeId.equals(episodeId),
1012+
))
1013+
.getSingleOrNull();
1014+
}
1015+
1016+
Future<VodStream?> findMovieById(String streamId, String playlistId) async {
1017+
var vodStreamData = await (select(vodStreams)..where(
1018+
(tbl) =>
1019+
tbl.playlistId.equals(playlistId) &
1020+
tbl.streamId.equals(streamId),
1021+
))
1022+
.getSingleOrNull();
1023+
1024+
return vodStreamData != null ? VodStream.fromDriftVodStream(vodStreamData) : null;
1025+
}
1026+
9881027
// Clear operations
9891028
Future<int> clearSeriesData(String seriesId, String playlistId) async {
9901029
await (delete(episodes)..where(
@@ -1066,44 +1105,25 @@ class AppDatabase extends _$AppDatabase {
10661105
await m.createAll();
10671106
},
10681107
onUpgrade: (Migrator m, int from, int to) async {
1069-
if (from < 2) {
1108+
if (from <= 2) {
10701109
// Kategori tablosunu ekle
10711110
await m.createTable(categories);
1072-
}
1073-
if (from < 3) {
1074-
// UserInfo ve ServerInfo tablolarını ekle
10751111
await m.createTable(userInfos);
10761112
await m.createTable(serverInfos);
1077-
}
1078-
if (from < 4) {
1079-
// LiveStreams tablosunu oluştur
10801113
await m.createTable(liveStreams);
1081-
}
1082-
if (from < 5) {
10831114
await m.createTable(vodStreams);
1084-
}
1085-
if (from < 6) {
10861115
await m.createTable(seriesStreams);
1087-
}
1088-
if (from <= 6) {
1089-
// Yeni kolonları varsayılan değerlerle ekle
10901116
await m.addColumn(seriesStreams, seriesStreams.lastModified);
10911117
await m.addColumn(seriesStreams, seriesStreams.backdropPath);
1092-
1093-
// Varolan kayıtlar için varsayılan değerler set etmek isterseniz:
10941118
await customStatement('''
10951119
UPDATE series_streams
10961120
SET last_modified = '0', backdrop_path = '[]'
10971121
WHERE last_modified IS NULL OR backdrop_path IS NULL
10981122
''');
1099-
}
1100-
if (from <= 7) {
1101-
// SeriesInfo tablosu oluştur
11021123
await m.createTable(seriesInfos);
1103-
// Seasons tablosu oluştur
11041124
await m.createTable(seasons);
1105-
// Episodes tablosu oluştur
11061125
await m.createTable(episodes);
1126+
await m.createTable(watchHistories);
11071127
}
11081128
},
11091129
);
@@ -1112,7 +1132,7 @@ class AppDatabase extends _$AppDatabase {
11121132
Future<void> deleteDatabase() async {
11131133
await close(); // Önce bağlantıyı kapat
11141134
final dbFolder = await getApplicationDocumentsDirectory();
1115-
final file = File(p.join(dbFolder.path, 'playlists.db'));
1135+
final file = File(p.join(dbFolder.path, 'playlists.sqlite'));
11161136

11171137
if (await file.exists()) {
11181138
await file.delete();

0 commit comments

Comments
 (0)