Feat/publisher studio#269
Conversation
…tor publishing system - Standardize content discovery, resolution, and acquisition across multiple sources (GitHub, ModDB, CNCLabs, AODMaps). - Introduce Creator Publishing system with self-hosted JSON catalogs and subscriptions. - Redesign Downloads browser with publisher-specific filters and sidebar navigation. - Implement Playwright-based scraping for robust web discovery. - Extensive documentation and architectural flowcharts for the new system.
|
Important Review skippedToo many files! This PR contains 229 files, which is 79 over the limit of 150. 📒 Files selected for processing (229)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…nto ui/downloads
c531c3c to
456cac3
Compare
Code Review SummaryStatus: No NEW Issues Found | Recommendation: Review existing comments OverviewThis PR is substantial with 100 changed files and adds the new Publisher Studio feature. Due to the large size (diff exceeded API limits), I reviewed a representative sample of the most critical files and changes. Existing Comments: There are already 146 active inline comments on this PR covering various issues. Review ScopeI reviewed the following areas:
FindingsNo NEW issues were found beyond the existing 146 inline comments already present on this PR. The codebase demonstrates:
Notable Positive Observations
Files ReviewedReviewed a representative sample including:
RecommendationPlease review and address the existing 146 inline comments on this PR before merging. These cover the known issues, and no additional critical problems were identified during this review. |
| } | ||
|
|
||
| // 2. Export Catalog (Now includes new URLs) | ||
| UploadStatusMessage = "Generatng catalog..."; |
There was a problem hiding this comment.
typo: Generatng should be Generating
| UploadStatusMessage = "Generatng catalog..."; | |
| UploadStatusMessage = "Generating catalog..."; |
Prompt To Fix With AI
This is a comment left during a code review.
Path: GenHub/GenHub/Features/Tools/ViewModels/PublishShareViewModel.cs
Line: 468
Comment:
typo: `Generatng` should be `Generating`
```suggestion
UploadStatusMessage = "Generating catalog...";
```
How can I resolve this? If you propose a fix, please make it concise.| PublisherProfileViewModel = new GenHub.Features.Tools.ViewModels.PublisherProfileViewModel(CurrentProject, this, _hostingProviderFactory!, _logger); | ||
| PublisherProfileViewModel.RefreshConnectionStatus(); | ||
| ContentLibraryViewModel = new GenHub.Features.Tools.ViewModels.ContentLibraryViewModel(CurrentProject, SelectedCatalog!, this, _logger, _dialogService); |
There was a problem hiding this comment.
null-forgiving operators used on potentially null values - _hostingProviderFactory! (line 351) and SelectedCatalog! (line 353) can be null but are being force-unwrapped. Check these values before use or handle potential nulls.
Prompt To Fix With AI
This is a comment left during a code review.
Path: GenHub/GenHub/Features/Tools/ViewModels/PublisherStudioViewModel.cs
Line: 351-353
Comment:
null-forgiving operators used on potentially null values - `_hostingProviderFactory!` (line 351) and `SelectedCatalog!` (line 353) can be null but are being force-unwrapped. Check these values before use or handle potential nulls.
How can I resolve this? If you propose a fix, please make it concise.
Overview
This PR implements the Publisher Studio, a tool and underlying infrastructure that enables content creators to build, manage, and publish their own content catalogs without manual JSON editing. It introduces a decentralized 3-tier URL architecture designed for high availability, content stability, and a seamless user subscription experience.
Features
🛠️ Publisher Studio Tool
🏗️ 3-Tier URL Architecture
publisher.jsonproviding publisher identity and catalog pointers.catalog.jsonindexing content items and their releases.🌐 Decentralized Hosting Integration
⚙️ Content Pipeline Enhancements
GenericCatalogDiscovererautomatically fetches and parses subscribed catalogs.GenericCatalogResolvergeneratesContentManifestblueprints dynamically from catalog metadata.GenericCatalogManifestFactoryhandles automated SHA256 hashing and storage in the Content-Addressable Storage system.CrossPublisherDependencyResolverdetects and prompts for missing dependencies across different publishers.🎨 UI & UX Integration
Greptile Summary
This PR successfully implements the Publisher Studio feature, providing creators with a comprehensive tool for building, managing, and publishing content catalogs without manual JSON editing. The implementation introduces a well-architected 3-tier URL system (Definition → Catalog → Artifacts) designed for high availability and content stability.
Key Achievements
GenericCatalogDiscoverer,GenericCatalogResolver, andGenericCatalogManifestFactoryenable automatic content discovery from any subscribed publisherCrossPublisherDependencyResolverdetects and prompts for missing dependencies across different publishersIssues Found
PublishShareViewModel.cshas "Generatng" instead of "Generating"PublisherStudioViewModel.csuse null-forgiving operators (!) on values that could be null (_hostingProviderFactoryandSelectedCatalog)DropboxHostingProvidercreatesHttpClientmanually (line 44) - already noted in previous review, implementsIDisposablebut should ideally useIHttpClientFactoryArchitecture Highlights
The 3-tier URL architecture is well-designed:
The content pipeline follows a clean separation of concerns with discoverers, resolvers, and manifest factories, making it extensible for future publishers.
Confidence Score: 4/5
Important Files Changed
HttpClientcleanup (already noted in previous review thread).Sequence Diagram
sequenceDiagram participant Creator as Content Creator participant PS as Publisher Studio participant HP as Hosting Provider participant User as End User participant GH as GenHub Client participant Disc as GenericCatalogDiscoverer participant Res as GenericCatalogResolver participant Fac as GenericCatalogManifestFactory Note over Creator,PS: Creator Publishing Flow Creator->>PS: Create Project & Add Content PS->>PS: Build catalog.json PS->>PS: Validate Catalog Creator->>PS: Upload to Hosting PS->>HP: Upload Artifacts (Tier 3) HP-->>PS: Return Artifact URLs PS->>PS: Update catalog with URLs PS->>HP: Upload catalog.json (Tier 2) HP-->>PS: Return Catalog URL PS->>HP: Upload publisher.json (Tier 1) HP-->>PS: Return Definition URL PS-->>Creator: Share Subscription Link Note over User,GH: User Subscription Flow User->>GH: Click genhub://subscribe?url=... GH->>HP: Fetch publisher.json HP-->>GH: Return Definition GH->>GH: Store Subscription GH->>Disc: Discover Content Disc->>HP: Fetch catalog.json HP-->>Disc: Return Catalog Disc-->>GH: Return Content Items Note over User,Fac: User Installation Flow User->>GH: Install Content GH->>Res: Resolve Content Res->>HP: Download Artifact (Tier 3) HP-->>Res: Return Archive Res->>Res: Extract Files Res->>Fac: Create Manifest Fac->>Fac: Compute SHA256 Hashes Fac->>Fac: Configure Installation Fac-->>GH: Return ContentManifest GH->>GH: Install to Game ProfileLast reviewed commit: 456cac3