ivanisidrowu / KtRssReader

KtRssReader is a Kotlin library for parsing RSS feed.
Apache License 2.0
99 stars 19 forks source link

How to custom data base on RssStandardChannel #90

Open 287138531 opened 1 year ago

287138531 commented 1 year ago

//// < i t e m> // // // .... // other like RssStandardItem /////

287138531 commented 1 year ago

and i use ksp 1.9.0-1.0.12 in android i need rebuild every time before i run app or tips Unresolved reference: XXXParser

and i just need XXXParser.parse("xml...") but seem err in use ksp by com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1

ivanisidrowu commented 1 year ago

Hey, you have to define the custom parser by using annotations, see "Custom Data Parsers" for more information. And don't forget to add the necessary dependencies. Please also provide the error log, it's helpful to debug and understand your issue.

287138531 commented 1 year ago

1.i know custom parser by using annotations,but to many variable and the same,I just need to add some fields.
Whether methods can be added to support this feature? 2.I wonder if ksp isn't already available by
const val KtRssReader = "com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1" const val KtRssReaderAnnotation = "com.github.ivanisidrowu.KtRssReader:annotation:v2.2.1" const val KtRssReaderProcessor = "com.github.ivanisidrowu.KtRssReader:processor:v2.2.1" 3.when i use com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1 rebuild ineffectiveness image 4.when i use com.github.ivanisidrowu.KtRssReader:android:v2.2.1 it can use by rebuild ,but!!!!! when i edit my other code, and run ,also get err image

ivanisidrowu commented 1 year ago

Would you mind providing XML and data classes code snippet that generates JacketRssChannelParser?

ivanisidrowu commented 1 year ago

如果你不介意,我們也可以用中文討論 🙏

287138531 commented 1 year ago

有qq?xml似乎贴不上来

287138531 commented 1 year ago

@RssTag(name = "channel") data class JacketRssChannel( val title: String?, val description: String?, val link: String?, val language: String?, ) : Serializable

287138531 commented 1 year ago

只是很简单的一个测试demo,反正如果只用kotlin这个依赖,是会报错的,非要用android那个依赖,重新编译,能行,但是一旦我改了别的代码, 尝试 run app 的时候,又要重新编译,否则也报错

dev-weiqi commented 1 year ago

@ivanisidrowu

嗨 Ivan 目前初步看起來我們在使用 ksp generate 新的 changed file 的時候,並不會保留舊的 generated files 所以導致舊的 generated files 會被移除

測試手法

  1. 在 sample app 加上 Reporter 提供的 JacketRssChannel
@RssTag(name = "channel")
data class JacketRssChannel(
    val title: String?,
    val description: String?,
    val link: String?,
    val language: String?,
) : Serializable
  1. Run ./gradlew kspDebugKotlin

  2. 查看ksp generated 路徑 sample/build/generated/ksp/debug/kotlin/tw/ktrssreader/generated 應該要有原本 sample 提供的 RssDataParser, RssItemParser, RssOrderDataParser, etc.

看起來要在 KspProcessor ParserGenerator 內的 writeTo() 方法來添加originatingKSFiles參數 keep 原本的 generated files. refs: https://github.com/google/ksp/issues/1231

e.g.

AndroidReaderParserGenerator(
                    rootClassName = classDeclaration.simpleName.asString(),
                    rootClassPackage = classDeclaration.packageName.asString(),
                    logger = logger
                ).generate().writeTo(
                    codeGenerator = codeGenerator,
                    aggregating = false,
                    originatingKSFiles = listOf(classDeclaration.containingFile!!)
                )
dev-weiqi commented 1 year ago

@287138531

因為我們會使用 ksp 來對 JacketRssChannel 做操作, 若有對裡面的結構進行更動 可以試著先將以下路徑的資料夾移除 sample/build/generated/ksp/debug/kotlin/tw/ktrssreader/generated 接著執行 ./gradlew kspDebugKotlin 來重新編譯檔案,速度應該不會太慢 再請你試試這個workaround,確切問題我們會再討論修正,感謝你的回報🙏

287138531 commented 1 year ago

1.按照你上面的要求修改了AndroidReaderParserGenerator,经过测试,清除。。。/kotlin/tw/ktrssreader/generated 文件下所有内容,并执行./gradlew kspDebugKotlin,能生成正确的文件。 2。每次修改我的代码,都需要重新执行2的步骤,这和我最开始说的rebuild的解决方法并没有什么区别 3.其实我在安卓项目中使用,也只需要解析xml的功能,并不需要帮请求网络,以及flow部分的代码。希望单独引进kotlin部分也能实现,目前看你源码,安卓项目必须引入android依赖

287138531 commented 1 year ago

还有这个问题,生成少了,分号 image

@RssTag(name = "channel")
data class JacketRssChannel(
    val title: String?,
    val description: String?,
    val link: String?,
    val language: String?,
    val category: String?,
    @RssTag(name = "item")
    val items: List<JacketRssItems>?
) : Serializable

@RssTag(name = "item")
data class JacketRssItems(
    val title: String?,
    val guid: String?,
    @RssTag(name = "jackettindexer")
    val jackettIndexerId: JackettIndexer?
) :Serializable

@RssTag(name = "jackettindexer")
data class JackettIndexer(
    @RssValue
    val value: String?,
    @RssAttribute(name = "id")
    val id: String?,
): Serializable
287138531 commented 1 year ago

还有个问题,我反复看文档,和源码,也没搞懂,怎么解析下这种类型的面这个标签。。

      <torznab:attr name="category" value="8000" />
      <torznab:attr name="category" value="138096" />
      <torznab:attr name="genre" value="" />
      <torznab:attr name="seeders" value="1" />
      <torznab:attr name="peers" value="1" />
      <torznab:attr name="downloadvolumefactor" value="0" />
      <torznab:attr name="uploadvolumefactor" value="1" />
ivanisidrowu commented 1 year ago

@dev-weiqi 好,謝謝幫忙回答 🙏

ivanisidrowu commented 1 year ago

@287138531 試試看用這個

@RssTag(name = "torznab:attr")
data class Torznab(
   @RssAttribute(name = "name")
   val name: String,
   @RssAttribute(name = "value")
   val value: Long,
)
287138531 commented 1 year ago

image image 基本上我都试过了,都是报错

ivanisidrowu commented 1 year ago

感謝你的回報,我們會再討論和修正相關問題。🙇‍♂️